Есть ли эквивалент D3DXMatrixRotationYawPitchRoll() для разработчиков iphone?

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

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

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

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

Эта сигнатура функции DirectX такова:

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

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


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


Что ж, после довольно небольшого чтения (а впереди еще много), вот что я собрал:

Этот сайт нам очень помог!

Похоже, мне нужно будет преобразовать 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))]

А затем объедините их в один кватернион с помощью:

Qкомбинированный = Qx * Qy * Qz

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

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

person user360092    schedule 06.07.2010    source источник
comment
Вам не нужно использовать кватернионы для этого. Просто постройте три матрицы вращения для осей и умножьте их.   -  person Axel Gneiting    schedule 06.07.2010
comment
Не было бы возможности блокировки карданного замка без кватернионов? (Я все еще пытаюсь создать какой-то мысленный образ того, что здесь происходит)   -  person user360092    schedule 07.07.2010
comment
Нет, если вы каждый раз восстанавливаете матрицы с трех углов.   -  person Axel Gneiting    schedule 08.07.2010


Ответы (1)


здесь: http://en.wikipedia.org/wiki/Rotation_matrix#Three_dimensions

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

person andijcr    schedule 06.07.2010