如何在3D中有效地旋转和平移平面

时间:2010-02-21 17:18:38

标签: 3d vector translation rotation plane

我有一个由法线(n)和距离(d)(从原点)定义的平面。我想把它变成一个新的系统。 漫长的道路是这样的: 1)将距离(d)乘以法线(n)得到一个向量(p) 2)旋转(R)并平移(v)矢量(p)得到(p') 3)归一化(p')以获得正常 4)使用另一种算法来找到新平面和原点之间的最小距离(d')

我没试过,但我想它应该可行。 题: 得到n'和d'有没有更快的方法? 如果翻译(v)是0而不是我可以跳过4)。但如果它不是0?是否有更简单的方法来获得新的d'?

2 个答案:

答案 0 :(得分:5)

你需要小心,因为法线不一定像点那样变换,距离是与原点的垂直距离,所以你必须计算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

答案 1 :(得分:0)

n' = n*R^T
d' = d - n*R^T*trans
相关问题