Lua中翼翼的实现

时间:2014-05-20 19:51:56

标签: data-structures lua love2d

我正在制作一个不规则网格游戏,我建议使用Winged Edge数据结构。阅读它的用途似乎很直接,但我根本无法弄清楚如何实现它。

我的最终目标是能够检测到我点击的是哪些脸部,以及哪些脸部与所点击的脸部相邻。有人可能会让我走向正确的方向吗?

Irregular Grid Design

1 个答案:

答案 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面。

对于任何进一步的细节,如准确执行,欢迎您窥探上面链接的代码。 :)