Я конвертирую код бывших программистов, написанных на Python, в DirectX, и у меня возникают проблемы с правильной ориентацией угла.
Библиотека Python, которую они используют для импорта и составления матриц вращения: pyquaternion
https://github.com/KieranWynn/pyquaternion/blob/master/pyquaternion/quaternion.py
Это фрагмент кода Python:
q = Quaternion(quaternion)
R = q.rotation_matrix
Мой код на C ++ таков: где q_0 ... q_3 - элементы кватерниона
FXMVECTOR v_quaternion= XMLoadFloat4(&XMFLOAT4(q_0, q_1, q_2, q_3))
viewMatrix = XMMatrixRotationQuaternion(v_quaternion);
Я не разбираюсь в python, но из библиотеки я понимаю, что первый элемент в pyquaternion
- это действительное число, а остальные 3 - значения i
, j
и k
,
Согласно этому документу, структура FXMVECTOR
должна иметь переменные-члены X
, Y
, Z
и W
. Но это не так, потому что он typedef
введен как XMVECTOR
в DirectXmath.h, и я не знаю, в каком порядке мне нужно вводить элементы кватерниона для его построения.
Я проверял оба
FXMVECTOR v_quaternion= XMLoadFloat4(&XMFLOAT4(q_0, q_1, q_2, q_3))
а также
FXMVECTOR v_quaternion= XMLoadFloat4(&XMFLOAT4(q_3, q_0, q_1, q_2))
Излишне говорить, что все мои камеры были ориентированы в совершенно неправильных местах.
Итак, мои 2 вопроса:
Как правильно построить кватернион из представления {Real, I, J, K} в DirectX11
Как правильно преобразовать этот кватернион в матрицу вращения в DirectX
Спасибо,