首先是一些注意事项。您会在网络上和有关该主题的文献中看到许多明显相互矛盾的公式。大多数冲突只是表面上的。有一些是真正的冲突,但那是因为有人计算错误了。问题是没有单一正确的方法可以做到这一点。您需要知道如何使用四元数和矩阵,源如何使用它们,以及如何纠正这些明显的差异。
旋转与变换
您的相机有一个与之关联的参考系,底层空间也是如此。您的矩阵是否表示相机从底层空间到相机方向的物理旋转,或者将底层空间中表示的矢量转换为相机框架的矩阵? (或者其他东西;这里有四个选择。)这些选择是相关的;变换矩阵是旋转矩阵的转置。变换和旋转是共轭运算。同样的概念也适用于四元数。您使用的是变换四元数还是旋转四元数?这些又是相关的概念;一个是另一个的共轭。
Left versus right quaternions
Given a unit quaternion q to transform or rotate a vector v, some use qvq* to transform/rotate the vector, others use q*vq. Which form is correct? Both are. The two forms differ only in whether the unconjugated quaternion is to the left (qvq*) or to the right (q*vq) of the vector to be transformed/rotated.
列向量与行向量
大多数人使用列向量,但有些人使用行向量。这里你遇到了矩阵的左右问题。列向量变换/旋转通过Mv,矩阵位于向量的左侧;行向量通过vM,矩阵在右边。
Impact
阅读文献时必须小心。关于从四元数形成矩阵,您需要注意构造矩阵的非对角线元素时的符号变化。一种配方的加法/减法可能会变为另一种配方的减法/加法。
Left transformation quaternions to row vector transformation matrices
I use left transformation quaternions and transformation matrices, and I represent vectors as row vectors. I also represent a quaternion q as comprising a real scalar part qs and a vectorial imaginary part qv. Given these representations, the computations to generate a matrix from a quaternion are (pseudocode):
// Compute the cosine of the rotation angle.
cost = 2.0*qs*qs - 1.0;
// Construct the diagonal of the matrix:
// T_ii = cost + 2qv_i^2
for (i = 0; i < 3; ++i) {
T[i][i] = cost + 2.0*qv[i]*qv[i];
}
// Construct off-diagonal transformation matrix elements:
// T_ij = 2 (qv_i qv_j - eps_ijk qs qv_k), where eps is the Levi-Civita symbol
for (k = 0; k < 3; ++k) {
i = (k+1)%3;
j = (i+1)%3;
T[i][j] = 2.0*(qv[i]*qv[j] - qs*qv[k]);
T[j][i] = 2.0*(qv[i]*qv[j] + qs*qv[k]);
}
您可能想要扩展这些循环。第一个循环扩展为三个语句,后者扩展为六个语句。你不需要计算i and j在后一个循环的扩展中;循环的扩展使它们的数量固定。
替代表示
上面的这些警告并不像看起来那么糟糕。您需要确保我的陈述与您的一致。事实并非如此的可能性为 50-50。如果不是,只需将分配交换到非对角线元素即可。使用计算T[i][j]
for T[j][i]
,反之亦然。如何判断:
- 从...开始s=1.
- 乘s如果使用旋转四元数而不是变换四元数,则增加 -1。
- 乘s如果您使用右四元数而不是左四元数,则增加 -1。
- 乘s如果使用旋转矩阵而不是变换矩阵,则增加 -1。
- 乘s如果使用行向量而不是列向量,则为 -1。
如果最终值是,请使用我的公式s是 1。如果是 -1,只需将分配交换为T[i][j]
and T[j][i]
。或者你可以将加法改为减法,将减法改为加法。
最后一个问题
当标量部分不接近零时,适用上述计算。如果我们有无限精度的算术,那么它在任何地方都是有效的。您可能需要对非常接近 0 度或 180 度的旋转使用单独的计算。