使用4x4矩阵变换3D平面

时间:2011-10-07 09:39:44

标签: transform 3d plane

我有一个由几个三角形组成的形状,它位于世界空间的某个地方,带有刻度,旋转,平移。我还有一个平面,我想在其上投影(正交)形状。

我可以将形状中每个三角形的每个顶点与对象变换矩阵相乘,以找出它在世界坐标中的位置,然后将此点投影到平面上。

但是我不需要绘制投影,而是想用形状的逆变换矩阵变换平面,然后将所有顶点投影到(逆变换)平面上。因为它只需要我一次转换平面而不是每个顶点。

我的飞机有一个法线(xyz)和一个距离(d)。如何将它与4x4变换矩阵相乘以使其结果正常?

你能创建一个vec4作为xyzd并乘以它吗?或者可以创建一个向量xyz1,然后创建d?

3 个答案:

答案 0 :(得分:25)

您需要将您的飞机转换为不同的表示。一个 N 是正常的, O 是飞机上的任何一个点。你已经知道的正常,这是你的(xyz)。飞机上的一个点也很容易,你的正常 N 乘以你的距离 d

以正常方式通过4x4矩阵转换 O ,这将成为您的新 O 。你需要一个Vector4乘以4x4矩阵,将W分量设置为1(x,y,z,1)。

也用4x4矩阵变换 N ,但将W分量设置为0(x,y,z,0)。将W分量设置为0意味着您的法线不会被翻译。如果您的矩阵由更多只是平移和旋转组成,那么这一步就不那么简单了。你必须乘以矩阵的转置,而不是乘以转换矩阵,而不是Matrix4.Transpose(Matrix4.Invert(Transform)),这里有一个很好的解释为什么{{ 3}}

您现在有一个新的法线向量 N 和一个新的位置向量 O 。但是我想你又想要它以xyzd的形式出现?没问题。和以前一样,xyz是你的正常 N 所剩下的就是计算d。 d是平面与原点之间沿法线向量的距离。因此,它只是 O N 的点积。

你有它!如果你告诉我你正在使用哪种语言,我也很乐意在代码中输入它。

编辑,伪代码:

该平面为vector3 xyznumber d,矩阵为matrix4x4 M

vector4 O = (xyz * d, 1)
vector4 N = (xyz, 0)
O = M * O
N = transpose(invert(M)) * N
xyz = N.xyz
d = dot(O.xyz, N.xyz)

xyzd代表新的飞机

答案 1 :(得分:3)

这个问题有点陈旧,但我想纠正接受的答案 您无需转换平面表示。

如果v=(x,y,z,1)
,任何点p=(a,b,c,d)都位于ax+by+cz+d平面上 它可以写成点积:pt v=0

您正在寻找由您的4x4矩阵p'转换的平面M 出于同样的原因,您必须拥有p't Mv=0

所以p't Mv=pt v以及一些安排p'=M^T p

TLDR :如果p=(a,b,c,d)p' = transpose(inverse(M))*p

答案 2 :(得分:2)

<强>符号

  • n是表示为(1x3)行向量
  • 的法线
  • n'是根据变换矩阵T
  • 的n的变换法线
  • (n|d)是一个平面,表示为(1x4)行向量(n平面的法线和d平面到原点的距离)
  • (n'|d')(n|d)根据变换矩阵T
  • 的变换平面
  • T是(4x4)(仿射)列 - 主变换矩阵(即,将列矢量t变换为t' = T t)。

转换普通n

n' = n adj(T)

转换平面(n | d)

(n'|d') = (n|d) adj(T)

这里, adj 是矩阵的附属物,根据矩阵的逆和行列式定义如下:

T^-1 = adj(T)/det(T)

注意

  • 附件通常不等于变换矩阵T的倒数。如果T包含反射,则det(T)= -1,反转缠绕顺序!

  • 重新规范化n'在数学上不是必需的(但可能在数值上取决于实现),因为缩放由决定因素处理。 感谢Adrian Leonhard。< /强>

  • 您可以直接转换平面,而无需先拆分和重新组合平面(法线和点)。