Отличия матриц Marmalade SDK (C++) от матриц AS3
Начну серию заметок о особенностях работы и проблемах при использовании Adobe FlasCC.
Речь пойдет о матрицах 2D.
Статья рассчитана для тех, кто использует сочетание:Конечно, это сочетание пока не часто встречается, но с официальным выходом Adobe FlasCC все может изменится.
И так
Отличия есть и они достаточно весомые.
Сразу скажу, что не в курсе природы происхождения этих двух матриц и почему они получились разными. Тем более, на сколько я понял, различных реализаций матриц для C++ достаточно много.
Зачем об этом говорить?
Скажем, если мы используем Adobe FlasCC для компиляции C++ кода, который использует Marmalade SDK, то нам может понадобится передавать команды на модификацию матриц AS3. Например, при порте какого-нибудь движка, нам нужен будет "нижний уровень" для рисования графики (а-ля OpenGL). Вот тут и начнутся проблемы.
Какие отличия?
Отличия почти во всем. Перечислю те функции, которые использовал я:
- translate
- scale
- rotate
- identity
Приступим
1. Matrix.translate
AS3 Classic: Перемещение пикселей tx изображения вправо, а пикселей ty вниз.
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; }
AS3 Classic: Изменение размера изображения, умножение расположения каждого пиксела на величину sx по оси x и sy по оси y.
AS3 для совместимости: Эта функция модифицирует только показатели масштабирования.
3. Matrix.rotate
AS3 Classic: Поворот изображения на угол q, который измеряется в радианах.
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; }
4. Matrix.identity
All: Задает каждому свойству матрицы значение, приводящее к нулевому преобразованию.
Здесь без сюрпризов, все приводится к матрице:
Код:
1 0 0 0 1 0 0 0 1
Надеюсь вам поможет данная информация и сэкономит немного времени.
Всего комментариев 5
Комментарии
03.12.2012 12:16 | |
Цитата:
Зы, identity - это не все к нулю, диагональ должна быть единицами.
|
04.12.2012 12:31 | |
И как впечатления от мармелада? Если не секрет. У нас сишники на работе его использовали, говорят сыроват, и в основном для игр заточен.
|
05.12.2012 12:17 | |
Понятно, спасибо, я своим знакомым ссылку на ваши статьи кину)
|
Последние записи от toFL
- ОЗУ и XML (03.04.2014)
- Отличия матриц Marmalade SDK (C++) от матриц AS3 (29.11.2012)