我必须找到具有向上和方向矢量的摄像机的轴和旋转角度(它们彼此垂直)。我有旋转的摄像机的UP和方向矢量的初始和最终位置。我想找到相机旋转的轴和角度。我正在为我的项目使用C#。我是这个3D旋转的新手。如果你发现它们很愚蠢,请原谅我的问题。
答案 0 :(得分:0)
从方向(向前)向量 f 向上向量 u ,您可以通过执行{{3}来获取侧向量 s }( s = fxu )。现在所有三个向量都是正交的。你也应该通过规范它们中的每一个来使它们正交。总之,这些载体形成了标准正交基础。
您现在有两个这样的基础:一个来自您最初的相机方向,另一个来自最终的相机方向。两个基础都可以表示为旋转矩阵。旋转矩阵只是一个3x3矩阵,其中3行分别是:
例如,矩阵:
[[1 0 0]
[0 1 0]
[0 0 1]]
可能是您在启动时的初始摄像机方向,其前向矢量,向上矢量和侧向矢量分别指向正x轴,y轴和z轴。
您现在可以使用此vector cross product将这两个基础(M1和M2)转换为两个单位四元数(Q1和Q2),这会解决潜在的问题,例如除以零。
此时,您有两个单位四元数,表示您的初始和最终相机方向。您现在必须找到将Q1转换为Q2的四元数qT,即:
q2 = qT * q1
q2 * q1^-1 = qT * (q1 * q1^-1) = qT
=> qT = q2 * q1^-1
知道单位四元数的倒数等于其algorithm:
q1^-1 = q1* iif ||q1|| = 1
qT = q2 * q1^-1 = q2 * q1*
还剩下一步:conjugate qT:
angle = 2 * acos(qw)
x = qx / sqrt(1-qw*qw)
y = qy / sqrt(1-qw*qw)
z = qz / sqrt(1-qw*qw)
角度当然是以弧度给出的。计算x,y和z时要注意除以零。当没有旋转或非常小的情况时会发生这种情况,所以你应该测试角度是否> epsilon你会选择epsilon是一个很小的角度(比如1/10度),如果是这样的话就不计算向量。