2010-07-06 9 views
0

Функция D3DXMatrixRotationYawPitchRoll() создает матрицу с заданным углом, шагом и рулоном. Есть ли эквивалентная функция для разработчиков iphone?Есть ли эквивалент D3DXMatrixRotationYawPitchRoll() для разработчиков iphone?

Я нашел прекрасный маленький образец проект для рисования по извилистой дороге или горок here.

Это не много кода, и комментарии, кажется, в основном понятно, но код полагается на несколько DirectX функций, I» m еще не достаточно умный, чтобы воссоздать в C для использования в моем проекте iphone.

Может ли кто-нибудь указать мне в правильном направлении здесь? Мне нужно создать матрицу вращения от значений рыскания, высоты тона, валка.

Эта функция DiRectX подписи заключается в следующем:

 D3DXMATRIX * D3DXMatrixRotationYawPitchRoll(
    __inout D3DXMATRIX *pOut, 
    __in  FLOAT Yaw, 
    __in  FLOAT Pitch, 
    __in  FLOAT Roll 
); 

Есть глу *() эквивалент для этого?


(... часов чтения позже)


Ну, после того, как совсем немного чтения (с большим количеством больше идти), это то, что я собрал:

This сайт был отличной помощью!

Похоже, что мне нужно будет преобразовать 3 эйлеровых углов (это то, что тангаж, крен, рыскание называются) в трех независимых единичных кватернионов:

Qx = [ cos(a/2), (sin(a/2), 0, 0)] 
Qy = [ cos(b/2), (0, sin(b/2), 0)] 
Qz = [ cos(c/2), (0, 0, sin(c/2))] 

, а затем объединить их в один кватернион с:

Qcombined = Qx * Оу * Qz

Тогда я могу преобразовать это в результате «блок» кватернион обратно в виде матрицы вращения, что OPENGL понравится, делая это:

Matrix = [ 1 - 2y2 - 2z2 2xy - 2wz  2xz + 2wy 
       2xy + 2wz 1 - 2x2 - 2z2 2yz - 2wx 
       2xz - 2wy  2yz + 2wx 1 - 2x2 - 2y2 ] 
+0

Для этого вам не нужно использовать кватернионы. Просто постройте три матрицы вращения для осей и умножьте их. –

+0

Не было бы возможности блокировки gimble делать это без кватернионов? (Я все еще пытаюсь создать какой-то мысленный образ того, что здесь происходит) – user360092

+0

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

ответ

0

Ищу: http://en.wikipedia.org/wiki/Rotation_matrix#Three_dimensions

вы должны создать матрицу, составленную по Rz (-roll) * Rx (-pitch) * Ry (рыскания), затем использовать результат вызова glMultMatrix (если вы есть матрицы столбцов мэра) или glMultTransposeMatrix (если у вас есть матрицы-мэры) достаточно, чтобы установить представление. http://www.opengl.org/sdk/docs/man/xhtml/glMultTransposeMatrix.xml http://www.opengl.org/sdk/docs/man/xhtml/glMultMatrix.xml

Смежные вопросы