代码之家  ›  专栏  ›  技术社区  ›  Mark T

需要三维旋转算法

  •  3
  • Mark T  · 技术社区  · 15 年前

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

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

    4 回复  |  直到 15 年前
        1
  •  3
  •   aaronasterling    15 年前

    我重读了你的问题和下面的答案(虽然正确)没有给你你想要的。此链接是关于 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)

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

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

        2
  •  1
  •   iamgopal    15 年前

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

    几乎完整的三维图形代码…检查底部的函数,从。。

    get_align_matrix_f
    

    四行诗也是这样。。。

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

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

        3
  •  1
  •   Rex Kerr    15 年前

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

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

        4
  •  0
  •   Mike Pelton    11 年前

    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;
    
    
        }
    

    推荐文章