我想沿着矢量将我的多边形投影到3d空间中的平面。我最好使用单个转换矩阵来做到这一点,但我不知道如何构建这种矩阵。
鉴于
目标 -a 4x4变换矩阵,执行所需的投影,
或
更新
感谢您的回答,它按预期工作。
对于发现这一点的人们要谨慎:如果投影平面的平面与投影矢量平行,则分母D将变为(几乎)0,因此为了避免发生奇怪的事情,某种处理方式需要这种特殊情况。我通过检查D< 1e-5,如果是这样,只需沿着挤压矢量转换我的多边形。
答案 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上,这个矩阵应该被转置,因为它使用行向量而不是列向量)。