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

如何在3D中高效旋转和平移平面,3d,vector,translation,rotation,plane,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'?你需要小心,因为法线不一定像点

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

我还没试过,但我想它应该能用。 问题: 有没有更快的办法得到n'和d'呢?
如果翻译(v)为0,则我可以跳过4)。但如果不是0呢?有没有更简单的方法获得新的d'?

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

是的,我只做旋转和平移。不知怎的,我希望能找到一种简单的方法,根据旋转法线或其他东西来计算垂直距离。但是,再一次,计算距离是,它没有那么昂贵。谢谢请对您的解决方案添加一些注释,说明其解决问题的原因和方式
n' = n*R^T
d' = d - n*R^T*trans