math - 用于 2D 投影的 3D 模型的最佳旋转

标签 math 3d canvas 2d rotation

我正在寻找一种方法来确定一组顶点的最佳 X/Y/Z 旋转,以便在 2D Canvas 上渲染(使用 X/Y 坐标,忽略 Z)。

我有几个想法,一个是纯粹的蛮力,涉及在场景上执行范围从 0..359(步长为 1 或更多,取决于结果/速度要求)的 3 维循环顶点,测量 X/Y 轴上的最小值/最大值之间的差异,存储最高结果/旋转对并使用最有效的对。

第二个想法是确定欧几里德距离中距离最大的两个点,计算旋转这两个点之间的“路径”以沿 X 轴放置所需的角度(同样,我们忽略了Z 轴,因此结果中的深度无关紧要)然后重复几次。我可以看到的问题是,首先通过重复它,我们可能会用新的旋转覆盖我们之前的旋转,并且原始/后续旋转可能不一定会导致使用最大的 2D 区域。第二个问题是,如果我们使用单次迭代,则会出现同样的问题——相距最远的两个点可能没有其他点沿着相同的“路径”对齐,因此我们可能无法获得二维项目的最佳旋转.

使用第二个想法,也许使用第一个说 3 次迭代,存储所需的旋转角度,并对 3 个进行平均将返回更准确的结果,因为它不仅考虑了单个旋转,而且考虑了前 3 '对'。

请把这些想法分开,给出你自己的见解。我很想看看你们都有什么解决方案,或者你们可以引用我不知道的算法。

最佳答案

我会计算惯性主轴,并取具有最高对应力矩的轴矢量 v。然后我将旋转顶点以将 v 与 z 轴对齐。如果您想了解有关如何进行此操作的更多详细信息,请告诉我。

直觉上,这会找到最难旋转点的轴,即顶点最“展开”的轴。

如果没有具体定义您认为最佳的内容,就无法说出此方法的效果如何。但是,它有一些理想的特性:

  • 如果顶点共面,则此方法是最佳的,因为它始终将该平面与 x-y 平面对齐。

  • 如果顶点排列成一个矩形框,则框的最短尺寸将与 z 轴对齐。

编辑:这里有关于如何实现这种方法的更多详细信息。

首先,为每个顶点分配一个质量。我将在下面讨论如何执行此操作的选项。 接下来,计算顶点集的质心。然后将所有顶点平移质心的 -1 倍,这样新的质心现在是 (0,0,0)。

计算转动惯量张量。这是一个 3x3 矩阵,其条目由您可以在维基百科上找到的公式给出。这些公式仅取决于顶点位置和您分配给它们的质量。

现在您需要对惯性张量进行对角化。因为它是对称正定的,所以可以通过找到它的特征向量和特征值来做到这一点。不幸的是,找到这些的数值算法往往很复杂。最直接的方法需要找到三次多项式的根。然而,找到矩阵的特征值和特征向量是一个极其常见的问题,任何值得一提的线性代数包都会附带可以为你做这件事的代码(例如,开源线性代数包 Eigen 有 SelfAdjointEigenSolver。)你可能也可以在 Internet 上找到专门针对 3x3 案例的轻量级代码。

您现在拥有三个特征向量及其对应的特征值。这些特征值将为正。取最大特征值对应的特征向量;此向量指向新 z 轴的方向。

现在,关于质量的选择。最简单的做法是将所有顶点的质量都设为 1。如果您只有一团点,这可能是一个很好的解决方案。

如果您可以访问该数据,您还可以将每颗恒星的质量设置为其真实世界的质量。如果这样做,您计算的 z 轴也将是恒星系统(很可能)围绕其旋转的轴。

关于math - 用于 2D 投影的 3D 模型的最佳旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2964248/

相关文章:

python - 在 Python 中删除和替换多项式的系数

algorithm - Procrustes 分析/找到由两组 2d 点表示的两个图像之间的角度

java - LWJGL 改变顶点之间线条的颜色

cocoa - 更改 SCNRenderer 的 PointOfView

android - 实现室内地图

javascript - 动画自定义矢量形状

css - AngularJS + Canvas 和背景图片替换

java - 如何计算TPS

javascript - 基于窗口滚动算法定位的box-shadow

javascript - 沿 HTML5 Canvas 路径的连续渐变