2D照明 - 使光线不会穿过墙壁

时间:2012-05-22 12:53:44

标签: c++ bitmap 2d light

我有一张collsion地图,有些地方我想成为光源。光源提供的光实际上是我可以看到地面的形状。它现在看起来像这样:

enter image description here

所以光线穿过墙壁。我想让它看起来像这样:

enter image description here

(我标记了墙壁与深黄色的碰撞)

因此光线在遇到墙壁时会停止。我想得到正确光线的形状,最好的是包含它的位图)

我的第一个想法是从光源投射光线并检查它们何时与墙壁碰撞(我知道如何做到这一点),但是我需要每隔0.001度投射一次光线,所以它太多时间了发光。接下来的事情是光的形状并不总是圆形,有时它可以是椭圆形或半椭圆形,甚至是三角形或圆形的一部分。一般来说,我的光点位图不会碰到任何东西,我想稍微减去它,使它看起来像第二张图像。

最后一点,我使用了allegro 4.2.1,但之前提到的所有位图都是2维度阵列,0和1。

Thanx任何帮助,对不起长问题和我的英语不好。

3 个答案:

答案 0 :(得分:7)

基本的想法是你计算墙壁的阴影区域而不是那个颜色。

This article应该给你一个良好的开端。

答案 1 :(得分:2)

在您的特定示例中,您可以通过检查每个(空)像素到光源中心的视线来轻松强制它。如果你有视线并且距离在衰减范围内,那么你在那里有光。如果没有,那就太黑了。

答案 2 :(得分:2)

MadKeithV解决方案需要O(像素数^ 2)时间。

我的解决方案是扩展的MadKeithV想法,但以O(像素数)时间运行。通过一些改进,它将工作在O(光线中的像素数)

首先,从包含光源的像素开始。然后使用BFS程序'感染'最近的像素与光和存储角度范围,光从哪个方向可以从每个点前进。

在以下BFS实例中,重复此过程,仅考虑“感染范围”中的像素。