【问题标题】:Matrices and a generated tiled world, how to generate the edges?矩阵和生成的平铺世界,如何生成边缘?
【发布时间】:2014-04-30 15:14:46
【问题描述】:

我假设这是一个相当普遍的问题,并要求一个可能在本质上更具学术性的解决方案或用于此类一般问题的一般方程,就像我破解看起来非常大的意大利面条一样乱七八糟的。

我想生成我的平铺世界的边缘。我有一个基本的 8 条边。我有一个代表我的瓷砖的整数数组。 0 是水,1 是草。我想添加在水和草之间过渡的边缘。我的边是从 10 到 17。

int edges[3][3] =
{
    {10, 11, 12},
    {13,  0, 14},
    {15, 16, 17}
};

我认为的第一件事是这类似于矩阵。我知道我的图形库中有一个 3 x 3 矩阵对象。是否有任何使用矩阵或蒙版的标准操作来巧妙地将我的边缘应用于我的图块?

是否有合并边缘的标准公式?例如,如果右下角与草瓦重叠,也许我不会改变它的值,但是如果右下角与左上角重叠,我想将该瓦片更改为草(0)。有更多单独的场景,问题变得复杂。

由于在生成草瓦时需要前瞻功能来添加边缘,因此我将边缘生成为对瓦阵列的附加解析。所以我正在寻找一种解决方案,我可以将边缘添加到我的草地边缘。

这也让我想起了抗锯齿,不知道那个领域有没有相关的公式。

理想情况下,解决方案将是最佳的。例如,我将有某种类似上面的遮罩,然后通过将其添加到数组中的每个草块上,我将获得角和边的唯一值,以便我可以将它们转换为边缘图像。

【问题讨论】:

    标签: c++ game-engine tile procedural-generation


    【解决方案1】:

    首先区分逻辑和可视化。对于游戏逻辑来说,有一个数组可能是有意义的,其中每个单元格都是草或水(我们称之为a)。从中创建第二个数组来存储该单元格的呈现方式并考虑边缘(我们称其为v)。


    要从a 计算v,您可以这样看问题:对于v 中的每个单元格v_ij,您想根据a_ij 和相邻单元格的值计算如何渲染它细胞。

    示例:

    这些是a中的值:

    0 0 0
    1 0 0
    1 1 1
    

    如何渲染中间的单元格?

    不考虑对称性,你实际上有2^8=256 不同的情况。


    一个好的快速解决方案可能是构建一个查找表,您可以在其中将每个 256 案例映射到您为该情况选择的边之一。

    您可以通过遍历 8 个单元格来获得该查找表的索引,从而得到 8 乘以 0 或 1,并将其设置为无符号整数的位。

    在上面的示例中,例如,您将获得 000 100 111 = 39,因此是查找中的第 39 个条目。

    【讨论】:

    • 你以前做过这个!大声笑,我真的很喜欢您的解决方案,非常感谢,我假设没有标准的矩阵运算可以将位转换为整数?将只使用数组并且没有矩阵假设不会有任何硬件优化来将这些 3 x 3 存储在矩阵中。
    猜你喜欢
    • 1970-01-01
    • 2021-06-12
    • 2015-02-27
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    相关资源
    最近更新 更多