给定两个正交单位向量A和B以及两个不同的正交单位向量C和D,我需要3x3方向的余弦矩阵或一个四元数,它将旋转A以与C对齐,并将旋转B以与D对齐。
向量都是3向量(x,y,z)。
我有一个强力算法,但我几乎可以肯定有一个更简单的解决方案。我的网络搜索还没有找到一个。
我使用的是C#,但如果你有C、FORTRAN语言或Basic (等)语言的东西。我可以转换它。或者,我可以使用数学形式写出的术语。
该应用程序正在确定航天器所需的方向,以便将固定在其上的光学设备正确对准以拍照。(必须获得孔瞄准方向和光学装置围绕孔瞄准的适当旋转,因此需要一次对齐两个矢量。)该计算可用于由实时传感数据馈送的环路中,并且暴力解决方案太慢。
发布于 2010-08-31 10:29:01
我重读了你的问题,下面的答案(虽然正确)并没有给你你想要的。这个链接是关于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)
要按原样使用这个矩阵,您必须在左乘以M之前表示基数{A,B,CxD}中的每个向量。您可以用相同的方法完成此操作。实际上,N是从你的正规基转换为{A,B,..}的矩阵,上面的M转换为{C,D...},然后MN (这里的左乘法)将从你的基转换为{C,D,..},并提供你想要的旋转。
现在,所有的向量都以{C,D,..}为基数表示:(
解决方案是另一个变换矩阵。这个函数从{A,B,..}映射到您的主基,并撤消N,也称为逆,表示为N^-1。所以你的最终矩阵是(N^-1)MN。好消息是,因为N是正交的,你只需要它的转置即可。
诀窍是选择你的主基,这样你处理最多的矩阵是漂亮的。
发布于 2010-08-31 10:28:22
https://alleg.svn.sourceforge.net/svnroot/alleg/allegro_outdated/branches/allegro/src/math3d.c
底部的3d graphics....check out函数的代码几乎完整,从..开始。
get_align_matrix_f这是同样的四元数..。
https://alleg.svn.sourceforge.net/svnroot/alleg/allegro_outdated/branches/allegro/src/quat.c
另外,在矩阵中,它可能不会给你提供从演员A到C的最短(或直接)路径,所以如果你正在制作视觉动画,最好使用quats。
发布于 2010-08-31 22:47:16
考虑到航天器花费了数亿美元,你可能想找一个可以在睡梦中做这类事情的人,让他们用代码生成一个防弹和优化的解决方案,而不是依赖于这里的描述。(除非这只是一个练习。)
此外,你选择的解决方案应该在很大程度上取决于航天器上可用的推进器;你希望旋转使用尽可能少的燃料,这将取决于它们对航天器的本质作用。我假设你已经设置了这个问题,使一个旋转轴围绕z轴;,你也可以围绕x和y独立旋转吗,或者你只有一个轴?是否某些旋转比其他旋转更昂贵(例如,由于沿某些轴的惯性矩不同)?
考虑到这些警告,我很犹豫是否给出这样的建议:查找(A X C),将A移动到C并旋转所需的旋转轴(请参阅维基百科了解沿轴的旋转)。然后计算出这对B有什么影响(通过将旋转矩阵乘以B),并计算B和D之间的角度;最后,沿着(B X D)轴旋转--此时最好与C轴相同--以修复差异(给出另一个旋转矩阵)。将两个矩阵相乘,看,你就完成了。
https://stackoverflow.com/questions/3605591
复制相似问题