3d - 如何有效地旋转和平移 3D 平面

标签 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'?

最佳答案

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

关于3d - 如何有效地旋转和平移 3D 平面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2306665/

相关文章:

ruby-on-rails - 破解 i18n 系统来生成 <p> 标签是个坏主意吗?

android - 即使使用未翻译的字符串,如何在 Android Studio 上签署 APK?

c++ - 使用 openGL 缩放和移动 3d 对象

java - 控制处理中的顺序(HTML 和处理以不同的顺序显示项目!)

c# - 我如何重现这种 3D 效果

c++ - 类(class)的私有(private)成员在我的类(class)实例化期间发生了变化,即使他们不应该

internationalization - 翻译文件中键值的最佳实践

vb.net - vb.net 中的 3D 文件

c++ - 返回指向 vector 中项目的指针(来自迭代器)

c++ - 对象数组