6

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

在此处输入图像描述

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

在此处输入图像描述

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

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

我的第一个想法是从光源投射光线并检查它们何时与墙壁碰撞(我知道如何做到这一点),但是我需要每隔 0.001 度投射光线,因此生成灯光的时间太长了。其次是光的形状并不总是圆形,有时它可以是椭圆或半椭圆,甚至是三角形或圆形的一部分。通常,我的位图的光线不会碰撞任何东西,我想将其减去一点以使其看起来像第二张图像。

最后一件事,我使用的是 allegro 4.2.1,但前面提到的所有位图都是带有 0 和 1 的二维数组。

感谢您的帮助,对不起,很长的问题和我的英语不好。

4

3 回答 3

7

基本思想是您计算墙壁的阴影区域,而不是对其进行着色。

这篇文章应该给你一个好的开始。

于 2012-05-22T13:12:07.323 回答
2

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

于 2012-05-22T12:57:39.507 回答
2

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

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

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

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

于 2012-05-24T18:54:01.160 回答