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是平面与原点之间沿法线向量的距离.因此,它只是O和N的点积.
你有它!如果你告诉我你正在使用什么语言,我也很乐意在代码中输入它.
编辑,伪代码:
平面是vector3 xyz
和number 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)
xyz
并d
代表新飞机
这个问题有点老了,但我想更正已接受的答案。
您无需转换飞机的表示形式。
任何一点 躺在飞机上
如果
可以写为点积:
您正在寻找飞机 由您的4x4矩阵转换
。
出于同样的原因,您必须
所以 并有一些安排
TLDR:如果p=(a,b,c,d)
,p' = transpose(inverse(M))*p