Товарищ
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
}