Показать сообщение отдельно
Старый 02.03.2013, 12:44
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 1  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
По умолчанию Поворот по оси 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
}
__________________
тут я