2010-08-31 48 views
2

给定两个正交的单位向量A和B以及两个不同的正交单位向量C和D,我需要3×3方向余弦矩阵或一个将旋转A来对齐C的C的四元数,与D对齐。3D旋转算法需要

这些向量都是3向量(x,y,z)。

我有一个蛮力算法,但我几乎肯定有一个更简单的解决方案。而我的网页搜索还没有透露。我使用C#,但如果你有东西在C,或FORTRAN,或基本(等),我可以将其转换。或者,我可以使用数学上写出的术语。

应用程序正在确定航天器所需的方位,以便与其刚性连接的光学设备将正确对齐以拍摄照片。 (必须获得光学瞄准镜的瞄准方向和光学装置相对于瞄准瞄准镜的适当旋转,因此需要一次校准两个矢量)。该计算可以用于由实时感测数据馈送的环路中,并且蛮力解决方案太慢了。

回答

3

我重读了你的问题,下面的答案(而右)并没有给你你想要的。此链接约为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.您以相同的方式执行此操作。事实上,它是从你的正常基础转化为{A,B,...}的矩阵,而上面的M将它翻译为{C,D ...},那么MN(这里的左乘法)将从你的基础到{C,D,..}并提供你想要的旋转。

所以,现在,所有的矢量的基础{C,d,..} :(表示

的解决方案是又一变换矩阵。从该一个地图{A,B,..}你的最终矩阵是(N^-1)MN,好消息是因为N是正交的,所以你只需要它的转置就可以了。

诀窍是选择你的主要基础,以便你处理的矩阵最漂亮。

+2

下面是测试溶液: 如果A和B将被旋转到 d和E正交单位矢量其也是正交单位矢量 (注意在从原来的问题变量名的改变。) 然后计算交叉乘积:C = BXA和F = EXD 然后所需的旋转矩阵为:Dx * Ax + Ex * Bx + Fx * Cx,Dx * Ay + Ex * By + Fx * Cy,Dx * Az + Ex * Bz + Fx * Cz, Dy * Ax + Ey * Bx + Fy * Cx,Dy * Ay + Ey * By + Fy * Cy,Dy * Az + Ey * Bz + Fy * Cz, Dz * Ax + Ez * Bx + Fz * Cx,Dz * Ay + Ez * By + Fz * Cy,Dz * Az + Ez * Bz + Fz * Cz 非常简单,计算速度快,没​​有奇点。 – 2010-08-31 15:54:13

1

https://alleg.svn.sourceforge.net/svnroot/alleg/allegro_outdated/branches/allegro/src/math3d.c

3D图形几乎完全代码....检查出底部的功能开始..

get_align_matrix_f 

,并在这里不用同为quaterian ...

https://alleg.svn.sourceforge.net/svnroot/alleg/allegro_outdated/branches/allegro/src/quat.c

也在矩阵中,它可能不会给你从vactor A到C的最短(或直接)路径,所以如果你正在制作视觉效果,那么最好使用quats。

1

鉴于宇宙飞船需要花费数亿美元,您可能希望找到能够在睡梦中完成此类事情的人,并要求他们使用代码生成防弹和优化的解决方案,而不是依赖此处的说明。 (除非这只是一个练习。)

另外,您选择的解决方案应该非常重视飞船上可用的推进器;你希望轮换使用尽可能少的燃料,这将取决于它们对宇宙飞船本质上的作用。我假设你已经设置了这个问题,以便一个旋转轴绕着Z轴旋转;你是否可以围绕x和y独立旋转,还是只有另一个轴?有些旋转比其他旋转更昂贵(例如,由于沿某些轴的惯性矩不同)? (A x C),将A移动到C并旋转所需的旋转轴(请参阅维基百科,以便沿轴旋转)。然后找出对B有什么影响(通过将旋转矩阵乘以B)并计算B和D之间的角度;最后,沿着(B×D)轴旋转 - 在这一点上最好与C轴相同 - 来修正这个差异(给出另一个旋转矩阵)。两个矩阵相互交错,瞧,你就完成了。

+0

你的想法是正确的,但是对这个问题的解读太多了。这是对卫星系统的详细模拟,具有硬件在环的潜力。所以我们没有在硬件上花费过多的代价。而且,我们只在需要的方向感兴趣(在本单元中),而不关心如何到达那里。到达那里确实是一个完全不同的问题,并且将由完全不同的一套软件完成,除了您提到的问题之外,还必须执行诸如避免将任何敏感传感器指向太阳的任务。 – 2010-08-31 15:23:03

0

稍后,我知道原来的帖子,但如果您也遇到列/行主要和左/右手混淆问题,如果您想将Mark T的精彩结果编码为WPF,您可以这样做:

static public Matrix3D TwistToNewAxes(Vector3D A, Vector3D B, Vector3D D, Vector3D E) 
    { 
     Vector3D C = Vector3D.CrossProduct(B, A); 
     Vector3D F = Vector3D.CrossProduct(E, D); 

     Matrix3D result = Matrix3D.Identity; 

     result.M11 = D.X * A.X + E.X * B.X + F.X * C.X; 
     result.M21 = D.X * A.Y + E.X * B.Y + F.X * C.Y; 
     result.M31 = D.X * A.Z + E.X * B.Z + F.X * C.Z; 
     result.M12 = D.Y * A.X + E.Y * B.X + F.Y * C.X; 
     result.M22 = D.Y * A.Y + E.Y * B.Y + F.Y * C.Y; 
     result.M32 = D.Y * A.Z + E.Y * B.Z + F.Y * C.Z; 
     result.M13 = D.Z * A.X + E.Z * B.X + F.Z * C.X; 
     result.M23 = D.Z * A.Y + E.Z * B.Y + F.Z * C.Y; 
     result.M33 = D.Z * A.Z + E.Z * B.Z + F.Z * C.Z; 

     return result; 


    } 

非常感谢马克!