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

但是,我不确定如何像Blender这样的3d建模程序如何采用任意一组三角形并将它们正确缠绕。

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

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

基本上,对于每个三角形,您都会找到其中心(精确地说是重心),然后从该三角形计算法线向量,从而为您提供射线。您可以获取此射线,并测试其是否与其他三角形相交。如果是偶数,则表示绕线是正确的;如果是奇数,则表示绕线是不正确的(我猜这取决于您生成法向矢量的精确度,但是您使用了奇/偶策略)。
无论如何,这意味着整个过程通常为O(n ^ 2)。如果您有1000个三角形,那么对于每个三角形,必须针对999个其他三角形的相交进行测试。是否有不那么明显的方法来正确缠绕顶点,这更有效?

最佳答案

你确实理解错了。不是

test it against intersection against every other triangle.

首先,您可以仅基于三角形曲面的法线向量来定向(缠绕)三角形。然后只剩下两个选项-,整个模型是好的还是翻转的;)

因此,您实际上只需要检查一个三角形,然后根据最后一次检查的结果结束其余部分,基本上可以得到O(n)。

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

EDIT2:在大约50k +的家伙将我压倒之前-如果模型完全混合在一起(所有三角形都是随机排列的),就是没有其他方法可以正确地确定所有方向,只不过是将它们相对于其他位置进行检查,则凸模型为例外。

10-04 21:15