2013-08-18 3 views
1

Предположим, у меня есть 2 матрицы:OpenGL - Матричные операции

MatrixA = translation1 * scale1 * rotation1 
MatrixB = translation2 * rotation2 * translation3 

Is MatrixA * MatrixB равна translation1 * scale1 * rotation1 * translation2 * rotation2 * translation3? Или что-то еще рядом?

На самом деле, я просто хочу знать, могу ли я избежать умножения матриц и сохранить некоторый процессор, используя только одну матрицу, а затем сгруппировать математические операции.

Поскольку я планирую создать небольшой пользовательский 2D-движок, который будет построен на LibGDX, включая графические компоненты API, аналогичный тому, что вы можете найти в Android SDK. Во всяком случае, будут некоторые компоненты, те, которые находятся в контейнерах, которые должны будут двигаться, когда их родители перемещаются. Поэтому мне нужна эта измененная арифметика. Я знаю, что это возможно с помощью матриц, но поскольку он должен работать на мобильных устройствах, я не хочу, чтобы он был слишком медленным.

ответ

2

Вы действительно правы. Вы можете избежать наличия нескольких матриц, умножив их цепочку. Однако помните, что Matrix Multiplication некоммутативный, что означает, что изменение порядка операций приведет к двум различным матрицам. Например:

matrixTranslate * matrixRotate приведет к объекту, вращающемуся вокруг точки, в то время как:

matrixRotate * matrixTranslate приведет объект, вращающийся вокруг своей собственной центральной оси. Никакой порядок умножающихся матриц неверен, однако вы должны знать о разных результатах.

Сказав это, на ваш вопрос:

MatrixA = translation1 * scale1 * rotation1 
MatrixB = translation2 * rotation2 * translation3 
MatrixC = MatrixA * MatrixB 

Это 5 операций умножения матриц. Если вы должны были объединить их все вместе:

MatrixC = translation1 * scale1 * rotation1 * translation2 * rotation2 * translation3 

Вы также будете выполнять 5 операций умножения матрицы. Как вы можете видеть, нет никакой разницы в фактических операциях. Вы технически выделяете одну дополнительную матрицу, и в зависимости от вашей реализации и частоты это может иметь значение, но с точки зрения математических операций это одно и то же.

+0

Итак, есть ли реальное преимущество в использовании вычисления цепочки вместо прямого умножения матриц? Является ли матричное умножение медленным? Стоит ли иметь такую ​​структуру кода (я имею в виду, для использования ЦП и памяти на мобильных телефонах)? – Flawyte

+0

@miNde это определенно экономит ваши операции. В вашем коде выше вы выполняете 7 матричных умножений в целом, а при цепочке, которую вы выполняете 6. Я лично всегда использую «цепочку», но не слишком беспокоитесь об этом, если вы не видите хитов производительности. –

+0

На самом деле я еще не тестировал тестирование. Я просто хотел быть исправленным, прежде чем приступать к разработке чего-то с этим. Я не хочу работать ни за что, звучит нормально :) – Flawyte