我必须找出相机的轴和旋转角度与向上和方向矢量(它们都是垂直的)。我有最初和最后的位置的上升和方向矢量的相机,是旋转。我想找出相机旋转的轴和角度。我在我的项目中使用C#。我是这个3D旋转的新手。如果你觉得这些问题很傻,请原谅我的问题。
发布于 2012-04-03 19:17:44
从方向(前向)向量f和向上向量u可以通过执行向量交叉积 (s =f)得到侧向量s。这三个矢量现在都是正交的。你也应该通过规范它们中的每一个来使它们成为正交的。综合起来,这些向量构成了一个正交基础。
你现在有两个这样的基础:一个来自你最初的相机方向,另一个来自你最后的相机方向。这两个基都可以表示为旋转矩阵。旋转矩阵就是3x3矩阵,其中3行分别是:
例如,矩阵:
[[1 0 0]
[0 1 0]
[0 0 1]]
可能是你的初始相机在开始的方向,它的前向矢量,向上向量和侧向量指向正x轴,y轴和z轴,分别。
现在您可以使用这个M1将这两个基(M2和Q1)转换为两个单位四元数(Q1和Q2),这个算法处理诸如除以零这样的潜在问题。
在这一点上,你有两个单位四元数代表你的初始和最后的相机方向。现在您必须找到四元数qT,它将Q1转换为Q2,即:
q2 = qT * q1
q2 * q1^-1 = qT * (q1 * q1^-1) = qT
=> qT = q2 * q1^-1
知道单位四元数的逆等于它的共轭
q1^-1 = q1* iif ||q1|| = 1
qT = q2 * q1^-1 = q2 * q1*
还有一个步骤:从四元数中提取轴和角 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度),如果是这样的话,就不计算矢量。
https://stackoverflow.com/questions/9953764
复制相似问题