Algorithm 需要三维旋转算法

Algorithm 需要三维旋转算法,algorithm,3d,vector,rotation,Algorithm,3d,Vector,Rotation,给定两个正交单位向量A和B,以及两个不同的正交单位向量C和D,我需要3x3方向余弦矩阵或四元数,它将旋转A与C对齐,旋转B与D对齐 这些向量都是3个向量(x,y,z) 我有一个蛮力算法,但我几乎可以肯定有一个更简单的解决方案。我的网络搜索还没有发现 我使用的是C#,但是如果你有C语言、FORTRAN语言或Basic语言的东西,我可以将其转换。或者,我可以用数学写出的术语 该应用程序用于确定航天器所需的方向,以便牢固连接在航天器上的光学设备能够正确对齐以拍照。(必须实现钻孔瞄准方向和光学设备关于钻

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

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

我有一个蛮力算法,但我几乎可以肯定有一个更简单的解决方案。我的网络搜索还没有发现

我使用的是C#,但是如果你有C语言、FORTRAN语言或Basic语言的东西,我可以将其转换。或者,我可以用数学写出的术语

该应用程序用于确定航天器所需的方向,以便牢固连接在航天器上的光学设备能够正确对齐以拍照。(必须实现钻孔瞄准方向和光学设备关于钻孔瞄准的适当旋转,因此需要一次对齐两个矢量。)计算可用于实时感测数据反馈的回路中,且蛮力解决方案太慢。

几乎完整的3d图形代码…检查底部的函数,从

get_align_matrix_f
这是同样的四行诗


同样在matrix中,它可能不会提供从vactor A到C的最短(或直接)路径,因此,如果要设置视觉效果的动画,最好使用quats

我重读了你的问题,下面的答案(虽然是正确的)没有给你想要的。这个链接是关于

因为它们都是正交单位向量,所以您只需要在每个向量上再加一个就可以构造基(使用叉积)。现在有两个基{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}的基来表示每一个向量。事实上,它是从正规基到{A,B,…}的矩阵,上面的M将其转换为{C,D…},然后MN(这里的左乘法)将从你的基到{C,D,…}并提供你想要的旋转

现在,所有向量都用{C,D,…}基表示:(

解决方案是另一个变换矩阵。这个矩阵从{A,B,…}映射到你的主基,并撤消N,也称为逆,表示为N^-1。因此你的最终矩阵是(N^-1)MN。好消息是,因为N是正交的,你只需要它的转置


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

考虑到航天器的成本高达数亿美元,你可能想找一个能在睡梦中做这类事情的人,让他们用代码生成一个防弹优化的解决方案,而不是依赖于描述这里。(除非这只是一个练习。)

此外,你选择的解决方案应该在很大程度上取决于航天器上可用的推进器;你希望旋转使用尽可能少的燃料,这将取决于它们对航天器的本质作用。我假设你已经设置了问题,使一个旋转轴围绕z轴;你能旋转indep吗同样围绕x和y旋转,还是只有一个轴?某些旋转是否比其他旋转更昂贵(例如,由于某些轴的惯性矩不同)


考虑到这些警告,我很犹豫是否给出这样的建议:找到(A x C),将A移到C上并旋转所需的旋转轴(关于沿轴旋转的信息,请参阅维基百科)。然后找出这对B的影响(通过将旋转矩阵乘以B),并计算B和D之间的角度;最后,沿(B x D)旋转轴——此时最好与C轴相同——以修正该差异(给出另一个旋转矩阵).两个矩阵相互关联,瞧,你完成了。

在我知道的原始帖子之后,但如果你也遇到了列/行主键和左/右键混淆问题,如果你想将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;


    }

非常感谢Mark!

您的想法是正确的,但是对这个问题的理解太多了。这是一个卫星系统的详细模拟,具有硬件在回路中的潜力。因此,我们在硬件方面没有太大的花费。而且,我们只对(本模块)感兴趣在需要的方向上,不关心如何到达那里。到达那里确实是一个完全不同的问题,将由一套完全不同的软件来完成,除了您提到的问题之外,它还必须完成一些任务,例如避免将任何敏感传感器指向太阳。下面是经过测试的解决方案:如果a和B是要旋转到D和E上的正交单位向量,D和E也是正交单位向量(注意原始问题中变量名称的变化)然后计算叉积:C=B X A和F=E X D然后需要的旋转矩阵是:DxAx+ExBx+FxCx,DxAy+ExBy+FxCy,DxAz+ExBz+FxCz,DyAx+EyBx+FyCx,DyAy+EyBz+FyCz,DzAx+EzBx+FzCx,DzAy+EzBy+FzCy,DzAz+EzBz+Fz*Cz非常简单,计算速度非常快,没有奇点。