顶点的绕组顺序

时间:2012-05-21 08:36:28

标签: opengl 3d

我了解绕线顺序是什么,以及它如何用于背面剔除。

但是,我不确定像Blender这样的3D建模程序如何能够采用任意一组三角形并正确地将它们全部卷绕。

我尝试使用谷歌搜索答案,这是我发现的最好的:

http://www.gamedev.net/topic/550481-vertex-winding-order-counter-clockwise-oder-vertex---algorithm/

基本上,对于每个三角形,你会发现它的中心(重心是精确的),从那个三角形计算一个法线向量,它给你一条光线。您可以拍摄此光线,并针对每个其他三角形进行交叉测试。如果它是偶数,那么你的绕组是正确的,如果它是一个奇数,你的绕组是不正确的(我想这取决于你如何生成正常向量,但你以某种方式使用奇数/偶数策略)。 无论如何,这意味着整个过程通常是O(n ^ 2)。如果你有1000个三角形,那么对于每个三角形,你必须针对999个其他三角形的交叉点进行测试。是否有一种不太明显的正确缠绕顶点的方法,那就更有效了?

1 个答案:

答案 0 :(得分:3)

你做错了。它没有

test it against intersection against every other triangle.

首先,您可以仅根据三角形曲面的法向量来定向(收起)三角形。然后只剩下两个选项 - 整个模型好或翻转;)

所以你真的必须只检查 ONE 三角形,然后根据最后一次检查的结果结束其余部分,这基本上是给你O(n)。

编辑:哦,我想我知道这种方法何时会失败。我记得,例如Google Sketchup做得不好,有时你需要自己定位面孔。但是,如果你增加随机光线的数量(对于随机三角形),你确实增加了正确标记所有内容的机会。

EDIT2:在一些50k以上的家伙向我投降之前 - 如果模型完全混淆(所有三角形都是随机顺序),没有其他方法正确定位所有这些而不是将它们全部检查到另一个,凸模型是例外。