【发布时间】:2012-03-31 06:53:42
【问题描述】:
我必须使用 UP 和 Direction 矢量(它们都相互垂直)找到相机的轴和旋转角度。我有旋转的相机的 UP 和方向矢量的初始和最终位置。我想找到相机的旋转轴和角度。我在我的项目中使用 C#。我是这个 3D 旋转的新手。所以如果你觉得我的问题很傻,请原谅我的问题。
【问题讨论】:
标签: c# 3d rotation quaternions
我必须使用 UP 和 Direction 矢量(它们都相互垂直)找到相机的轴和旋转角度。我有旋转的相机的 UP 和方向矢量的初始和最终位置。我想找到相机的旋转轴和角度。我在我的项目中使用 C#。我是这个 3D 旋转的新手。所以如果你觉得我的问题很傻,请原谅我的问题。
【问题讨论】:
标签: c# 3d rotation quaternions
从方向(前向)向量f和向上向量u,您可以通过执行vector cross product( s = f x u)。现在所有三个向量都是正交的。您还应该通过对它们中的每一个进行归一化来使它们正交化。总之,这些向量构成一个正交基。
您现在有两个这样的基础:一个来自初始相机方向,一个来自最终相机方向。两个基都可以表示为一个旋转矩阵。旋转矩阵只是一个 3x3 矩阵,其中 3 行分别是:
例如矩阵:
[[1 0 0]
[0 1 0]
[0 0 1]]
可能是您在启动时的初始相机方向,其前向矢量、向上矢量和侧向矢量分别指向正 x 轴、y 轴和 z 轴。
您现在可以使用此algorithm 将这两个基(M1 和 M2)转换为两个单位四元数(Q1 和 Q2),该algorithm 可以处理除以零等潜在问题。
此时,您有两个单位四元数代表您的初始和最终相机方向。您现在必须找到将 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 quaternionqT:
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 度),如果是,则不计算向量是这样的。
【讨论】: