如何在三维空间中将一个平面多边形投影到一个平面上

7
我想将我的多边形沿着一个向量投影到三维空间中的平面上。我希望使用单个转换矩阵来完成此操作,但是我不知道如何构建这种类型的矩阵。
已知:
- 平面的参数(ax+by+cz+d) - 我的多边形的世界坐标。正如标题中所述,我的多边形的所有顶点都位于另一个平面上。 - 沿着其投影我的多边形的方向向量(当前为多边形平面的法向量)
目标:
- 一个4x4的变换矩阵,可以执行所需的投影 - 或者一些关于如何自行构建矩阵的见解
更新:
感谢答案,它按预期工作。
对于找到这个问题的人,需要注意:如果投影平面的法线与投影向量平行,则分母D将变为(几乎)0,因此需要处理此特殊情况。我通过检查D < 1e-5,如果是,则沿着延伸向量转换我的多边形来解决这个问题。
1个回答

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

由于这是一种仿射变换,可以通过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中,此矩阵应该被转置,因为它使用行向量而不是列向量。)

非常感谢您提供的完整解决方案。我会立即尝试。 - sum1stolemyname
我已经实现了你的解决方案。然而,我遇到了麻烦,因为我的方向向量是(1|0|0),而平面处于45度角: 侧视图:'| ----> /'其中|是多边形,/是要投影的平面。在这种情况下,a*dx/D = 1,第一列中的另外两个条目为0(dy = dzt = 0)。这导致整个列都为0,有效地将我的多边形缩放为0。我的应用程序不喜欢那样。你知道有什么解决方法吗? - sum1stolemyname
1
@sum1:第一列为零意味着原始顶点的x坐标将被忽略。这是预期的,因为您的投影方向与x轴平行。它不会将您的多边形缩放为0。 - interjay
我猜问题可能出在我的应用程序上,我会调查一下。 - sum1stolemyname
我正在尝试从我的平面多边形创建一个平面,并将一个非平面多边形投影到该平面上。为了进行交集计算,需要将平面和非平面多边形都投影到该平面上,对于我的情况方程是否有任何不同,主要是我在考虑a、b、c(平面法向量)和dx、dy、dz(也是平面法向量)? - knownasilya
@Knownasilya: 那应该可以,多边形是否在同一平面上并不重要。 - interjay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接