给定两个正交单位向量 A 和 B,以及两个不同的正交单位向量 C 和 D,我需要 3x3 方向余弦矩阵或四元数,它将旋转 A 以与 C 对齐并且旋转 B 以与 D 对齐。
向量都是 3 向量 (x, y, z)。
我有一个蛮力算法,但我几乎可以肯定有一个更简单的解决方案。我的网络搜索还没有显示。
我正在使用 C#,但如果您有 C、FORTRAN 或 Basic(等)语言的内容,我可以将其转换。或者,我可以使用以数学方式写出的术语。
该应用程序正在确定航天器所需的方向,以便刚性连接到航天器上的光学设备能够正确对齐以拍摄照片。 (必须获得视轴方向和光学设备围绕视轴的适当旋转,因此需要同时对齐两个矢量。)计算可以在由实时感测数据馈送的循环中使用,并且蛮力解决方案太慢。
最佳答案
我重读了你的问题,下面的答案(虽然正确)没有给你你想要的。此链接是关于 constructing a 3x3 rotation matrix .
因为它们都是正交单位向量,所以你只需要再分别加一个来构造一个基础(为此使用叉积)。所以现在你有两个基础 {A, B, AxB} 和 {C, D, CxD}。将 {A, B} 移动到 {C, D} 上的旋转会将向量 a1A + a2B + a3(AXB) 重新表示为 b1C + b2D + b3(CxD)。因为它是线性的,所以您只需要知道它在基础上的行为方式(这唯一确定了线性变换)。因此,以 {A, B, ..} 作为我们的基础并让变换为 T,我们看到 T(1, 0, 0) = C, T(0, 1, 0) = D 和 T(0, 0, 1) = CxD。记住 A = (1, 0, 0) 等。但是这个矩阵的列只是 M =(C, D, CxD)
要按原样使用此矩阵,您必须在基础 {A, B, CxD} 中表达每个向量,然后再将其左乘以 M。您可以用相同的方式执行此操作。事实上,N 是从您的正常基础转换为 {A, B, ..} 的矩阵,上面的 M 将其转换为 {C, D...},然后 MN(此处为左乘法)将从您的基础转换到 {C, D, ..} 并提供你想要的旋转。
所以现在,你所有的向量都用基础 {C, D, ..} 表示:(
解决方案是另一个转换矩阵。这一个从 {A, B, ..} 映射到您的主要基础并撤消 N,也称为逆并表示为 N^-1。所以你的最终矩阵是 (N^-1)MN。好消息是,因为 N 是正交的,所以您只需要它是转置的。
诀窍是选择你的主要基础,这样你处理最多的矩阵就很漂亮。
关于algorithm - 需要 3D 旋转算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3605591/