三维模型的最佳旋转方式以实现二维投影

3
我正在寻找一种确定一组顶点的最佳X/Y/Z旋转方式以进行渲染(使用X/Y坐标,忽略Z)在2D画布上。
我有几个想法,其中一个是纯暴力方法,涉及对顶点集执行三维循环,范围为0..359(步长为1或更多,具体取决于结果/速度要求),测量X/Y轴上的最小/最大差异,存储最高结果/旋转对并使用最有效的对。
第二个想法是确定两个距离最远的点之间的欧几里得距离,计算旋转这两个点之间的“路径”所需的角度使其沿着X轴排列(同样,我们忽略Z轴,因此结果中的深度不重要),然后重复几次。我能看到的问题是,首先通过重复它,我们可能会用新的旋转覆盖我们以前的旋转,并且原始/随后的旋转可能不一定会产生最大的2D区域利用率。第二个问题是如果我们只使用单个迭代,则会出现相同的问题-距离最远的两个点可能没有其他点沿着同一“路径”对齐,因此我们可能无法获得2D项目的最佳旋转。
使用第二个想法,也许使用前3次迭代,存储所需的旋转角度,并在3次迭代中取平均值会返回更准确的结果,因为它不仅考虑了单个旋转,还考虑了前三个“对”。
请批判这些想法,提供您自己的见解。我很想看看您们可能有的解决方案或我不知道的算法。

2
您要求一个最优解,但是不清楚您要优化的度量标准是什么(或者有哪些度量标准)。您还提到“最有效”,但同样不清楚您如何衡量相对有效性。请您澄清一下? - High Performance Mark
也许我应该改变我的问题 - 我正在寻找任何解决方案。我描述的两种方法都似乎不是很有效。我想知道是否有一种技术可以以其他方式执行所需的任务。当提到“最优”时,“最优”结果旋转意味着顶点集的最小/最大x/y坐标之间的最大差异。 - Seidr
你的身体是否是凸出的?如果不是,问题会更难解决。 - Dr. belisarius
“body”本身实际上是一组3D坐标,它们本身是“星系”的代表。我试图达到的目标是最大化可见区域-即旋转后的坐标的外边缘在2D项目中占据尽可能多的空间。 - Seidr
2个回答

3
我会计算惯性主轴,并取具有最高对应矩的轴向量v。然后将顶点旋转以使v与z轴对齐。如果您需要更多关于如何进行此操作的详细信息,请告诉我。
直观地说,这找到了最难旋转点的轴,即顶点最“分散”的轴。
没有具体定义什么是最佳的情况下,无法确定此方法的表现如何。但是,它具有一些理想的属性:
- 如果顶点共面,则此方法是最佳的,因为它将始终将该平面与x-y平面对齐。 - 如果顶点排列成矩形盒子,则盒子的最短尺寸将与z轴对齐。
编辑:以下是有关如何实现此方法的更详细信息。
首先,为每个顶点分配质量。我将讨论如何执行此操作的选项。 接下来,计算顶点集的重心。然后通过减去重心的-1倍来平移所有顶点,以便新的重心现在为(0,0,0)。
计算惯性张量。这是一个3x3矩阵,其条目由您可以在维基百科上找到的公式给出。公式仅取决于顶点位置和您分配给它们的质量。
现在,您需要对惯性张量进行对角化。由于它是对称正定的,因此可以通过找到其特征向量和特征值来完成此操作。不幸的是,用于查找这些的数值算法往往很复杂;最直接的方法要求找到三次多项式的根。但是,找到矩阵的特征值和特征向量是一个非常常见的问题,任何值得一试的线性代数软件包都将提供可以为您执行此操作的代码(例如,开源线性代数软件包Eigen具有SelfAdjointEigenSolver)。您还可以在互联网上找到专门针对3x3情况的轻量级代码。
现在,您有三个特征向量及其对应的特征值。这些特征值将为正。取相应于最大特征值的特征向量;此向量指向您的新z轴方向。
现在,关于质量的选择。最简单的方法是给所有顶点一个质量为1。如果您只有一堆点,那么这可能是一个好的解决方案。
您还可以将每个星的质量设置为其真实世界的质量,如果您可以访问该数据。如果这样做,则计算出的z轴也将是星系(最有可能)绕其旋转的轴。

谢谢你提供这个线索 - 我会调查一下,看看能否找到更多信息。我通过寻找例子并加以改编来学习,但如果我遇到麻烦(最初我没有看到关于“惯性主轴”的参考资料),我会回来寻求进一步的帮助。暂时给一个+1,因为听起来这似乎会实现我想要达到的目标。 - Seidr
经过一些阅读(虽然不多,因为我刚开始工作 - 与职业无关,有点...),似乎你提到的“惯性主轴”是应用于我们已知体积和质量的物体?虽然计算这个点云的体积是可能的,但它的质量就另当别论了。从技术上讲,它没有质量,因为它只是定义了一个三维空间的区域?我稍后会再搜索一下,但现在是工作时间。谢谢。注意:我只能访问一组点(x/y/z坐标),所有点都围绕0,0,0对齐。这些点的坐标可以在-1..1的范围内。 - Seidr
我会在我的回答中添加更多有关如何实现的细节。 - user168715
很棒的答案 - 这正是我也会这样做的方式! - Drew Hall
太棒了,谢谢。我今晚会开始实现这个答案 - 我很期待。非常感谢! :) - Seidr

0

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

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

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

该论文深入分析了多面体投影的属性和算法。但是我必须承认,它不容易理解。

有了这个算法,你的问题就变成了组合学:选择所有可能的顶点集,检查是否存在每个集合的投影,并且如果存在,则计算轮廓线凸壳的面积。

您没有提供顶点的大致数量。但是像往常一样,不建议使用组合方法来处理无限制(即大量)的数量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接