2012-03-31 110 views
1

我必须通过UP和方向矢量(它们都相互垂直)找到相机的旋转轴和角度。我有旋转相机的UP和方向矢量的初始位置和最终位置。我想找到相机的旋转轴和角度。我正在为我的项目使用C#。我是这个3D旋转的新手。所以如果你发现他们很愚蠢,请原谅我的问题。从初始和最终旋转四元数获得旋转轴

回答

0

从方向(向前)载体˚F和向上矢量ü可以通过(F X US =)执行vector cross product得到侧向量小号。所有三个向量现在都是正交的。你也应该通过对它们中的每一个进行归一化来使它们正交。总之,这些矢量形成了一个标准正交基。

您现在有两个这样的基础:从最初的相机方向和最终的相机方向开始。这两个基础都可以表示为旋转矩阵。旋转矩阵是一个简单的3×3矩阵,其中的3行分别为:

  1. 正向矢量
  2. 向上矢量
  3. 侧向量

例如,基质:

[[1 0 0] 
[0 1 0] 
[0 0 1]] 

可能是您的初始相机方向在启动时与其正向矢量,向上矢量和侧向矢量点g分别朝向正x轴,y轴和z轴。

现在,您可以使用此algorithm将这两个基准(M1和M2)转换为两个单位四元数(Q1和Q2),其中注意潜在的问题,如零除。

此时,您有两个单位四元数表示您的初始和最终摄像机方向。现在,您必须找到转换Q1到Q2的四元数qT的,那就是:

q2 = qT * q1 
q2 * q1^-1 = qT * (q1 * q1^-1) = qT 
=> qT = q2 * q1^-1 

知道,一个单位四元数的倒数等于其conjugate

q1^-1 = q1* iif ||q1|| = 1 
qT = q2 * q1^-1 = q2 * q1* 

有单步左:extracting the axis and angle from quaternion 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度),并且不计算向量是这样的。

+0

非常感谢您的回复。这真的帮了我很多。算法将矩阵转换为四元数有一个小问题。我的软件相机产生了一些向上的和方向的向量,这给出了一个不到一个矩阵的轨迹。当旋转矩阵的轨迹小于1时,旋转轴和角度计算会给出奇怪的值。你知道如何解决这个问题吗? – user1304687 2012-04-06 07:43:57

+0

请参阅第238行的函数:http://java.net/projects/vecmath/sources/svn/content/trunk/src/javax/vecmath/AxisAngle4f.java?rev = 144 如果解决了您的问题,请检查此答案是否合适。 – gsimard 2012-04-10 14:47:11