给定两个指定方向的 3D 旋转
3D rotation, given two specified directions
我有两个垂直的单位向量,p 和 q;我认为它被嵌入到 3D space 中的一些刚性对象中。我希望旋转对象,使 p 现在指向正 x 轴,q 指向正 y 轴。
我正在使用 C# 编程并使用四元数计算旋转。
如何创建执行所需旋转的四元数?
如果你想象你的四元数的逆运算,那么你就知道点 (1,0,0) 到 p,(0,1,0) 到 q。类似地,点 (0,0,1) 将到达等于 p 和 q 的叉积的点 z。
因此,您实际上拥有逆旋转的矩阵表示。第一列是p,第二列是q,第三列p跨q。
所以你想要的旋转矩阵是由这个矩阵的转置给出的,即第一行是p,第二行是q,第三行是p cross q。
因此,我建议您只需调用一个库例程即可将此矩阵转换为四元数形式。
您可能对此感兴趣document about Doom3解释用于将矩阵转换为四元数的算法 Id 软件 - 包括优化的 x86 汇编代码。
正交矩阵
如果我们有一个矩阵 M,其列 (a,b,c) 形成一个正交集,那么我们知道 a'a = b'b = c'c = 1, a'b = ... = c'a = 0.
所以M'M = I.
如果我们在左边乘以 M,在右边乘以 inv(M),我们发现:
M.M'.M.inv(M) = M.inv(M)
=> M.M'.(M.inv(M)) = M.inv(M) = I
=> M.M' = I
因此,如果我们有正交列,我们也必然有正交行,矩阵 M 称为正交矩阵。
我有两个垂直的单位向量,p 和 q;我认为它被嵌入到 3D space 中的一些刚性对象中。我希望旋转对象,使 p 现在指向正 x 轴,q 指向正 y 轴。
我正在使用 C# 编程并使用四元数计算旋转。 如何创建执行所需旋转的四元数?
如果你想象你的四元数的逆运算,那么你就知道点 (1,0,0) 到 p,(0,1,0) 到 q。类似地,点 (0,0,1) 将到达等于 p 和 q 的叉积的点 z。
因此,您实际上拥有逆旋转的矩阵表示。第一列是p,第二列是q,第三列p跨q。
所以你想要的旋转矩阵是由这个矩阵的转置给出的,即第一行是p,第二行是q,第三行是p cross q。
因此,我建议您只需调用一个库例程即可将此矩阵转换为四元数形式。
您可能对此感兴趣document about Doom3解释用于将矩阵转换为四元数的算法 Id 软件 - 包括优化的 x86 汇编代码。
正交矩阵
如果我们有一个矩阵 M,其列 (a,b,c) 形成一个正交集,那么我们知道 a'a = b'b = c'c = 1, a'b = ... = c'a = 0.
所以M'M = I.
如果我们在左边乘以 M,在右边乘以 inv(M),我们发现:
M.M'.M.inv(M) = M.inv(M)
=> M.M'.(M.inv(M)) = M.inv(M) = I
=> M.M' = I
因此,如果我们有正交列,我们也必然有正交行,矩阵 M 称为正交矩阵。