PDA

Просмотр полной версии : Искажение перспективы


Leo45
27.01.2004, 16:52
Народ, киньте пару ссылок, про построения перспективы (Искажение, точки схода и т.д.)

TTS
27.01.2004, 17:39
x0, y0, z0 - координаты точки в трехмере
R0 - z-координата глаза
Re - расстояние от глаза до экрана
xf, yf - координаты точки схода
xe, ye - координаты центра экрана

K=Re/(R0+z0);
x=xe+K*(x0-xf)+xf;
y=ye+K*(y0-yf)+yf;

x, y - координаты точки на экране

Если мувик в центре и точка схождения там же, то
x=K*x0;
y=K*y0;

И все дела.

Leo45
27.01.2004, 18:39
... Наверно, я неправильно поставил вопрос:
Я делаю куб, который можно врашать, но я знаю только часть законов искажения перспективы и куб получился не-даделанный (см. исходник), и может-быть кто-нибудь знает, где лежит информация об этом.

opex
28.01.2004, 02:05
stop();
// создание 3 масивов с координатами х у z
x = [-50, 50, 50, -50, -50, 50, 50, -50];
y = [50, 50, -50, -50, 50, 50, -50, -50];
z = [-50, -50, -50, -50, 50, 50, 50, 50];
//смещаем главный слой для того чтобы куб был в центре
_root._x = 150;
_root._y = 150;
// глубина ну дает искожение эфект горизонта
s = 200;
// углы поворота
pX = 0.1;
pY = -0.2;
_root.onEnterFrame = function() {
pX = -(0-_ymouse)/50;
pY = (0-_xmouse)/50;
// чистим главный уровень
_root.clear();
//запускаем цикл для обновление координат прошета их новых положений
for (i=0; i<8; i++) {
r = Math.PI/180;
// поворот вокруг оу
ky = y[i]*Math.cos(pX*r)-z[i]*Math.sin(pX*r);
//поворот вокруг ох
kx = x[i]*Math.cos(pY*r)+(y[i]*Math.sin(pX*r)+z[i]*Math.cos(pX*r))*Math.sin(pY*r);
//поворот вокруг oz
kz = -x[i]*Math.sin(pY*r)+(y[i]*Math.sin(pX*r)+z[i]*Math.cos(pX*r))*Math.cos(pY*r);
//сохроняем переменные в масив
x[i] = kx;
z[i] = kz;
y[i] = ky;
}
//стиль линий :)
lineStyle(0, 0xff0000, 100);
//дальше идет рисование сторон куба
//так как их 6 рисуем шесть квадратов
//с помощю точек из масива
// 1
moveTo(x[0]*(s/(s+z[0])), y[0]*(s/(s+z[0])));
lineTo(x[1]*(s/(s+z[1])), y[1]*(s/(s+z[1])));
lineTo(x[2]*(s/(s+z[2])), y[2]*(s/(s+z[2])));
lineTo(x[3]*(s/(s+z[3])), y[3]*(s/(s+z[3])));
lineTo(x[0]*(s/(s+z[0])), y[0]*(s/(s+z[0])));
//2
moveTo(x[4]*(s/(s+z[4])), y[4]*(s/(s+z[4])));
lineTo(x[5]*(s/(s+z[5])), y[5]*(s/(s+z[5])));
lineTo(x[6]*(s/(s+z[6])), y[6]*(s/(s+z[6])));
lineTo(x[7]*(s/(s+z[7])), y[7]*(s/(s+z[7])));
lineTo(x[4]*(s/(s+z[4])), y[4]*(s/(s+z[4])));
//3
moveTo(x[0]*(s/(s+z[0])), y[0]*(s/(s+z[0])));
lineTo(x[4]*(s/(s+z[4])), y[4]*(s/(s+z[4])));
lineTo(x[5]*(s/(s+z[5])), y[5]*(s/(s+z[5])));
lineTo(x[1]*(s/(s+z[1])), y[1]*(s/(s+z[1])));
lineTo(x[0]*(s/(s+z[0])), y[0]*(s/(s+z[0])));
//4
moveTo(x[2]*(s/(s+z[2])), y[2]*(s/(s+z[2])));
lineTo(x[6]*(s/(s+z[6])), y[6]*(s/(s+z[6])));
lineTo(x[7]*(s/(s+z[7])), y[7]*(s/(s+z[7])));
lineTo(x[3]*(s/(s+z[3])), y[3]*(s/(s+z[3])));
lineTo(x[2]*(s/(s+z[2])), y[2]*(s/(s+z[2])));
//5
moveTo(x[0]*(s/(s+z[0])), y[0]*(s/(s+z[0])));
lineTo(x[3]*(s/(s+z[3])), y[3]*(s/(s+z[3])));
lineTo(x[7]*(s/(s+z[7])), y[7]*(s/(s+z[7])));
lineTo(x[4]*(s/(s+z[4])), y[4]*(s/(s+z[4])));
lineTo(x[0]*(s/(s+z[0])), y[0]*(s/(s+z[0])));
//6
moveTo(x[1]*(s/(s+z[1])), y[1]*(s/(s+z[1])));
lineTo(x[2]*(s/(s+z[2])), y[2]*(s/(s+z[2])));
lineTo(x[6]*(s/(s+z[6])), y[6]*(s/(s+z[6])));
lineTo(x[5]*(s/(s+z[5])), y[5]*(s/(s+z[5])));
lineTo(x[1]*(s/(s+z[1])), y[1]*(s/(s+z[1])));
};
вот те кубик смотри

Leo45
28.01.2004, 18:16
opex, спасибо тебе огромное, это именно то, что мне нужно было, но я хочу именно теорию, чтоб потом самому въехать что к чему.