0

我一直在为我正在开发的基于块的游戏(想想泰拉瑞亚)开发照明系统,但我对其中的一点有点难过。当一个块被更新时,它的亮度级别也会根据其相邻(相邻)块的亮度级别进行更新。

现在考虑这种情况:玩家在地面上挖了一个洞,将地球深处的一个方块暴露在太阳下。这使它的亮度等级为 16(满分为 16),其邻居的亮度等级为 15。但是,如果玩家再次填充洞,该块将保持 16 的亮度等级。我的第一个想法是“审核“当一个街区的光照水平通过检查它与它的邻居没有超过一个单位的差异来更新时,但事实证明这是无效的。

我能想到的唯一解决方案是专门检查放置的方块是否暴露在阳光下,如果是,则将其下方方块的光照级别更新为 16 分中的 15 分。但是,这对于修复在某些情况下会出现问题,并且相邻块由于其相邻块而无法降低亮度。也许我只需要退后一点,再看看这个问题,但我想我可能会在此期间发帖。有没有人有关于如何解决这个问题的建议?

4

2 回答 2

1

根据我的经验,最不容易出错和(奇怪)最快的方法是简单地清除可能受影响的最大范围内的所有光块(在您的情况下为 +-16)并重新计算它们。

添加光时的迭代方法给出了很好的结果,但我发现要慢得多;大概是由于在运行算法时维护需要更新和添加/删除的块列表的开销。在去除光的过程中,迭代方法也容易出错,因为光会在您发现时“泄漏回来”;之前在 14 光的块失去了与太阳的连接,因此被重新计算;在附近找到一个光块 13 并将其自己的光设置为 12(而不是所有它们都设置为零)。

我使用的解决方案是清除所有光照水平,然后向下扫;从每个块上方的 9 个块(3D 中,3 个 2D 块)收集光线。不直接位于上方的 8 个(或 2D 中的 2 个)块的光衰减,并将光水平设置为这 9 个块的最大值。这允许光线以最大 45 度角向下传播;这可能会产生非常刺眼的阴影,这可能是也可能不是您想要的。向上重复扫描可以减轻刺眼的阴影,因为可以施加所有块无论阳光如何都具有的最低光照水平。

于 2013-09-02T09:16:04.200 回答
0

我认为用流程图来解释是最容易的:

在此处输入图像描述

于 2013-09-01T22:33:59.587 回答