我有一个3d建模应用程序。现在我正在双面绘制网格,但是当对象关闭时我想切换到单面。
如果多边形网格是封闭的(没有边界边缘/完全周期性),我似乎应该始终能够确定对象当前是否被翻转,并自动更正。
被翻转意味着我的法线指向对象而不是对象。被翻转是由于我的缠绕规则与当前正面设置不匹配的结果,但我直接从几何体计算法线,因此查看法线是一种检测它的简单方法。
我想到的一件事就是拿走边界框,找到最高点,看看它的正常点是向上还是向下 - 如果它向下,那么对象就会被翻转。
但似乎这个解决方案可能容易出现退化几何或浮点错误,因为我只看一个点。我想我可以得到所有6个轴对齐的范围,但这似乎是一个稍微好一点的kludge,而不是一个合适的解决方案。
有一种强大而简单的方法吗?强大而坚硬也会起作用.. :)
答案 0 :(得分:5)
这是一种强大而缓慢的方法:
从质心偏移一个边界框的一角(强制它在闭合的多边形网格之外保证),然后从网格中创建一个线段到网格上任何三角形的中心点。
测量该线段与三角形法线之间的角度。
将该线段与网格的每个三角形面相交(包括用于生成线段的三角形)。
如果存在奇数个交叉点,则法线和线段之间的角度应<180。如果有偶数,则应该> 180。
如果有偶数个交叉点,则应反转这些数字。
这适用于非常复杂的表面,但它们必须关闭,否则会发生故障。
答案 1 :(得分:2)
“我正在绘制网格双面”
你为什么这样做?如果你正在使用OpenGL,那么有一个更好的方法去保存你自己的所有工作。使用方法:
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 1);
这样,所有多边形总是双面的 您想要使用单面照明的唯一原因是,如果您有一个开放或部分倒置的网格,并且您希望以某种方式通过让它们不被点亮来指示哪个部分属于内部。
一般来说,你所提出的问题是几何处理中的一个悬而未决的问题,而AFAIK没有确定方向的确定方法。正如你的建议,有几种常用的启发式方法 另一种方法让人联想到一个着名的多边形点算法:在网格上选择一个顶点并从法线方向射出一条射线。如果射线击中偶数个面,则法线指向外侧,如果是奇数,则法线朝向内侧。注意不要将原点作为交叉点计算。这种方法只有在网格是一个封闭的流形时才会起作用,如果光线恰好在两个多边形之间传递,它可以到达一些边缘情况,所以你可能想多次这样做并进行主导投票。