2011-05-16 89 views
0

我有一个面向任何方向的多边形,并且定位在三维空间的任何位置。我需要将多边形转换为xy平面,以便我可以在2D中执行各种操作(尤其是在多边形的边界框上生成点网格),然后将其转换回来。将3d多边形旋转到xy平面中,同时保持方向

问题出现在转换后的多边形的方向上。如果我只想旋转到平面中,我可以取多边形的法线与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平面中;使用最大/最小x和y值生成边界框,生成点网格等,然后将所有内容都转换回开始位置。

我意识到应该合并两个旋转来减少矩阵乘法的次数,但这是一般算法。

我不是图形专家;任何人都可以提供有关此技术的建议有没有更好的办法?我的方法听起来是否正确?我正在使用Java进行开发,并正在使用Transform3D类来进行旋转。

+0

我投票结束我的问题。这可能太过本地化,而且我的方法无论如何都或多或少是正确的。它会更适合图形论坛。写这个问题的行为帮助我解决了这个问题。 – 2011-06-01 04:35:42

回答

1

要处理三维多边形,通常只需忽略Z坐标(将平面有效投影到XY平面内),然后稍后恢复Z坐标。

只有当原始多边形垂直于XY平面时,唯一不能正常工作的原因是由此产生的映射退化为一条线。

+0

我看不出有什么帮助。在投影上生成点网格与将其放置在实际多边形上不同。 – 2011-05-16 21:04:26

+0

啊,是的,因为如果你插入了一个新的XY点,你也必须计算新的Z坐标。嗯... – Alnitak 2011-05-16 21:07:07

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