2012-05-22 5 views
5

私は、コリジョンマップと、光源にしたいいくつかの場所を持っています。光源は、実際に地面を見ることができる形の光を提供します。それは次のようになります。2D照明 - 光が壁を通り抜けないようにする

enter image description here

ので、光が壁を通過します。私はそれがこのように見えるようにしたい:

enter image description here

(私は濃い黄色と壁との衝突をマーク)

壁に会うときに光線が停止します。

私の最初のアイデアは、ソースから光線を投射し、壁に衝突したときにチェックすることでした(私はこれを行う方法はわかっています)。しかし、私は光線を生成するにはあまりにも時間がかかるので、例えば0.001度ごとに光線を投射する必要があります。次のことは、光の形が常に円ではなく、時には楕円または半楕円、三角形または円の一部であってもよいことです。一般に、私は何も衝突しない光でビットマップを持っています、そして、私はそれを2番目のイメージのように見せかけるために少し引きます。

最後に、allegro 4.2.1を使用していますが、前述のすべてのビットマップは、0と1の2次元配列です。

何か助けてくれてありがとうございました。長い質問と私の悪い英語で申し訳ありません。

+0

直線的な障害物によって生成された影がセクタになるという事実を利用できますか?強さに応じて半径を持つ円形のライトから始め、各障害物の逆の色で台形を描きます。 –

+0

hm、もう少し説明できますか? –

答えて

7

基本的な考え方は、壁の影領域を計算し、それを色付けしないことです。

This articleはあなたに良いスタートを与えるはずです。

+0

いいリンク。 Thanx –

2

あなたの特定の例では、各(空の)ピクセルから光源の中心までの視線をチェックすることで簡単にブルートフォースできます。見通し線があり、距離が落ち込みの範囲内にある場合、そこには光があります。そうでなければ、それは暗いです。

+0

それは時間がかかりませんでしたか? :O –

+0

@kittyPL - これはブルートフォースのオプションです。これを行う最も効率的な方法ではありません。利点は、障害物のどのような形状に対しても機能することですが、点状の光源に対してのみ機能します。 –

+0

良い方法はありませんか?私はそれを動的に生成したいので、移動する障害は影を投げることができます... –

2

MadKeithVソリューションはO(ピクセル数^ 2)時間が必要です。

私のソリューションはMadKeithVの拡張アイデアですが、O(ピクセル数)時間で実行されます。一部の改良点では、O(光のピクセル数)で動作します

まず、光源を含むピクセルから始めます。次に、BFS手順を使用して、最も近いピクセルに光を照射し、光を各方向から進行させることができる角度の範囲を格納します。

次のBFSインスタンスでは、「感染範囲」のピクセルのみを考慮して、この手順を繰り返します。

関連する問題