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

Thi*_*man 16 3d transform plane

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

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

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

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

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

Han*_*esh 25

您需要将平面转换为不同的表示.其中N是法线,O是平面上的任何点.你已经知道的正常,这是你的(xyz).飞机上的一个点也很容易,这是你距离d的正常N倍.

变换Ø以正常方式由4x4矩阵,这将成为新的Ø.您需要使用Vector4与4x4矩阵相乘,将W分量设置为1(x,y,z,1).

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

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

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

编辑,伪代码:

平面是vector3 xyznumber d,矩阵是amatrix4x4 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)
Run Code Online (Sandbox Code Playgroud)

xyzd代表新飞机


Mic*_* M. 5

这个问题有点老了,但我想更正已接受的答案。
您无需转换飞机的表示形式。

任何一点 v =(x,y,z,1) 躺在飞机上 p =(a,b,c,d) 如果 ax + by + cz + d
可以写为点积: pt v = 0

您正在寻找飞机 ' 由您的4x4矩阵转换 中号
出于同样的原因,您必须p't Mv = 0

所以 Mv = pt v 并有一些安排 p'= M ^ T p


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