16

我有一个由几个三角形组成的形状,它位于世界空间中的某个位置,具有缩放、旋转、平移功能。我还有一个平面,我想在上面投影(正交)形状。

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

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

我的飞机有一个法线(xyz)和一个距离(d)。我如何将它与 4x4 变换矩阵相乘,这样它就可以了?

您可以创建一个 vec4 作为 xyzd 并将其相乘吗?或者也许创建一个向量 xyz1 然后用 d 做什么?

4

3 回答 3

26

您需要将平面转换为不同的表示形式。其中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))一个很好的解释。

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

你有它!如果你告诉我你用什么语言做这个,我也很乐意用代码输入。

编辑,在伪代码中:

平面是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代表新飞机

于 2011-10-09T22:02:36.100 回答
9

这个问题有点老了,但我想更正接受的答案。
您不需要转换平面表示。

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

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

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


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

于 2018-01-23T18:14:44.847 回答
2

符号

  • n是表示为 (1x3) 行向量的法线
  • n'是根据变换矩阵变换的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)

注意

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

  • 重新归一化 n' 在数学上不是必需的(但可能在数值上取决于实现),因为缩放由行列式处理。 感谢阿德里安·莱昂哈德。

  • 您可以直接变换平面,而无需先分解和重组平面(法线和点)。
于 2017-08-07T18:01:19.167 回答