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

Math 二维投影三维模型的最优旋转,math,3d,canvas,2d,rotation,Math,3d,Canvas,2d,Rotation,我正在寻找一种方法来确定一组顶点的最佳X/Y/Z旋转,以便在2D画布上进行渲染(使用X/Y坐标,忽略Z) 我有两个想法,一个是纯蛮力,涉及对顶点集执行范围为0..359的三维循环(根据结果/速度要求,以1步或更多步进行),测量X/Y轴上的最小值/最大值之间的差异,存储最高的结果/旋转对并使用最有效的结果/旋转对 第二个想法是确定两个点之间的最大距离(欧氏距离),计算旋转这两个点之间的“路径”沿X轴放置所需的角度(同样,我们忽略了Z轴,因此结果中的深度无关紧要),然后重复几次。我看到的问题是,首先

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

我有两个想法,一个是纯蛮力,涉及对顶点集执行范围为0..359的三维循环(根据结果/速度要求,以1步或更多步进行),测量X/Y轴上的最小值/最大值之间的差异,存储最高的结果/旋转对并使用最有效的结果/旋转对

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

使用第二种方法,比如说使用前3次迭代,存储所需的旋转角度,并在3次迭代中求平均值,将返回更准确的结果,因为它不仅考虑了单个旋转,而且还考虑了前3个“对”


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

我会计算惯性的主轴,然后取对应力矩最高的轴向量
v
。然后,我将旋转顶点,使
v
与z轴对齐。如果你想知道更多关于如何进行的细节,请告诉我

直观地说,这会找到最难旋转点的轴,即顶点最“分散”的轴

没有你认为最佳的具体定义,不可能说这个方法有多好。但是,它有一些可取的特性:

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

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

编辑:下面是有关如何实现此方法的更详细信息

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

计算惯性矩张量。这是一个3x3矩阵,其条目由维基百科上的公式给出。公式仅取决于顶点位置和指定给它们的质量

现在你需要对角化惯性张量。因为它是对称正定的,所以可以通过找到它的特征向量和特征值来实现。不幸的是,找到这些的数值算法往往比较复杂;最直接的方法是求三次多项式的根。然而,找到矩阵的特征值和特征向量是一个非常常见的问题,任何值得一试的线性代数包都会附带代码,可以为您完成这一任务(例如,开源线性代数包Eigen有自伴特征解算器)您还可以在互联网上找到专门针对3x3案例的更轻代码

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

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


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

这个答案只对凸多面体有效

在这里你可以找到

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

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

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


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

您要求的是最佳解决方案,但不清楚要优化的度量是什么(或度量是什么)。你能澄清一下吗?你也提到“最有效”,但同样,不清楚你将如何衡量相对有效性。也许我应该改变我的问题-我正在寻找任何解决方案。我描述的这两种方法听起来都不是很有效。我想知道的是,是否有一种技术可以以所描述的方式以外的方式执行所需的任务。当提到“最佳”时,“最佳”结果旋转将意味着t