三维刚体平移和旋转的python实现

三维刚体平移和旋转的python实现,python,computational-geometry,rotational-matrices,Python,Computational Geometry,Rotational Matrices,我一直在研究如何使用python解决以下问题: 我们有点a,b,c,d,它们构成了一个刚体 某些未知的3D平移和旋转应用于刚体 现在我们知道了a,b,c的坐标 我们要计算d的坐标 到目前为止我所知道的: 由于万向节锁等原因,试图通过“直接”的欧拉角计算来实现这一点似乎是个坏主意 因此,第4步将涉及一个变换矩阵,一旦知道旋转和平移矩阵,使用以下其中一个步骤看起来很容易: 我不能解决的是,在给定a,b,c的“新”坐标的情况下,如何计算旋转和平移矩阵 我可以看到,在一般情况下(非刚体),这

我一直在研究如何使用python解决以下问题:

  • 我们有点a,b,c,d,它们构成了一个刚体
  • 某些未知的3D平移和旋转应用于刚体
  • 现在我们知道了a,b,c的坐标
  • 我们要计算d的坐标
  • 到目前为止我所知道的:

    • 由于万向节锁等原因,试图通过“直接”的欧拉角计算来实现这一点似乎是个坏主意
    • 因此,第4步将涉及一个变换矩阵,一旦知道旋转和平移矩阵,使用以下其中一个步骤看起来很容易:

    我不能解决的是,在给定a,b,c的“新”坐标的情况下,如何计算旋转和平移矩阵


    我可以看到,在一般情况下(非刚体),这是旋转部分,但我认为对于刚体,应该有一些更快的方法,通过使用点计算出一组正交单位向量来直接计算它。

    对于您试图匹配的一组对应点(可能存在扰动)我使用了SVD(奇异值分解),它似乎存在于numpy中

    这种技术的一个例子(甚至在Python中)可以是,但我还没有评估它的正确性

    你要做的是一个“基础变换”或“基础变化”,它将被表示为一个变换矩阵。假设3个已知点不共线,可以通过以下方式创建初始基础:

  • 计算向量:x=(b-a)和y=(c-a)
  • 标准化x(x=x/幅值(x))
  • 将y投影到x上(投影y=x点y*x)
  • 从y中减去投影(y=y-proj_y)
  • 使y正常化
  • 计算z=x交叉y
  • 这将为您提供一个初始的x、y、z坐标基础A。对新点执行相同的操作,您将获得第二个基础B。现在,您需要找到变换T,它将取A中的一个点,并将其转换为B(基础的变化)。那部分很简单。可以反转A以将点变换回法线基础,然后使用B变换为第二个点。因为A是正交的,所以可以将A转置得到逆矩阵。因此,“新的d”等于d*逆(A)*B。(尽管根据您的表示,您可能需要使用B*逆(A)*d。)

    你需要对矩阵有一些熟悉才能得到这些。你对向量和矩阵的表示将告诉你矩阵相乘得到T的顺序(T是逆(A)*B或B*逆(A))

    要根据向量x=(x1,x2,x3),y=(y1,y2,y3),z=(z1,z2,z3)计算基矩阵,将其填充为:

    | x1 y1 z1 |
    | x2 y2 z2 |
    | x3 y3 z3 |
    

    你可以使用仿射矩阵计算“未知3D平移和旋转”矩阵(abc,abc,new,shear=False,scale=False)从中计算,并将其应用于
    d
    谢谢-实际上它看起来像是
    叠加矩阵
    ,在同样的情况下,我想它实际上会对我的情况起作用吗?如果你在回答上面发表评论,我会接受的!接受这一点是因为它提供了一个一般的、高质量的答案,尽管对我问题的评论实际上更直接地解决了我的问题。“假设你的三个已知点不是共面的”,而是共线的,对吗?正确,固定的。我想4点,非共面的,但只有3点是必要的,正如你所纠正的。