我有一个以任何方式定向并位于 3d 空间中任何位置的多边形。我需要将多边形转换为 xy 平面,以便可以在 2d 而不是 3d 中对其执行各种操作(特别是生成跨越多边形边界框的点网格),然后将其转换回来。
问题在于变换后的多边形的方向。如果我只想旋转到平面中,我可以获取多边形法线和 xy 平面之间的角度,并围绕与两者正交的轴旋转(叉积)。但是,我要求多边形的边界框的方向应使边界框的底部(最低 z 值)边缘与 xy 平面共面,无论是在变换之前还是之后。换句话说,边界框平齐地放置在与地面平行的一侧。变换后,该边将平行于 x 轴。这样,无论多边形的方向如何,我在表面上生成的点网格将始终具有与地面平行的行。
我的方法是执行两次轮换;首先绕 z 轴旋转多边形平面与 xy 平面的交线与 x 轴之间的角度。这可确保边界框的底部不会移出 xy 平面。然后,再次绕 x 轴旋转多边形(新)法线与 xz 平面之间的角度。步骤如下:
- 找到多边形平面的方程(从法线)。
- 求多边形平面与 xy 平面的交点。这是 xy 平面上的一条线。
- 求这条线与 x 轴之间的角度。
- 围绕 z 轴将多边形旋转此角度。
- 确定新常态。
- 求新法线与 xy 平面法线之间的角度。
- 围绕 x 轴将多边形旋转此角度。
- 多边形现在应该位于 xy 平面内;使用最大/最小 x 和 y 值生成边界框,生成点网格等,然后将所有内容转换回其开始位置。
我意识到应该组合两次旋转来减少矩阵乘法的次数,但这是通用算法。
我不是图形专家;任何人都可以提供有关这项技术的建议吗?有没有更好的办法?我的方法听起来正确吗?我正在使用 Java 进行开发,并正在考虑使用 Transform3D 类进行旋转。
最佳答案
要处理 3D 多边形,通常会忽略映射的 Z 坐标(这会有效地将平面直接投影到 XY 平面),然后稍后恢复 Z 坐标。
唯一不起作用的情况是原始多边形垂直于 XY 平面,因为生成的映射会退化为一条线。
关于java - 将 3D 多边形旋转到 xy 平面,同时保持方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6023166/