Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Поворот по оси Y вокруг произвольной точки (http://www.flasher.ru/forum/showthread.php?t=195215)

КорДум 02.03.2013 12:44

Поворот по оси Y вокруг произвольной точки
 
Товарищ fish_r давным давно в своем блоге написал много разнообразных способов, как можно вертеть контейнер, относительно произвольной точки. Сейчас передо мной стоит аналогичная задача: нужно вертеть контейнер относительно центра стейджа.

Код AS3:

public function perspective(angle:int):void {
        // судя по всему, в этих преобразованиях с точками проблема
        var globalPoint:Point = localToGlobal(new Point(0, 0));
        var rotationPoint:Point = stage.globalToLocal(globalPoint);
 
        var matrix3D:Matrix3D = _perspectiveContainer.transform.matrix3D;
        matrix3D.appendTranslation(-rotationPoint.x, -rotationPoint.y, 0);
        matrix3D.appendRotation(angle, Vector3D.Y_AXIS);
        matrix3D.appendTranslation(rotationPoint.x, rotationPoint.y, 0);
}

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

_perspectiveContainer относительно стейджа сидит вот в такой последовательности:
stage - container - container - _perspectiveContainer

Второй контейнер находится точно в центре стейджа, а _perspectiveContainer смещен в отрицательные координаты так, чтобы быть всегда в центре экрана.

Обычный rotationY у второго контейнера не подойдет, так как не все его содержимое должно вертеться. Кроме того, не хочется париться с расположением каждого элемента _perspectiveContainer в нужных отрицательных координатах так, чтобы (0, 0) его совпадал с центром стейджа. Поэтому было решено использовать матрицу.

Подскажите пожалуйста, в чем же я ошибся? И может быть есть другой вариант с матрицами?

Добавлено через 41 минуту
Совместными усилиями:
Код AS3:

public function perspective(angle:int):void {
        var rotationPoint:Point = globalToLocal(new Point(stage.stageWidth / 2, 0));
 
        var matrix3D:Matrix3D = new Matrix3D();
        matrix3D.appendTranslation(-rotationPoint.x, -rotationPoint.y, 0);
        matrix3D.appendRotation(angle, Vector3D.Y_AXIS);
        matrix3D.appendTranslation(rotationPoint.x, rotationPoint.y, 0);
        _perspectiveContainer.transform.matrix3D = matrix3D
}



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

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