如何在3d空间中的平面上投影平面多边形

时间:2010-03-23 14:04:57

标签: math 3d geometry projection projective-geometry

我想沿着矢量将我的多边形投影到3d空间中的平面。我最好使用单个转换矩阵来做到这一点,但我不知道如何构建这种矩阵。

鉴于

  • 飞机的参数(ax + by + cz + d),
  • 我的Polygon的世界坐标。如标题中所述,我的多边形的所有顶点都位于另一个平面中。
  • 投影我的多边形的方向向量(当前是多边形的平面的法线向量)

目标 -a 4x4变换矩阵,执行所需的投影,

  • 关于如何构建自己的一些见解

更新

感谢您的回答,它按预期工作。

对于发现这一点的人们要谨慎:如果投影平面的平面与投影矢量平行,则分母D将变为(几乎)0,因此为了避免发生奇怪的事情,某种处理方式需要这种特殊情况。我通过检查D< 1e-5,如果是这样,只需沿着挤压矢量转换我的多边形。

1 个答案:

答案 0 :(得分:13)

假设其中一个多边形的顶点为(x0, y0, z0),方向向量为(dx,dy,dz)

投影线上的一点是:(x,y,z) = (x0 + t*dx, y0 + t*dy, z0 + t*dz)

您想要找到此线与平面的交点,因此请将其插入平面方程ax+by+cz+d = 0并求解t:

t = (-a*x0 - b*y0 - c*z0 - d) / (a*dx + b*dy + c*dz)

然后你有了目标顶点:x = x0+dx*t等等。

由于这是仿射变换,因此可以通过4×4矩阵来执行。你应该能够通过将x,y,z的三个方程写为x0,y0,z0的函数并取系数来确定矩阵元素。

例如,对于x:

x = x0 - (a*dx*x0 + b*dx*y0 + c*dx*z0 + d*dx) / D
x = (1 - a*dx/D)*x0 - (b*dx/D)*y0 - (c*dx/D)*z0 - d*dx/D

D = a*dx + b*dy + c*dz是上面的分母。 y和z的工作方式类似。

结果矩阵:

1-a*dx/D    -b*dx/D    -c*dx/D   -d*dx/D
 -a*dy/D   1-b*dy/D    -c*dy/D   -d*dy/D
 -a*dz/D    -b*dz/D   1-c*dz/D   -d*dz/D
    0          0          0         1

(注意:在Direct3D上,这个矩阵应该被转置,因为它使用行向量而不是列向量)。