algorithm - 需要 3D 旋转算法

标签 algorithm 3d vector rotation

给定两个正交单位向量 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/

相关文章:

c++ - 打印句子短语的错误c++

math - 3D 中圆和弧的边界框

three.js - 如何将自定义着色器 Material 添加到 Three.js 中的 obj 3D 对象

c++ - 如何在一个 vector 中分配多个不同类型的变量或区分其类型

c++ - "move"两个 vector 在一起

用于图像分割的 C++ 库

algorithm - 贝尔曼-福特变体

java - 给定一组点,找到三角形的最大数量

algorithm - 为什么我的选择排序比插入排序慢

c - 如何更改 I/O 格式?