![]() |
|
||||||||||
|
|||||
|
Регистрация: 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
__________________
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, время: 21:41. |
|
|
« Предыдущая тема | Следующая тема » |
|
|