PDA

Просмотр полной версии : 3d ENGINE - замучался


Stone
07.07.2005, 01:16
отрыл тут у себя этот исходник

####################################################
// -- © 2002-2003 Grigory Ryabov / Nuran.
// -- http://www.flash.plux.ru
// -- EASY 3d ENGINE ORIGINAL
// ####################################################

попробовал немного переделать.
даже не переделать, а просто вынес камеру в отдельный элемент.
ну да не суть.
хочу нарисовать карту. тоесть вид сверху. но у меня получается что на карте отображается все как в зеркале. а карта строится на основании реальных координат объектов (до их паралельных переносов и поворотов и рандеринга). так получается, что во время этих операций происходит инвертация изображения??? или я что-то недопонимаю?

Nirth
07.07.2005, 01:19
обратись к георгию рябову=) думаю он тебе разъяснит

Штрек
07.07.2005, 01:22
обратись к георгию рябову=) думаю он тебе разъяснит
С каких это делов Рябов стал Георгием?????? :p

Nirth
07.07.2005, 01:29
григорию очепятка вышла, извиняюсь

Stone
07.07.2005, 01:53
кроме него никто в 3d преобразованиях не рулит ?(
будем ждать ...

Nirth
07.07.2005, 01:55
в нете есть туча, 3д движков ;) если порыскаешь по гуглу найдешь

Stone
07.07.2005, 02:02
да они все одинаковые, как братья близнеци.

Nirth
07.07.2005, 02:05
ну да точно....один умеет импортировать файлы из 3д макса...другой просто рисует , третий умеет делать 3д текстуры....и в правду на одно лицо ;)

Stone
07.07.2005, 02:18
??? 3д текстуры ???
либо слишком медленно либо некоректно. назвать это текстурированием не могу. или ты видел что-то рельно достойное?

а я про принцип.
а принцип 3d всю дорогу одинаковый
перенос - поворот - проецирование
и формулы идни и теже ...

nuran
07.07.2005, 05:00
что ты не можешь сделать?

Stone
07.07.2005, 11:10
ну начнем с паролельного переноса , для приведения произвольной камеры к стандартной. почему там к кординатам объектов плюсуеются координаты камеры??? рисовал на бумаге - получается должно минусоваться.

nuran
07.07.2005, 12:54
Может немного поможет ...

http://algolist.manual.ru/graphics/3dfaq/articles/25.php

я если честно не понял сути твоего вопроса, давно я уже с 3D не возился, больше года наверно.

Насколько я помню, вначале мы вычисляем матрицу трансформаций произвольной камеры, перемножаем её на все вектора обьекта и ещё вычитаем из координат объекта центр камеры - фокусное расстояние, что-то такое ... голова плохо соображает =)


Ща пороюсь в своих исходниках ...

nuran
07.07.2005, 13:10
Вот так вычисляються вектора камеры ...
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;
}

Как видишь - у меня они вычитаються (operator_subtraction).

Могу исходники скинуть, если надо конечно.

Stone
07.07.2005, 13:17
а вот это не помнишь??? ;)

// прототип преобразования сдвига
vertex.prototype.transpose = function(incX, incY, incZ) {
this.x += incX;
this.y += incY;
this.z += incZ;
};

да и тот код что ты написал в предыдущем посте непонятен, ибо надо исходник смотреть ) так что конечно выкладывай.

nuran
07.07.2005, 13:21
Вот я давненько делал пример камеры несложный, без наворотов так сказать:

_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 - массив с векторами.

nuran
07.07.2005, 13:22
ща выложу ...

nuran
07.07.2005, 13:28
вот исходник ... =\

Stone
07.07.2005, 15:39
ты забыл org.nuran.math.types.Quaternion

nuran
07.07.2005, 16:22
org.nuran.math.types.Quaternion

Stone
07.07.2005, 16:50
пример супер, но
без наворотов так сказать
)))
мне еще проще надо(

может помнишь и так ответишь?
вобщем с переносом мы определились

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;
просто получается куском кода выдернутым из контекста ((( и вставленным не в склад не в лад (
и это конечно не удивительно .