建立三角形邻接数据


9

给定一个三角形索引列表,如何将其转换为具有几何着色器邻接关系的索引列表呢?

请注意,我们在这里严格地讨论索引 -存在顶点,但是我们将仅关注索引,因为我们可以使用它们来匹配重复的顶点,而不必进行浮点比较和epsilon-这项工作已经完成了。

我知道对于列表中的任何给定三角形,索引为{0,1},{1,2}和{2,0}(或{n,n + 1},{n + 1,n + 2},{ n + 2,n}(如果您愿意)的形式形成边缘;索引列表格式正确,并正确遵守绕线顺序。

我知道,对于任何给定的此类边缘,我们都可以在整个列表中搜索使用两个索引的另一个三角形,并且该三角形的第三个索引是用于完成该边缘的相邻三角形的索引。

我知道在邻接表中,每个原始三角形都由6个索引表示,原始索引分别进入插槽0、2、4;完成邻接的新索引进入插槽1、3、5。边缘{0,1}完成的索引进入插槽1,边缘{1,2}完成的索引进入插槽3,索引完成以完成边{2,1}进入插槽5。

我尝试了什么?

我已经尝试过强行使用,是的,那行得通,但是我追求的是更优雅的方法。

我已经尝试了Eric Lengyel的边缘列表生成器,但是(1)它似乎并不遵循原始的三角形顺序,(2)它似乎并不遵循缠绕的顺序,(3)泥泞无处接下来,在构建边缘列表之后,以及(4)我怀疑示例代码具有明显的明显错误,例如“ triangleIndex”与“ faceIndex”-作者甚至编译了代码,没关系将其运行到验证吗?

那么-从这里开始有什么建议或指示吗?


吉米,我编辑了有关阴影卷的内容并更改了标题,因为它似乎无关紧要,并且可能造成混淆-问题实际上只是关于建立邻接数据,即使您的最终目的是将其用于阴影卷。
内森·里德

Answers:


11

我会尝试为此使用哈希表(例如,std::unordered_map如果您使用的是C ++)。建立一个哈希表,该哈希表从一个半边(按顺序表示为一对索引)映射到该半边所属的三角形的第三个索引。

这可以通过简单地遍历三角形列表并将每个三角形的三个半边添加到哈希表中来构建。如果您的初始索引列表有一对相邻的三角形(0、1、2、2、1、3),那么您将得到一个哈希表,其中包含:

(0, 1) -> 2
(1, 2) -> 0
(2, 0) -> 1
(2, 1) -> 3
(1, 3) -> 2
(3, 2) -> 1

请注意,边缘(1、2)和(2、1)都出现在表格中,代表边缘的两侧,并指向两个三角形中的每个三角形的第三个顶点。

然后,要构建邻接数据,您需要做的是再次遍历三角形列表,并用相反的绕组查询每个三角形的边缘。因此,当处理三角形(0,1,2)时,您将查询边(1,0),(2,1)和(0,2)。如果存在,这将找到每个边的相反顶点。


1
很酷,搜索顺序相反的边是缺少信息的关键。工作冠军;+1并被接受。
Maximus Minimus 2013年

2

看一下半边数据结构

大致的想法是,您存储一个半边列表,例如,附加到特定面的特定边的一半。然后,该结构还存储有关邻接面的相应半边的信息。

数据结构使有关连接性,邻接性等的查询非常高效。有一些算法可以有效地生成数据,尽管不一定可以有效地“游戏运行时”(您可能希望在资产管道中离线进行此操作)。

另请参阅这些博客文章。我相信实时碰撞检测中也包含这种结构和算法,但是我不确定,并且在办公室也没有副本。


-1,对不起,但这没有提供我尚未拥有的任何信息,并且是针对CPU的使用而不是建立一个在GS中具有邻接关系的列表。
Maximus Minimus 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.