我正在制作一个不规则网格游戏,我建议使用Winged Edge数据结构。阅读它的用途似乎很直接,但我根本无法弄清楚如何实现它。
我的最终目标是能够检测到我点击的是哪些脸部,以及哪些脸部与所点击的脸部相邻。有人可能会让我走向正确的方向吗?
答案 0 :(得分:2)
经过一番进一步的阅读和讨论后,我设法编写了一个非常时髦的Winged Edge库。它是根据麻省理工学院的许可证授权的,所以如果有人想要使用它,那么你非常欢迎!
https://github.com/karai17/Lua-Winged-Edge
其工作方式如下:
Winged Edge的关键特性是每组数据如何引用每隔一组数据。每个顶点列出连接到它的所有边,每个边列出连接的顶点和面,每个面列出连接的顶点和边。下面将更加明白这一点的有用性。
首先,我解析了Wavefront Object文件以获取顶点和面的列表。每个顶点都有XYZ坐标,每个面都有一个连接到的顶点列表:
obj.vertices = {
{ x=0, y=0, z=0 },
{ x=1, y=0, z=0 },
{ x=1, y=1, z=0 },
...
}
obj.faces = {
{ 1, 2, 3 },
{ 1, 2, 4 },
{ 3, 4, 5, 6 },
...
}
然后我为我的翼边(WE)对象创建了三个表:顶点,边和面。我解析了顶点并创建了WE顶点:
WE.vertices = {
{ edges={}, position={ 0, 0, 0 } },
{ edges={}, position={ 1, 0, 0 } },
...
}
然后我解析了面以创建WE边缘和WE面,填写所有参考。边缘有一个特殊情况,它们不仅引用它们所连接的面,而且还引用每个面的上一个和下一个边。这非常重要,因为它允许您遍历面的边缘以找到与当前相邻的面:
WE.vertices = {
{ edges={ 1, 2, 3 }, position={ 0, 0, 0 } },
{ edges={ 2, 3, 4 }, position={ 1, 0, 0 } },
...
}
WE.edges = {
{ vertices={ 1, 2 }, faces={ face=1, prev_edge=3, next_edge=2 } },
{ vertices={ 2, 3 }, faces={ face=1, prev_edge=1, next_edge=3 } },
{ vertices={ 3, 1 }, faces={ face=1, prev_edge=2, next_edge=1 } },
...
}
WE.faces = {
{ edges={ 1, 2, 3 }, vertices={ 1, 2, 3 } },
{ edges={ 2, 3, 4 }, vertices={ 2, 3, 4 } },
...
}
使用这样设置的数据结构,您可以创建一个函数来检查边缘所属的面,并且遍历这些边可以允许您收集与任何特定面相邻的所有面,以及它们在哪里在太空中。
我使用它的方法是检查我点击的脸部周围哪些脸部,以确定是否允许我根据某些游戏逻辑激活该脸部,例如是否已经激活了任何被包围的脸部。另一个用途是flood filling面。
对于任何进一步的细节,如准确执行,欢迎您窥探上面链接的代码。 :)