Я отслеживаю 3 точки (3D, x y z) на жестком теле, которые я использую для определения локальной системы координат. Я использую эту ориентацию локальной координатной системы (в глобальной системе отсчета), чтобы установить ориентацию вида в программе VR. Чтобы сделать это, и избегайте карданного замка с углами Эйлера, я пытаюсь использовать кватернион, чтобы установить ориентацию вида.Матрица вращения для эквивалентности кватернионов
Я создаю матрицу вращения из трех точек, затем я использую этот метод, описанный на Wikipedia, для извлечения предполагаемого эквивалентного кватерниона. Затем я просто устанавливаю ориентацию вида как вычисленный кватернион.
Однако я наблюдаю, что в основном есть только 1 степень свободы (шаг), когда я также могу одновременно видеть изменения в рыскании и рулоне. Я извлек углы Эйлера из матрицы вращения, и он хорошо работает, за исключением карданного замка. Поэтому я уверен, что матрица вращения пригодна для использования, хотя в моем случае она неправильна.
Мой вопрос: почему предположительный эквивалентный кватернион, по-видимому, только меняет степень свободы?
Я знаю, что кватернион - это поворот вокруг одной оси, однако я думал, что если бы он был получен из матрицы вращения, конечный результат был бы таким же, как с установкой углов Эйлера?
Вот мой код в Python:
import viz
import numpy as np
vec1 = np.array([-0.96803,-0.25022,0.01751],dtype=float)
vec3 = np.array([-0.024815,0.96553,0.07863],dtype=float)
vec4 = np.array([-0.03655,0.07178,-0.99675],dtype=float)
#normalize to unit length
vec1 = vec1/np.linalg.norm(vec1)
vec3 = vec3/np.linalg.norm(vec3)
vec4 = vec4/np.linalg.norm(vec4)
M1 = np.zeros((3,3),dtype=float) #rotation matrix
#rotation matrix setup
M1[:,0] = vec1
M1[:,1] = vec3
M1[:,2] = vec4
#get the real part of the quaternion first
r = np.math.sqrt(float(1)+M1[0,0]+M1[1,1]+M1[2,2])*0.5
i = (M1[2,1]-M1[1,2])/(4*r)
j = (M1[0,2]-M1[2,0])/(4*r)
k = (M1[1,0]-M1[0,1])/(4*r)
viz.MainView.setQuat(i,j,k,r)
Любая помощь или идеи, было бы здорово!
Математика выглядит хорошо для меня. Я немного запутался. Вы сравниваете вращение матрицы с поворотом кватерниона? Если результаты будут одинаковыми, казалось бы, ограниченные степени свободы будут проблемой с вашим выбором матрицы. –
@ bob.sacamento Я просто пытаюсь выразить матрицу вращения как кватернион. Я не уверен на 100%, что это правильный способ его фразы. В коде, который я не опубликовал, я смог определить углы Эйлера из матрицы, поэтому, я думаю, я построил его правильно. Существуют ли другие способы построения матрицы, которая повлияет на вещи? – willpower2727
Это не матрица вращения. Незначительная проблема: строки не ортогональны друг другу (но они близки). Большая проблема: определитель равен -1 (или близко к нему). Как вы сформировали эту матрицу? –