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

Вернуться   Форум Flasher.ru > Блоги > toFL

Рейтинг: 5.00. Голосов: 2.

Отличия матриц Marmalade SDK (C++) от матриц AS3

Запись от toFL размещена 29.11.2012 в 15:49
Обновил(-а) toFL 03.12.2012 в 12:20

Начну серию заметок о особенностях работы и проблемах при использовании Adobe FlasCC.

Речь пойдет о матрицах 2D.

Статья рассчитана для тех, кто использует сочетание:Конечно, это сочетание пока не часто встречается, но с официальным выходом Adobe FlasCC все может изменится.

И так
Отличия есть и они достаточно весомые.
Сразу скажу, что не в курсе природы происхождения этих двух матриц и почему они получились разными. Тем более, на сколько я понял, различных реализаций матриц для C++ достаточно много.

Зачем об этом говорить?
Скажем, если мы используем Adobe FlasCC для компиляции C++ кода, который использует Marmalade SDK, то нам может понадобится передавать команды на модификацию матриц AS3. Например, при порте какого-нибудь движка, нам нужен будет "нижний уровень" для рисования графики (а-ля OpenGL). Вот тут и начнутся проблемы.

Какие отличия?
Отличия почти во всем. Перечислю те функции, которые использовал я:
  1. translate
  2. scale
  3. rotate
  4. identity

Приступим

1. Matrix.translate
AS3 Classic: Перемещение пикселей tx изображения вправо, а пикселей ty вниз.
Код AS3:
public function translate (x:int, y:int):void {
	m.translate(x, y);
}
AS3 для совместимости: Эта функция так же учитывает значение масштаба.
Код AS3:
public function translate (x:int, y:int):void {
	m.tx = (m.a*x)+(m.c*y)+m.tx;
	m.ty = (m.b*x)+(m.d*y)+m.ty;
}
2. Matrix.scale
AS3 Classic: Изменение размера изображения, умножение расположения каждого пиксела на величину sx по оси x и sy по оси y.
Код AS3:
public function scale(x:int, y:int):void {
	m.scale(x, y);
}
AS3 для совместимости: Эта функция модифицирует только показатели масштабирования.
Код AS3:
public function scale(x:int, y:int):void {
	m.a *= sx;
	m.c *= sx;
	m.b *= sy;
	m.d *= sy;
}
3. Matrix.rotate
AS3 Classic: Поворот изображения на угол q, который измеряется в радианах.
Код AS3:
public function rotate(angle:Number):void {
	m.rotate(angle);
}
AS3 для совместимости:
Код AS3:
public function rotate(angle:Number):void {
	// модифицируем диагонали
	rotMatrix.a = rotMatrix.d = Math.cos(angle*PI180);
	rotMatrix.c = -(rotMatrix.b = Math.sin(angle*PI180));
 
	// умножаем матрицу поворота на текущую матрицу			
	newMatrix.a = (rotMatrix.a*m.a) + (rotMatrix.c*m.b);
	newMatrix.b = (rotMatrix.b*m.a) + (rotMatrix.d*m.b);
	newMatrix.c = (rotMatrix.a*m.c) + (rotMatrix.c*m.d);
	newMatrix.d = (rotMatrix.b*m.c) + (rotMatrix.d*m.d);
 
	m.a = newMatrix.a;
	m.b = newMatrix.b;
	m.c = newMatrix.c;
	m.d = newMatrix.d;
}
Где: rotMatrix и newMatrix вспомогательные матрицы для вычислений.

4. Matrix.identity
All: Задает каждому свойству матрицы значение, приводящее к нулевому преобразованию.
Здесь без сюрпризов, все приводится к матрице:
Код:
1 0 0
0 1 0
0 0 1
P.S.
Надеюсь вам поможет данная информация и сэкономит немного времени.
Всего комментариев 5

Комментарии

Старый 02.12.2012 07:06 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
По поводу поворота, чет уже немного поздно, но на певый взгляд, это ж просто транспонированая матрица, нет? Может проще транспонировать оригинальную, повернуть, и еще раз транспонировать, вместо создавать дополнительную?

Зы, identity - это не все к нулю, диагональ должна быть единицами. Т.е.:
1 0 0
0 1 0
0 0 1
вот это identity матрица.
Старый 03.12.2012 12:16 toFL вне форума
toFL
Цитата:
Зы, identity - это не все к нулю, диагональ должна быть единицами.
Да, это я и имел ввиду
Старый 04.12.2012 12:31 PainKiller вне форума
PainKiller
 
Аватар для PainKiller
И как впечатления от мармелада? Если не секрет. У нас сишники на работе его использовали, говорят сыроват, и в основном для игр заточен.
Старый 04.12.2012 19:45 toFL вне форума
toFL
Впечатления положительные. Делаем в основном игры, да. То что он мульти-платформенный - огромный плюс. В сочетании с FlasCC все хорошо. Скомпилированный код работает быстрее чем на AS3.
Старый 05.12.2012 12:17 PainKiller вне форума
PainKiller
 
Аватар для PainKiller
Понятно, спасибо, я своим знакомым ссылку на ваши статьи кину)
 
Последние записи от toFL

 


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


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