Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 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
}
__________________
тут я

Создать новую тему Ответ Часовой пояс GMT +4, время: 21:19.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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