二维投影三维模型的最优旋转

时间:2010-06-03 08:14:11

标签: math 3d canvas 2d rotation

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

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

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

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

请将这些想法分开,给出自己的见解。我想知道你们可能有什么解决方案,或者你可能引用我不熟悉的算法。

2 个答案:

答案 0 :(得分:3)

我会计算惯性的主轴,并使轴向量v具有最高的相应力矩。然后我会旋转顶点以使v与z轴对齐。如果您想了解有关如何解决此问题的详细信息,请与我们联系。

直观地,这找到了最难旋转点的轴,即顶点最“展开”的轴。

如果没有对您认为最佳的具体定义,则无法说明此方法的执行情况。但是,它有一些理想的属性:

  • 如果顶点是共面的,这种方法是最佳的,因为它总是将该平面与x-y平面对齐。

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

编辑:以下是有关如何实施此方法的更详细信息。

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

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

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

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

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

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

答案 1 :(得分:0)

此答案仅适用于凸多面体。

http://203.208.166.84/masudhasan/cgta_silhouette.pdf中,您可以找到

  

“在本文中,我们研究如何选择凸多面体的视点,使得轮廓满足某些属性。具体来说,我们给出算法来找到凸多面体的所有投影,使得一组给定的边,面和/或者顶点出现在轮廓上。“

本文深入分析了多面体投影的属性和算法。但我承认,这并不容易理解。

使用该算法,您的问题是组合:选择所有可能的顶点集,检查是否存在每个集的投影,如果它存在,则计算轮廓的凸包的面积。 / p>

您没有提供大约的顶点数。但与往常一样,不建议对无界(又称大)量的组合解决方案。