顶点的缠绕顺序

Posted

技术标签:

【中文标题】顶点的缠绕顺序【英文标题】:Winding order of vertices 【发布时间】:2012-05-21 08:36:28 【问题描述】:

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

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

我尝试用谷歌搜索答案,这是我找到的最好的答案:

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

基本上,对于每个三角形,您可以找到它的中心(准确地说是质心),然后从该三角形计算出一个法线向量,从而为您提供一条射线。你取这条射线并测试它与其他所有三角形的交点。如果它是偶数,那么你的绕组是正确的,如果它是一个奇数,你的绕组是不正确的(我想这取决于你如何准确地生成法线向量,但你以某种方式使用奇/偶策略)。 无论如何,这意味着整个过程通常是 O(n^2)。如果您有 1000 个三角形,那么对于每个三角形,您必须针对 999 个其他三角形的交集来测试它。是否有一种不太明显的方法可以正确地缠绕顶点,但效率更高?

【问题讨论】:

我不确定你所说的任意一组三角形是什么意思。通常,三角形是由网格创建的,这些网格以正确的缠绕顺序开始。 是的,当您导出网格以供某些渲染系统使用时,它具有正确的缠绕顺序。但是那个 3d 建模器如何首先确定事物的正确缠绕顺序呢? 【参考方案1】:

你确实理解错了。不会的

test it against intersection against every other triangle.

首先,您可以仅根据三角形表面的法线向量来定向(缠绕)您的三角形。那么就只剩下两个选项了 - 整个模型要么是好的,要么是翻转的;)

所以你真的只需要检查一个三角形,然后根据最后一次检查的结果结束其余的检查,这基本上给你 O(n)。

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

EDIT2:在一些 50k+ 的人对我投反对票之前 - 如果模型完全混淆(所有三角形都按随机顺序排列),没有其他方法可以正确定位它们,而不是将它们全部与其他凸模型进行对比。

【讨论】:

根据第一个三角形缠绕其余部分是有道理的,但是 3d 建模师如何计算出第一个三角形的正确缠绕,例如,它如何计算原始的第一个法向量? 我的方法采用了您的第一种方法 - 为一个任意三角形投射光线,并检查交叉点的数量。它为您提供 1000 次检查,因此复杂度仍然为 O(n)。在我的一本旧书中有一个章节是关于它的,它建议简单地显示一个模型并检查它是否正常或翻转...... 也可以看看math.stackexchange.com/questions/109553/… @newprogrammer:嗯,从技术上讲它不能,因为“内部”和“外部”纯粹是传统的。但是你可以做的是假设内部和外部的预定义,例如通过定义一个包围体,比如一个球体。然后你可以将第一个三角形定位在这样的包围体上。例如,您可以确定网格所有顶点的重心,然后查看距离重心最远的面,并将朝向重心的方向定义为“内部”。 @up 如果项目定位在 (0,0),外部几乎是 从零到非零

以上是关于顶点的缠绕顺序的主要内容,如果未能解决你的问题,请参考以下文章

DX11 中的顶点缠绕顺序

获取网格的边界边缘 - 按缠绕顺序

非零缠绕规则和奇偶规则

OpenGL 缠绕不正确

BGL 顶点上的随机顺序迭代

3D 三角形的顶点顺序