2009-04-17 65 views
3

我有一个3D建模应用程序。现在我正在双面绘制网格,但是我想在对象关闭时切换到单面。是封闭的多边形网格翻转?

如果多边形网格是封闭的(没有边界边界/完全周期性的),似乎我应该总是能够确定对象当前是否翻转并自动更正。

翻转意味着我的法线指向对象而不是指向对象。被翻转是由于我的绕线规则和当前的正面设置不匹配,但我直接从几何图形计算法线,所以查看法线是检测它的简单方法。

我在想的一件事就是拿起边框,找到最高点,并查看它的正常点是否向上或向下 - 如果它是向下的,则对象被翻转。

但似乎这种解决方案可能容易出现退化几何或浮点错误的错误,因为我只看到一个点。我想我可以得到所有6轴对齐的范围,但这似乎是一个稍微好一点的kludge,而不是一个适当的解决方案。

有没有一个强大的,简单的方法来做到这一点?强大的硬也将工作.. :)

+0

我认为你应该更好地解释'翻转'的含义,即翻转x,y或z? – 2009-04-17 16:08:07

+1

我认为他意味着如果法线向内指向(因为它们应该指向外部)。 – 2009-04-17 16:14:59

回答

5

这是一个强大的,但缓慢的方式来获得有:

采取边框从心(强制抵消的一个角落里的关闭之外来保证多边形网格),然后创建一个线段到网格上任意三角形的中心点。

测量该线段与三角形法线之间的角度。

将该线段与网格的每个三角形面(包括用于生成线段的三角形)相交。

如果存在奇数个交点,则法线与线段之间的角度应为< 180.如果有偶数,则应该大于180。

如果有偶数个交叉点,则数字应该颠倒。

这应该适用于非常复杂的表面,但它们必须关闭,否则它会打坏。

2

“我画网格双面”

为什么要那样做?如果你使用的是OpenGL,那么有更好的方法去拯救你所有的工作。使用:

​​

这样,所有的多边形都是双面的。
你想使用单面照明的唯一原因是,如果你有一个开放的或部分倒置的网格,并且你想以某种方式通过让它们未被照亮来指示属于内部的部分。

一般来说,你所提出的问题是几何处理中的一个未解决的问题,而AFAIK并没有确定的一般方法,总是可以确定方向。正如你所建议的那样,有几乎总是有效的启发式方法。
另一种方法让人想起一个着名的多边形点算法:在网格上选择一个顶点,然后从法线方向射出一个射线。如果射线击中偶数个面,则法线指向外部,如果它是奇数,则法线朝向内部。注意不要将起点视为交点。这种方法只有在网格是封闭的流形时才起作用,并且如果光线正好在两个多边形之间传递,它可以达到一些边缘情况,因此您可能需要多次执行该操作并进行前导投票。