Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   3D точка в 2D (http://www.flasher.ru/forum/showthread.php?t=200003)

Xpb7 28.05.2013 19:04

3D точка в 2D
 
Вложений: 1
Вопрос больше алгебраический. Подскажите, пожалуйста, как получть глобальные 2D координаты клипа [номер1], который вложен в [номер2], если [номер2] подвергся rotationX трансформации. Эти 2D координаты должны визуально соответствовать текущей позиции клипа [номер2].

Для наглядности приложил простенький пример. Искомая 2D точка - красный кружок.

Tails 28.05.2013 19:27

local3DToGlobal()?

Bletraut 28.05.2013 19:27

Так есть же функция в as3, local3DToGlobal(poin3d:Vector3D) вот ей и воспользуейтесь.

Александр Мостовой 29.05.2013 00:37

Если чисто алгебраически, вне контекста вложеных спрайтов, а на уровне абстрактной 3Д точки:
Код AS3:

var point3D:Vector3D = new Vector3D (30, 40, 50);
var center:Point = new Point (stage.StageWidth / 2, stage.stageHeight / 2); //Положение точки схода-камеры. то есть наш уровень глаз откуда расходятся лучи перспективы.
var distance:Number = 100; //расстояние до точки
 
rotatePoint3DAroundAxisX(point3D, Math.PI / 6);
var point2D:Point = get2DPointFrom3Dpoint (point3D, distance, center);
 
private function rotatePoint3DAroundAxisX(point:Vector3D , alpha:Number):void
{
        var  cosA:Number = Math.cos(alpha);
        var  sinA:Number = Math.sin(alpha);
        var xx:Number  = point.x;
        var yy:Number  = point.y * cosA - point.z * sinA;
        var zz:Number  = point.y * sinA + point.z * cosA;
        point.x = xx;
        point.y = yy;
        point.z = zz;
 
};
 
private function get2DPointFrom3Dpoint(point3D:Vector3D, distance:Number, center:Point):Point
{
        //В нашем случае камера перспективы совпадает с направлением Z. Мы как бы смотрим с тыльной стороны оси Z координатной системы вглубь
        var distortionByZ:Number = (point3D.z / distance + 1);
        var point2D:Point = new Point();
        point2D.x = center.x + point3D.x / distortionByZ;
        point2D.y = center.y - point3D.y / distortionByZ;
        return point2D;
 
};

Но фактически вы не увидите ничего объемного на одной точке. Она просто изменит совю координату. Что бы заметить объем нужна гркппа точек. Ну а вообще с такмим штукаи удобнее с матрицами работать, т.к. не нужно складывать много тригонометрии при повороте, а достаточно умножить коэффициенты в матрицах. Вы можете заметить что первая функция по сутити вычисляет детерминант матрицы 2х2


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

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