【问题标题】:How to efficiently rotate and translate a plane in 3D如何有效地旋转和平移 3D 平面
【发布时间】:2010-02-21 17:18:38
【问题描述】:

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

我还没有尝试过,但我想它应该可以工作。 问题: 难道没有更快的方法来获得n'和d'吗? 如果翻译 (v) 为 0,我可以跳过 4)。但如果不是0呢?有没有更简单的方法来获得新的 d'?

【问题讨论】:

    标签: 3d vector translation rotation plane


    【解决方案1】:

    你需要小心,因为法线不一定像点那样变换,距离是到原点的垂直距离,所以你必须计算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 的 inverse transpose 来转换平面坐标。从下面可以看出,这保留了点和平面之间的入射:

    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
    

    【讨论】:

    • 是的,我只做旋转和平移。不知何故,我希望找到一种简单的方法来计算基于旋转法线或其他东西的垂直距离。但是话又说回来,计算距离并不是那么昂贵。谢谢!
    【解决方案2】:
    n' = n*R^T
    d' = d - n*R^T*trans
    

    【讨论】:

    • 请添加一些关于您的解决方案的 cmet,说明它为什么以及如何解决问题
    猜你喜欢
    • 2020-01-01
    • 2011-10-24
    • 2013-04-11
    • 2013-05-23
    • 2011-05-18
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多