Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript (http://www.flasher.ru/forum/forumdisplay.php?f=5)
-   -   Искажение перспективы (http://www.flasher.ru/forum/showthread.php?t=54080)

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

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

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, спасибо тебе огромное, это именно то, что мне нужно было, но я хочу именно теорию, чтоб потом самому въехать что к чему.


Часовой пояс GMT +4, время: 15:06.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.