我有一个由几个三角形组成的形状,它位于世界空间的某个地方,带有刻度,旋转,平移。我还有一个平面,我想在其上投影(正交)形状。
我可以将形状中每个三角形的每个顶点与对象变换矩阵相乘,以找出它在世界坐标中的位置,然后将此点投影到平面上。
但是我不需要绘制投影,而是想用形状的逆变换矩阵变换平面,然后将所有顶点投影到(逆变换)平面上。因为它只需要我一次转换平面而不是每个顶点。
我的飞机有一个法线(xyz)和一个距离(d)。如何将它与4x4变换矩阵相乘以使其结果正常?
你能创建一个vec4作为xyzd并乘以它吗?或者可以创建一个向量xyz1,然后创建d?
答案 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 xyz
和number 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)
xyz
和d
代表新的飞机
答案 1 :(得分:3)
这个问题有点陈旧,但我想纠正接受的答案 您无需转换平面表示。
如果
,任何点都位于平面上
它可以写成点积:
您正在寻找由您的4x4矩阵转换的平面 出于同样的原因,您必须拥有
所以以及一些安排
TLDR :如果p=(a,b,c,d)
,p' = transpose(inverse(M))*p
答案 2 :(得分:2)
<强>符号强>:
n
是表示为(1x3)行向量n'
是根据变换矩阵T
(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。< /强>