java - 将 3D 多边形旋转到 xy 平面,同时保持方向

标签 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. 多边形现在应该位于 xy 平面内;使用最大/最小 x 和 y 值生成边界框,生成点网格等,然后将所有内容转换回其开始位置。

我意识到应该组合两次旋转来减少矩阵乘法的次数,但这是通用算法。

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

最佳答案

要处理 3D 多边形,通常会忽略映射的 Z 坐标(这会有效地将平面直接投影到 XY 平面),然后稍后恢复 Z 坐标。

唯一不起作用的情况是原始多边形垂直于 XY 平面,因为生成的映射会退化为一条线。

关于java - 将 3D 多边形旋转到 xy 平面,同时保持方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6023166/

相关文章:

javascript - 自透明对象仅从一侧看起来正确

c++ - 四元数3轴旋转

java - String.format 向长/字符串添加点

java - 如何在我的 Activity map 中添加按钮?

java - 无法在Liferay 7中部署Portlet

css - "accelerate, then coast"的动画可以用css实现吗?

java - 我如何正确对齐此文本?

javascript - 用鼠标在 gnuplot 中旋转动画图像

javascript - Three.js - 使用 CubeTextureLoader 在立方体的每个面上创建不同的图像

java - 用java编写一个自定义类Mutex?