algorithm - 如何计算三角形索引的循环顺序?

标签 algorithm graphic

我目前正在学习计算机图形学,但我似乎无法掌握循环排序的主题。有人告诉我,像 blender 这样的软件会以循环顺序导出构成模型的三角形索引。这样,确保法线从模型指向外部。

我不太确定循环顺序是什么意思,这种顺序如何应用于三角形指数?另外,如果我想按程序生成网格,我应该使用什么算法来应用循环排序,以便我的网格具有计算法线的正确索引?

最佳答案

循环排序意味着顶点索引在某个方向上的循环排列给出了向外指向的法线。为了说明这一点,这里有一个图表:

enter image description here

圆柱形箭头表示向外的法线。左边是逆时针排序约定,右边是顺时针。圆形箭头显示您可以移动(“排列”)索引的方向,以使法线保持不变。

对于逆时针约定,您将通过 (p2 - p1) x (p3 - p1) 计算法线,对于顺时针约定,(p3 - p1) x (p2 - p1)。请注意,在这些公式中使用特定索引是任意的,因为循环排列将涵盖计算法线的所有可能方法。

我不知道一个约定是否比另一个更常用(例如,在 OpenGL 中,您可以自由设置);但如果是的话,我会猜测逆时针方向(3 之前的 2)。同样 - 使用相同数据的不同程序也共享相同的约定才重要。

例如,OpenGL 使用约定来确定如何计算外向法线,它使用它来执行背面剔除。它采用法线与从相机到三角形平面中任意点的位移矢量的点积。如果结果为负,则三角形正对着相机,反之亦然。 (尽管这仅对封闭网格有用 - 您会从某些角度看到孔洞是透明的。OpenGL 再次为此提供了完全禁用背面剔除的选项。)


如果您按程序生成网格,并希望为所有三角形计算正确的索引排序,请执行以下操作:

  • 任何顺序设置每个三角形的索引(只要它们属于正确的三角形)

  • 使用您选择的任一约定计算法线(记住要保持一致)

  • 使用my previous answer中的方法判断计算出的法线是否朝内

  • 如果是,则交换三角形的任意两个索引。这将切换到正确的顺序。

关于algorithm - 如何计算三角形索引的循环顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45641566/

相关文章:

矩阵内的 C++ 正弦函数

javascript - 聚合 JavaScript 数组的对象值?

sql - 事务处理 SQL : Detect Date boundaries across multiple rows

algorithm - Needleman Wunsch 算法 (perl)

android - 更改 android 系统范围内显示的内容

类似facebook的 "time since"计算算法

algorithm - 这是获得数字绝对值的最快方法

c++ - #include <图形.h>

javascript - 如何使我的 n-resize 显示正确?