我想将我的多边形沿着矢量投影到 3d 空间中的平面。我最好使用单个变换矩阵来执行此操作,但我不知道如何构建这种类型的矩阵。

给定

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

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

或者

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

更新

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

对发现此内容的人提出警告:如果投影的法线平面与投影向量平行,则分母 D 将变为(几乎)0,因此为了避免发生奇怪的事情,需要对这种特殊情况进行某种处理。我通过检查 D < 1e-5 是否解决了这个问题,如果是,只需沿 hte 挤压向量平移我的多边形即可。

有帮助吗?

解决方案

假设多边形的一个顶点是 (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, , ETC。

由于这是仿射变换,因此可以通过 4x4 矩阵来执行。您应该能够通过将 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 上,应该转置该矩阵,因为它使用行向量而不是列向量。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top