отрыл тут у себя этот исходник
####################################################
// -- © 2002-2003 Grigory Ryabov / Nuran.
// -- http://www.flash.plux.ru
// -- EASY 3d ENGINE ORIGINAL
// ####################################################
попробовал немного переделать.
даже не переделать, а просто вынес камеру в отдельный элемент.
ну да не суть.
хочу нарисовать карту. тоесть вид сверху. но у меня получается что на карте отображается все как в зеркале. а карта строится на основании реальных координат объектов (до их паралельных переносов и поворотов и рандеринга). так получается, что во время этих операций происходит инвертация изображения??? или я что-то недопонимаю?
обратись к георгию рябову=) думаю он тебе разъяснит
обратись к георгию рябову=) думаю он тебе разъяснит
С каких это делов Рябов стал Георгием?????? :p
григорию очепятка вышла, извиняюсь
кроме него никто в 3d преобразованиях не рулит ?(
будем ждать ...
в нете есть туча, 3д движков ;) если порыскаешь по гуглу найдешь
да они все одинаковые, как братья близнеци.
ну да точно....один умеет импортировать файлы из 3д макса...другой просто рисует , третий умеет делать 3д текстуры....и в правду на одно лицо ;)
??? 3д текстуры ???
либо слишком медленно либо некоректно. назвать это текстурированием не могу. или ты видел что-то рельно достойное?
а я про принцип.
а принцип 3d всю дорогу одинаковый
перенос - поворот - проецирование
и формулы идни и теже ...
что ты не можешь сделать?
ну начнем с паролельного переноса , для приведения произвольной камеры к стандартной. почему там к кординатам объектов плюсуеются координаты камеры??? рисовал на бумаге - получается должно минусоваться.
Может немного поможет ...
http://algolist.manual.ru/graphics/3dfaq/articles/25.php
я если честно не понял сути твоего вопроса, давно я уже с 3D не возился, больше года наверно.
Насколько я помню, вначале мы вычисляем матрицу трансформаций произвольной камеры, перемножаем её на все вектора обьекта и ещё вычитаем из координат объекта центр камеры - фокусное расстояние, что-то такое ... голова плохо соображает =)
Ща пороюсь в своих исходниках ...
Вот так вычисляються вектора камеры ...
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).
Могу исходники скинуть, если надо конечно.
а вот это не помнишь??? ;)
// прототип преобразования сдвига
vertex.prototype.transpose = function(incX, incY, incZ) {
this.x += incX;
this.y += incY;
this.z += incZ;
};
да и тот код что ты написал в предыдущем посте непонятен, ибо надо исходник смотреть ) так что конечно выкладывай.
Вот я давненько делал пример камеры несложный, без наворотов так сказать:
_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 - массив с векторами.
ты забыл org.nuran.math.types.Quaternion
org.nuran.math.types.Quaternion
пример супер, но
без наворотов так сказать
)))
мне еще проще надо(
может помнишь и так ответишь?
вобщем с переносом мы определились
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;
просто получается куском кода выдернутым из контекста ((( и вставленным не в склад не в лад (
и это конечно не удивительно .
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.