计算两个三维三角形是否在同一平面上。

4

我正在开发一个3D游戏引擎,需要计算两个三角形是否在同一平面上,以便相应地显示它。如何计算3D空间中三角形的角度?

计算表面法线并比较它们是否会给我两个等价的法线?


你能简要解释一下你想要实现的渲染效果吗? - tibur
任何在同一平面上的三角形都将被渲染成一个平面填充,因此我将计算哪些三角形可以合并为多边形(仅一次),然后绘制它们时会画出一个形状(每次渲染一个)。 - Robin Rodricks
2个回答

3
为什么你想这样做?你预计要测试的三角形数量是多少?这对于实时渲染算法来说似乎有点复杂!
无论如何:
计算三角形的法线n。然后计算平面方程:a.x + b.y + c.z + d = 0,其中(a,b,c)为您的三角形法线,d = - dot(n,P)(P是您的三角形顶点之一)。对第二个三角形执行相同操作。
如果四个值abcd相等或相反(全部在一起),则两个平面相同。

3
如果你不是数学专家,为什么还要对我说“给我代码”?坦白地说,如果你在写一个 3D 引擎,你应该了解一些用于创建引擎的数学知识。否则,你只是复制粘贴别人的解决方案,而不知道它们是否真正解决了你想要实现的功能。 - Michael Todd
3
如果你被“向量”或“矩阵”这些词吓到了,那么你至少应该阅读一些三维数学教程,比如下面这个链接,否则你将永远无法成功地编写你的三维引擎。http://chortle.ccsu.edu/VectorLessons/vectorIndex.html - tibur

3

你所要求的在数值上是不可能的,舍入误差会使这样的测试完全无关紧要。

然而,你可能想测试“如果两个三角形在同一个平面内,容忍度范围内”。这非常困难,而且在这里,舍入误差很可能会破坏任何可能的方法。实际上,每当三角形变薄时,它们所在的平面存在很大的不确定性。

如果你真的想要,我可以向你指出一些文献(你最好查看CGAL库,并查看它们是否实现了与你的问题相关的内容)。任何东西都可能涉及任意精度浮点数、聪明的操作重新排序,并且总会导致不准确的结果。

因此,我强烈建议你为你的实际问题找到另一种方法。

如果你试图计算通过三个点的平面方程,然后测试另外三个点的话,舍入误差是一个(巨大的)问题。还有另一种解决方案。

你可能想计算六个点的惯性矩阵,对其进行对角化,并查看最小特征值是否在另外两个特征值的某些微小值范围内。这将意味着你的六个点实际上位于同一平面上,容忍度内。

这是否大致相当于主成分分析? - tibur
1
@tibur:这确实是主成分分析。 - Alexandre C.

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