|
|
|||||
Регистрация: May 2001
Адрес: Москва
Сообщений: 670
|
ну начнем с паролельного переноса , для приведения произвольной камеры к стандартной. почему там к кординатам объектов плюсуеются координаты камеры??? рисовал на бумаге - получается должно минусоваться.
|
|
|||||
Регистрация: Apr 2003
Адрес: DC
Сообщений: 4,489
|
Может немного поможет ...
http://algolist.manual.ru/graphics/3...rticles/25.php я если честно не понял сути твоего вопроса, давно я уже с 3D не возился, больше года наверно. Насколько я помню, вначале мы вычисляем матрицу трансформаций произвольной камеры, перемножаем её на все вектора обьекта и ещё вычитаем из координат объекта центр камеры - фокусное расстояние, что-то такое ... голова плохо соображает =) Ща пороюсь в своих исходниках ...
__________________
flash/flex/unity |
|
|||||
Регистрация: Apr 2003
Адрес: DC
Сообщений: 4,489
|
Вот так вычисляються вектора камеры ...
basisc = to.operator_subtraction (from).Normalize (); basisa = up.CrossProduct (basisc).Normalize (); basisb = basisc.CrossProduct (basisa); for (var i = 0; i < v.length; i++) { var t:Vector3f = v[i].operator_subtraction (from); finalCameraMatrix.TransformVector (t); t.z -= distance; var perspective_ratio:Number = 1.0 / (t.z / distance + 1.0); v[i].rx = center.x + t.x * perspective_ratio; v[i].ry = center.y - t.y * perspective_ratio; } Могу исходники скинуть, если надо конечно.
__________________
flash/flex/unity |
|
|||||
Регистрация: May 2001
Адрес: Москва
Сообщений: 670
|
а вот это не помнишь???
// прототип преобразования сдвига vertex.prototype.transpose = function(incX, incY, incZ) { this.x += incX; this.y += incY; this.z += incZ; }; да и тот код что ты написал в предыдущем посте непонятен, ибо надо исходник смотреть ) так что конечно выкладывай. |
|
|||||
Регистрация: Apr 2003
Адрес: DC
Сообщений: 4,489
|
Вот я давненько делал пример камеры несложный, без наворотов так сказать:
_quality = "LOW"; import org.nuran.math.types.Vector3f; import org.nuran.math.types.Matrix3f; function lookAt ():Void { basisc = to.operator_subtraction (from).Normalize (); basisa = up.CrossProduct (basisc).Normalize (); basisb = basisc.CrossProduct (basisa); } function updateAnimation ():Void { lookAt (); finalCameraMatrix.e = [basisa.Array (), basisb.Array (), basisc.Array ()]; for (var i = 0; i < v.length; i++) { var t:Vector3f = v[i].operator_subtraction (from); finalCameraMatrix.TransformVector (t); t.z -= distance; var perspective_ratio:Number = 1.0 / (t.z / distance + 1.0); v[i].rx = center.x + t.x * perspective_ratio; v[i].ry = center.y - t.y * perspective_ratio; } clear (); lineStyle (0, 0xffffff, 100); // moveTo (v[0].rx, v[0].ry); lineTo (v[1].rx, v[1].ry); lineTo (v[2].rx, v[2].ry); lineTo (v[3].rx, v[3].ry); lineTo (v[0].rx, v[0].ry); // moveTo (v[5].rx, v[5].ry); lineTo (v[4].rx, v[4].ry); lineTo (v[3].rx, v[3].ry); lineTo (v[2].rx, v[2].ry); lineTo (v[5].rx, v[5].ry); // moveTo (v[4].rx, v[4].ry); lineTo (v[5].rx, v[5].ry); lineTo (v[6].rx, v[6].ry); lineTo (v[7].rx, v[7].ry); lineTo (v[4].rx, v[4].ry); // moveTo (v[7].rx, v[7].ry); lineTo (v[6].rx, v[6].ry); lineTo (v[1].rx, v[1].ry); lineTo (v[0].rx, v[0].ry); lineTo (v[7].rx, v[7].ry); // moveTo (v[0].rx, v[0].ry); lineTo (v[3].rx, v[3].ry); lineTo (v[4].rx, v[4].ry); lineTo (v[7].rx, v[7].ry); lineTo (v[0].rx, v[0].ry); // moveTo (v[6].rx, v[6].ry); lineTo (v[5].rx, v[5].ry); lineTo (v[2].rx, v[2].ry); lineTo (v[1].rx, v[1].ry); lineTo (v[6].rx, v[6].ry); // // Draw axes. // lineStyle (0, 0xff0000, 100); moveTo (v[8].rx, v[8].ry); lineTo (v[9].rx, v[9].ry); // lineStyle (0, 0x00ff00, 100); moveTo (v[10].rx, v[10].ry); lineTo (v[11].rx, v[11].ry); // lineStyle (0, 0x0000ff, 100); moveTo (v[12].rx, v[12].ry); lineTo (v[13].rx, v[13].ry); } var rad:Number = Math.PI / 180.0; var center:Vector3f = new Vector3f (375.0, 200.0, .0); var origin:Vector3f = new Vector3f (.0, .0, .0); var distance:Number = 500.0; var sx:Number = 100.0; var sy:Number = 100.0; var sz:Number = 100.0; var v:Array = new Array (); v[0] = new Vector3f (sx, -sy, sz); v[1] = new Vector3f (sx, sy, sz); v[2] = new Vector3f (sx, sy, -sz); v[3] = new Vector3f (sx, -sy, -sz); v[4] = new Vector3f (-sx, -sy, -sz); v[5] = new Vector3f (-sx, sy, -sz); v[6] = new Vector3f (-sx, sy, sz); v[7] = new Vector3f (-sx, -sy, sz); var sx:Number = 300.0; var sy:Number = 300.0; var sz:Number = 300.0; v[8] = new Vector3f (sx, .0, .0); v[9] = new Vector3f (-sx, .0, .0); v[10] = new Vector3f (.0, sy, .0); v[11] = new Vector3f (.0, -sy, .0); v[12] = new Vector3f (.0, .0, sz); v[13] = new Vector3f (.0, .0, -sz); var finalCameraMatrix:Matrix3f = new Matrix3f (); var basisa:Vector3f = new Vector3f (.0, .0, .0); var basisb:Vector3f = new Vector3f (.0, .0, .0); var basisc:Vector3f = new Vector3f (.0, .0, .0); var from = new Vector3f (80.0, 200.0, -distance); var up = new Vector3f (.0, 1.0, .0); var to = new Vector3f (.0, .0, .0); updateAnimation (); onEnterFrame = function () { var f:Function = Key.isDown; if (f (81)) { Vector3f.TranslateAxis (from, -15, basisc); updateAnimation (); } if (f (69)) { Vector3f.TranslateAxis (from, 15, basisc); updateAnimation (); } if (f (65)) { Vector3f.RotateAxis (from, 2 * rad, basisb, to); updateAnimation (); } if (f (68)) { Vector3f.RotateAxis (from, -2 * rad, basisb, to); updateAnimation (); } if (f (87)) { Vector3f.RotateAxis (from, 2 * rad, basisa, to); updateAnimation (); } if (f (83)) { Vector3f.RotateAxis (from, -2 * rad, basisa, to); updateAnimation (); } if (f (Key.LEFT)) { Vector3f.RotateY (to, 2 * rad, from); updateAnimation (); } if (f (Key.RIGHT)) { Vector3f.RotateY (to, -2 * rad, from); updateAnimation (); } if (f (Key.UP)) { Vector3f.RotateAxis (to, 2 * rad, basisa, from); updateAnimation (); } if (f (Key.DOWN)) { Vector3f.RotateAxis (to, -2 * rad, basisa, from); updateAnimation (); } }; СОбственно сама камера в данном слычае - это набор 2-х точек (вектора взгляда) и вектора "вверх". from = new Vector3f (80.0, 200.0, -distance); up = new Vector3f (.0, 1.0, .0); to = new Vector3f (.0, .0, .0); Функция lookAt - вычисляет новые вектора камеры в соответствии с направляющим вектором и вектором "вверх". v - массив с векторами.
__________________
flash/flex/unity |
|
|||||
Регистрация: Apr 2003
Адрес: DC
Сообщений: 4,489
|
ща выложу ...
__________________
flash/flex/unity |
|
|||||
Регистрация: Apr 2003
Адрес: DC
Сообщений: 4,489
|
вот исходник ... =\
__________________
flash/flex/unity |
|
|||||
Регистрация: May 2001
Адрес: Москва
Сообщений: 670
|
ты забыл org.nuran.math.types.Quaternion
|
|
|||||
Регистрация: Apr 2003
Адрес: DC
Сообщений: 4,489
|
org.nuran.math.types.Quaternion
org.nuran.math.types.Quaternion
__________________
flash/flex/unity |
|
|||||
Регистрация: May 2001
Адрес: Москва
Сообщений: 670
|
пример супер, но
Цитата:
мне еще проще надо( может помнишь и так ответишь? вобщем с переносом мы определились var x:Number=point.x-camera.x; var y:Number=point.y-camera.y; var z:Number=point.z-camera.z; поворот (возьмер по горизонтали, вокруг Y) ну вроде тоже все правельно ??? var __x:Number = x*Math.cos(camera.R*rad)+z*Math.sin(camera.R*rad); var __y:Number = y; var __z:Number = -x*Math.sin(camera.R*rad)+z*Math.cos(camera.R*rad); //camera.R - куда смотрит камера, угол от 0 до 359 а вот с проецированием возникают проблемы ( стандатная формула не подходит sx = cnx+__x*dist/(z+dist); sy = cnx-__y*dist/(z+dist); формула что в твоем примере t.z -= distance; var perspective_ratio:Number = 1.0 / (t.z / distance + 1.0); v[i].rx = center.x + t.x * perspective_ratio; v[i].ry = center.y - t.y * perspective_ratio; просто получается куском кода выдернутым из контекста ((( и вставленным не в склад не в лад ( и это конечно не удивительно . |
Часовой пояс GMT +4, время: 09:22. |
|
« Предыдущая тема | Следующая тема » |
|
|