我有一个任意方向的多边形,并且位于3d空间的任何位置。我需要将多边形转换为xy平面,以便我可以在2d而不是3d上对其执行各种操作(特别是在多边形的边界框上生成点网格),然后将其转换回来。
问题在于变换多边形的方向。如果我只想旋转到平面,我可以采用多边形法线和xy平面之间的角度,并围绕与两者正交的轴(交叉积)旋转。但是,我要求多边形的边界框被定向,使得边界框的底部(最低z值)边缘在变换之前和之后与xy平面共面。换句话说,边界框在与地面平行的一侧齐平地放置。在变换之后,该边缘将与x轴平行。这样,无论多边形的方向如何,我在曲面上生成的点网格将始终具有与地面平行的行。
我的方法是进行两次旋转;首先围绕z轴旋转由多边形平面和xy平面的交点形成的线与x轴之间的角度。这可确保边界框的底部不会移出xy平面。然后,再次围绕x轴旋转多边形(新)法线和xz平面之间的角度。以下是步骤:
我意识到应该组合两个旋转以减少矩阵乘法的数量,但这是一般算法。
我不是图形专家;谁能提供有关这种技术的建议?有没有更好的办法?我的方法听起来是否正确?我正在使用Java进行开发,并且正在考虑使用Transform3D类进行旋转。
答案 0 :(得分:1)
要处理3D多边形,通常只需忽略Z坐标(有效地将平面直接投影到XY平面)作为映射,然后稍后再恢复Z坐标。
唯一不起作用的是原始多边形垂直于XY平面,因为生成的贴图会退化为直线。
答案 1 :(得分:0)
您需要以下矩阵来更改从x0,y0,z0到x1,y1,z1的顶点坐标,并最终进行平移以使原点重合。
// F0 changes x0,y0,z0 to world X,Y,Z
F0[0, 0] = X0.X;
F0[0, 1] = X0.Y;
F0[0, 2] = X0.Z;
F0[1, 0] = Y0.X;
F0[1, 1] = Y0.Y;
F0[1, 2] = Y0.Z;
F0[2, 0] = Z0.X;
F0[2, 1] = Z0.Y;
F0[2, 2] = Z0.Z;
F0[3, 3] = 1.0;
// F1 changes world X,Y,Z to x1,y1,z1
F1[0, 0] = X1.X;
F1[0, 1] = Y1.X;
F1[0, 2] = Z1.X;
F1[1, 0] = X1.Y;
F1[1, 1] = Y1.Y;
F1[1, 2] = Z1.Y;
F1[2, 0] = X1.Z;
F1[2, 1] = Y1.Z;
F1[2, 2] = Z1.Z;
F1[3, 3] = 1.0;
matrix = F1*F0