两套3d点

时间:2009-09-03 14:05:29

标签: math 3d geometry coordinates

我有一个关于3d空间中两组点的问题。 我在一个笛卡尔坐标系中用40坐标定义了一个体积, 在另一个具有不同(0,0,0)的坐标系中,我的体积略有不同,也由40个坐标定义。我知道匹配的点集对,我想测量每个点对的差异(欧几里德距离)。 现在1)如何将两个坐标系(相同的比例)相互引用,以及2)如何最好地计算转换以记录两个体积?

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

如果您知道匹配对,那么可以使用伪逆(matlab中的pinv()或numpy)非常简洁地解决这个问题。

  1. 将这些点分成两个数组,A& B,大小为3x40。
  2. 在每个的底部添加一行1,所以 现在尺寸为4x40。
  3. 将B转换为A的4x4矩阵 (包括任何翻译)是A * PINV(B)。
  4. 在(大部分)一般位置有40个点,这甚至可以处理任意比例,旋转或透视变换。

答案 1 :(得分:1)

如果采用定义三角形的三个公共点,则可以通过比较曲面法线之间的角度差来确定将一个变为另一个的旋转变换。你从规模的差异中获得了规模,一旦你有了这两个,翻译就会失去它。

通过将A和B的一个角放在原点来制作AOrigin和BOrigin。你可以通过从A [0]到A [2]中的每一个定义减去A [0]来做到这一点,并对B做同样的事情,即:

AOrigin[1] = A[1] - A[0] // this is vector math - you have to subtract each coordinate individually
AOrigin[2] = A[2] - A[0]
AOrigin[0] = <0 0 0>

BOrigin[1] = B[1] - B[0]
BOrigin[2] = B[2] - B[0]
BOrigin[0] = <0 0 0>

然后你得到单位法线,ANormal和BNormal

ANormal = AOrigin[1] x AOrigin[2]
ANormal = ANormal / |ANormal|
BNormal = BOrigin[1] x BOrigin[2]
BNormal = BNormal / |BNormal|

然后你会发现它们之间的角度是:

acos(ANormal . BNormal)

问题是旋转的轴是什么?通过采用ANormal和BNormal的交叉积,你会发现它。现在,您可以围绕单个轴进行单次旋转,将A转换为与B相同的旋转方向。

下一个技巧是让A和B具有相同的比例,你可以从A和B中取两个点,找到每个点的长度,然后得到那个比例。这就是规模。

看看这是怎么回事?所有这些数学都将出现在任何不错的微积分书中。

答案 2 :(得分:1)

我不确定我理解你问题的第一部分,但是如果你想要一个带有一组点的转换到另一个,这里有一个简单的方法来理解(虽然肯定不是最优雅的)。我将使用你提到的点集,A {1(87,159,28)2(-97,216,15)3(60,237,9)}和B {1'(96,6,35)2'( - 86,62 ,23)3`(71,82,14)}。

我从A

开始
(87,159,28) (-97,216,15) (60,237,9)

并翻译它以将第1点带到原点:

(0,0,0) (-184,57,-13) (-27,78,-19)

然后我围绕z轴旋转以将点2带到x-z平面:

(0,0,0) (-192.6,0,-13) (-48.9,66.5,-19)

然后围绕y轴将点2带到z轴:

(0,0,0) (0,0,193.1) (-15.7,66.5,50.0)

最后再次围绕z轴将点3带到x-z平面:

(0,0,0) (0,0,193.1) (-68.3,0,50.0)

按顺序执行这些步骤,将空间A中的东西带到新空间,称之为C.调用此转换Tca。这些步骤是可逆的 - 调用逆变换Tac。现在用B做同样的事来获得Tcb和Tbc。当它们都在C中时,两组点将匹配。现在将A组设置为B,只需应用Tca然后应用Tbc。要从集合B转到设置A,请应用Tcb,然后应用Tac。