У меня есть поле, определяемое 8 баллами.Из этих точек я вычисляю оси и создаю матрицу вращения следующим образом:
axis[0], axis[1], axis[2]
mat =
{
axis[0].x axis[1].x axis[2].x 0
axis[0].y axis[1].y axis[2].y 0
axis[0].z axis[1].z axis[2].z 0
0 0 0 1
}
У меня есть определенная матрица вращения:
{
-1 0 0 0
0 0 1 0
0 -1 0 0
0 0 0 1
}
Насколько я знаю, это действительная матрица вращения,Его инверсия равна его транспозиции.
Теперь я хотел бы сохранить эту матрицу как кватернион.Но позже мне понадобится воссоздать матрицу вращения из этого кватерниона.Я считаю, что преобразование из матрицы в кватернион и обратно в матрицу должно быть тождественным преобразованием, и я должен получить ту же матрицу, что и у меня в начале (возможно, с очень небольшими числовыми ошибками).
Но, похоже, это не такбыть так.И SlimDX (C #), и моя собственная математическая библиотека (C ++) возвращают недопустимую матрицу.
Во-первых, я получаю кватернион:
C#: 0, 0, 0.70710676908493, 0
C++: 0, -0.707107, 0, 0
И матрица, созданная из этого кватерниона:
C #:
0 0 0 0
0 0 0 0
0 0 1 0
0 0 0 1
C ++:
0 0 0 0
0 1 0 0
0 0 0 0
0 0 0 1
Почему это не так?
Я также пробовал это: http://cache -www.intel.com / cd / 00/00/29/37 / 293748_293748.pdf но это также дало мне плохие результаты.