我在刚体上跟踪 3 个点(3D,xyz),我用它来定义局部坐标系。我正在使用这个局部坐标系的方向(在全局参考系中)来设置 VR 程序中的视图方向。为此,并避免使用欧拉角锁定万向节,我尝试使用四元数来设置视图方向。
我从 3 个点创建一个旋转矩阵,然后使用Wikipedia上描述的这种方法来提取假定的等效四元数。然后我简单地将视图方向设置为计算的四元数。
但是,我观察到的是,当我还应该能够同时看到偏航和滚动的变化时,主要只有 1 个自由度(俯仰)。我已经从旋转矩阵中提取了欧拉角,它除了在万向节锁定之外工作得很好。所以我确信旋转矩阵是可用的,尽管在我的情况下它是不合适的。
我的问题是为什么假定的等效四元数似乎只会改变“俯仰”自由度?
我知道四元数是围绕 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)
任何帮助或想法都会很棒!