在保持方向的同时将3d多边形旋转到xy平面

时间:2011-05-16 20:43:57

标签: java rotation 3d polygon transformation

我有一个任意方向的多边形,并且位于3d空间的任何位置。我需要将多边形转换为xy平面,以便我可以在2d而不是3d上对其执行各种操作(特别是在多边形的边界框上生成点网格),然后将其转换回来。

问题在于变换多边形的方向。如果我只想旋转到平面,我可以采用多边形法线和xy平面之间的角度,并围绕与两者正交的轴(交叉积)旋转。但是,我要求多边形的边界框被定向,使得边界框的底部(最低z值)边缘在变换之前和之后与xy平面共面。换句话说,边界框在与地面平行的一侧齐平地放置。在变换之后,该边缘将与x轴平行。这样,无论多边形的方向如何,我在曲面上生成的点网格将始终具有与地面平行的行。

我的方法是进行两次旋转;首先围绕z轴旋转由多边形平面和xy平面的交点形成的线与x轴之间的角度。这可确保边界框的底部不会移出xy平面。然后,再次围绕x轴旋转多边形(新)法线和xz平面之间的角度。以下是步骤:

  1. 找到多边形平面的方程式(从法线开始)。
  2. 找到多边形平面和xy平面的交点。这是xy平面中的一条线。
  3. 找到此线与x轴之间的角度。
  4. 围绕z轴以此角度旋转多边形。
  5. 确定新常态。
  6. 找到新法线和xy平面之间的角度。
  7. 围绕x轴以此角度旋转多边形。
  8. 多边形现在应该在xz平面中;使用max / min x和y值生成边界框,生成点网格等,然后将所有内容转换回它开始的位置。
  9. 我意识到应该组合两个旋转以减少矩阵乘法的数量,但这是一般算法。

    我不是图形专家;谁能提供有关这种技术的建议?有没有更好的办法?我的方法听起来是否正确?我正在使用Java进行开发,并且正在考虑使用Transform3D类进行旋转。

2 个答案:

答案 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