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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 04.07.2011, 18:21
Korchy вне форума Посмотреть профиль Отправить личное сообщение для Korchy Найти все сообщения от Korchy
  № 1  
Ответить с цитированием
Korchy
 
Аватар для Korchy

Регистрация: May 2011
Сообщений: 301
Записей в блоге: 2
По умолчанию Как правильно вращать спрайт вокруг центра?

Как правильно вращать спрайт вокруг центра, чтобы в его чайлдах трансформация тоже отражалась адекватно?
Например есть два спрайта: желтый круг и желтая окружность. Оба 50х50. Оба помещены в центр сцены. Желтый круг - чайлд сцены, желтая окружность - чайлд желтого круга. Поворачиваю круг на 90 градусов вокруг его центра. Он поворачивается правильно, но за счет того (насколько я понял) что матрица считается для левого верхнего угла, появляется смещение, которое наследует его чайлд (окружность) и за счет этого она убегает в сторону. На левой части рисунка показано, как они располагались до вращения, на правой - после. Как компенсировать появляющееся смещение?
Вращение делается переносом центра спрайта в 0, поворотом, возвращением обратно:
Код AS3:
 
Krug.RotateAround(Krug.GetPosition(),new pNumber(90),true);
 
		internal function RotateAround(Axis:Vector2,Angle:pNumber,Once:Boolean):Boolean {
			var End:Boolean = Once;
			var MoveVector:Vector2 = new Vector2();
			Vector2.Vec2Subtract(Axis,new Vector2(0.0,0.0),MoveVector);
			var matrix:Matrix = new Matrix();
			matrix.identity();
			matrix.translate(MoveVector.x,MoveVector.y);
			CountWorldMatrix(null,matrix,null);
			var RotAngle:Number = Angle.v;
			if(Once==false) {
 
			}
			RotAngle *= Math.PI/180.0;
			var Rot:Matrix = new Matrix();
			Rot.identity();
			Rot.rotate(RotAngle);
			CountWorldMatrix(null,Rot,null);
			matrix.identity();
			matrix.translate(Axis.x,Axis.y);
			CountWorldMatrix(null,matrix,null);
			return End;
		}
CountWorldMatrix - умножение матрицы объекта на передаваемую
pNumber - переопределенный Number
Vector2 - переопределенный Point
GetPosition() - координаты центра спрайта в системе координат сцены
Изображения
 


Последний раз редактировалось Korchy; 04.07.2011 в 18:24.
Старый 04.07.2011, 18:24
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 2  
Ответить с цитированием
goodguy
Banned

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
У страйта нет центра. Есть точка регистрации. Чтобы объекты вращались адекватно, нужно добавлять их в соответствующие позиции. Например, для круга 50х50, координаты х и у должны быть -25, -25. Т.е. так, чтобы центр круга, располагался ровно в точке регистрации спрайта (ну или другого DisplayObjectContainer'а)

Старый 04.07.2011, 19:07
Korchy вне форума Посмотреть профиль Отправить личное сообщение для Korchy Найти все сообщения от Korchy
  № 3  
Ответить с цитированием
Korchy
 
Аватар для Korchy

Регистрация: May 2011
Сообщений: 301
Записей в блоге: 2
Цитата:
Сообщение от goodguy Посмотреть сообщение
Например, для круга 50х50, координаты х и у должны быть -25, -25. Т.е. так, чтобы центр круга, располагался ровно в точке регистрации спрайта (ну или другого DisplayObjectContainer'а)
С этого момента поподробнее пожалуйста. Почему "минус" 25 ? В момент создания спрайта его локальная система координат будет совпадать с глобальной т.е. левый верхний угол находиться в точке 0,0 и единичная матрица трансформации. Вектор совпадающий с центром спрайта тогда будет 25,25.

Старый 04.07.2011, 19:06
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 4  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Вот тут наперекор одному нашему форумному товарищу создали темку в блогах.
__________________
тут я

Старый 04.07.2011, 19:29
Korchy вне форума Посмотреть профиль Отправить личное сообщение для Korchy Найти все сообщения от Korchy
  № 5  
Ответить с цитированием
Korchy
 
Аватар для Korchy

Регистрация: May 2011
Сообщений: 301
Записей в блоге: 2
Цитата:
Сообщение от КорДум Посмотреть сообщение
Вот тут наперекор одному нашему форумному товарищу создали темку в блогах.
Ткните пожалуйста пальцем, прочитал статью, но не нашел ответа на свой вопрос. Я использую метод 3 один в один, выглядит только чуть по разному.

Добавлено через 11 минут
Цитата:
Сообщение от goodguy Посмотреть сообщение
Потому, что сам объект, который помещается в спрайт, тоже имеет свою точку регистрации, в нуле координат. Соответственно, если его поместить в другой дисплей обджект контейнер, их точки регистрации совпадут. Если сместить внутренний дисплей обджект на половину его ширины влево, и на половину высоты вверх, то его центр, окажется в точке регистрации родительского контейнера. С этого момента, при вращении родительского контейнера, внутренний объект будет крутиться вокруг (как бы) своего центра
Я понял о чем вы. Вы предлагаете размещать чайлд-спрайт так, чтобы его центр приходился на 0,0 его родителя. Но я не понимаю, как это поможет решению задачи. Проблема состоит в том, что при вращении спрайта-родителя его матрица вращения вокруг центра меняет не только a,c,b,d но и tx,ty. Это смещение наследуется чайлдом за счет чего он и убегает в сторону.

Цитата:
Сообщение от goodguy Посмотреть сообщение
Не понял откуда такие выводы
Точка регистрации 0,0, спрайт 50х50 - соотв. центр 25,25.

Старый 04.07.2011, 19:14
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 6  
Ответить с цитированием
goodguy
Banned

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Цитата:
Почему "минус" 25 ?
Потому, что сам объект, который помещается в спрайт, тоже имеет свою точку регистрации, в нуле координат. Соответственно, если его поместить в другой дисплей обджект контейнер, их точки регистрации совпадут. Если сместить внутренний дисплей обджект на половину его ширины влево, и на половину высоты вверх, то его центр, окажется в точке регистрации родительского контейнера. С этого момента, при вращении родительского контейнера, внутренний объект будет крутиться вокруг (как бы) своего центра

Цитата:
Вектор совпадающий с центром спрайта тогда будет 25,25.
Не понял откуда такие выводы

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

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

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


 


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


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