如何高效地在三维空间中旋转和平移一个平面

4
我有一个由法向量(n)和距离(d)(从原点)定义的平面。我想将它转换为一个新的系统。 长方法如下: 1)将距离(d)与法向量(n)相乘,得到一个向量(p) 2)旋转(R)并平移(v)向量(p),得到(p') 3)对(p')进行归一化,得到法向量 4)使用另一种算法找到新平面与原点之间的最小距离(d')
我没有尝试过这个方法,但我认为它应该可以工作。 问题: 难道没有更快的方法来得到n'和d'吗? 如果平移(v)为0,则可以跳过步骤4)。但如果不是0呢?有没有更简单的方法得到新的d'?
3个回答

6

需要注意的是,法向量不一定像点那样进行变换,而距离是到原点的垂直距离,所以你需要计算d' = d + n.v。如果你只是在做平移和旋转,那么可以旋转法向量并计算一个新的垂直距离。但是,如果你的轴比例不同或者进行了常规投影变换,则需要以不同的方式处理。

适用于所有情况的方法是使用齐次坐标,这样你的所有变换都是4x4矩阵,你的点和平面都是4维向量:

point p=(x,y,z)        -> homogeneous (x,y,z,1), equiv. to (x*W, y*W, z*W, W)
plane q=[n=(a,b,c), d] -> homogeneous [a,b,c,d], equiv. to [a*K, b*K, c*K, d*K)

  -> point p is on plane q iff:  p.q=0   (using homogeneous coords, as above) 

通常情况下,您需要将所有变换矩阵相乘得到一个4x4的矩阵T,并将该矩阵用于每个点,以确定其最终变换后的位置。但需要注意的是,您需要使用T的逆转置来变换您的平面坐标。从下面的内容中可以看出,这样可以保持点和平面之间的关系:

point p' = T p
plane q' = (T^-1)^t q

  -> point p' is on plane q' when:  p'.q'=0

  then, note:  p'.q' = p^t T^t (T^-1)^t q = p^t q = p.q
  so:  p'.q'=0  whenever p.q=0

是的,我只做旋转和平移。不知怎么的,我希望能找到一种基于旋转法线或其他方式计算垂直距离的简单方法。但是再说一遍,计算距离并不那么昂贵。谢谢! - Golom

1
n' = n*R^T
d' = d - n*R^T*trans

2
请在您的解决方案中添加一些注释,说明它为什么以及如何解决问题。 - Bhavesh Odedra

1
我将在上面的答案基础上进行扩展,以便人们获得更多细节。给定其法向量为n = [a b c]^T、距离原点的距离d(假设n的大小为1)和齐次点p所定义的平面。

enter image description here

我们可以计算出点p到平面的有向欧几里得距离,具体方法如下。

enter image description here

请注意,如果我们使用可逆转换A来转换p,则变换后点的距离将保持不变,如果我们通过A的逆转置来转换平面。
对于A由3x3旋转R和3x1平移t组成的情况,我们有:

enter image description here

因此,我们有

enter image description here

因此,新常态和d'是什么。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接