ブロックベースの2Dゲームでオクルードライティングを実装するにはどうすればよいですか?


11

ゲーム内オブジェクトでブロックできる2Dライティングが欲しい。私のゲームにはトップダウンビューがあり、すべてのゲームオブジェクトは長方形で表されます。

10x10の世界があり、1x1にライトを配置し、そのライトの周りに壁を配置するとします。光源が壁に遮られているため、1x1で光源を見ることができるようにしたいのですが、他の場所では光源を表示できません。

光線を当てることで効果があると聞いたことがありますが、実際にはどのように機能しますか?


1
この質問に対するいくつかの言語にとらわれない答えを見たいのですが。
Dashto 2013年

2
@Dashto:使用する言語で動作するコードが必要ですか?それは求めるべき間違った場所です..
Kromster

何を試しましたか?「他に光源がないところ」と言ったら、どういう意味ですか。1,1ブロックをライトアップするだけです。質問がつかないかもしれませんが、イラストを投稿していただけませんか?
Laurent Couvidou 2013年

1
@クロム・スターン:私は実際には正反対を求めています-実際には、言語に依存しない概念的な答えです。複製としてリンクされた2つのスレッドは、概念についてあまり話しません。実際、このサイトの同様の質問のほとんどは、「このライブラリを使用してください!」と答えるだけです。これは、それがどのように機能するかを理解したい人にとってはあまり役に立ちません。
Dashto 2013年

@ダッシュ:重要な情報です。質問に追加してください;)
Kromster

回答:


13

Amit Patelが2Dレイキャスティングに関する非常に素晴らしい記事を書いています。

これには、光源の範囲内の各頂点に光線をキャストして、ライトメッシュを作成することが含まれます。

ここに画像の説明を入力してください

視覚的な例はすべて、投稿内でインタラクティブであり、非常に理解しやすくなっています。

箱に限定する必要もありません。追跡する境界線は、好きな形にすることができます。


1

レイキャスティングアルゴリズムを使用する必要があります。つまり、光線(半直線)とシーン内の任意のオブジェクト(直線、正方形、円、三角形など)の交差を計算し、最も近い交差を選択できる必要があります。すべての方向に光線を投射し、最も近いオブジェクトにのみ「ライトを描画」します。

これどのように見えるかです。


レイキャスティングをどのように使用するかを尋ねました。私はそれについて知っています。
LiquidFeline 2013年

0

レイキャスティングとは何かを知っている場合は、実際にハードコーディングするだけです。各頂点の座標があれば、それほど複雑ではありません。

まず、光を発するオブジェクトを作成します。ライトをX、Y座標に配置します。

#include <math.h>
int i = 0;
if ( sqrt( abs( light.x - vertex.x )^2 + abs( light.y - vertex.y )^2 ) <= light.radius)
{
    lightOccludingVertices[i] = vertex;
    i++;
}

//If two or more vertices are both a member of an individual wall,
//illuminate the triangular area between the light, the furthest 
//vertex on the x-axis, and the furthest vertex on the y-axis

これは、凹面のポリゴンでは動作することが保証されていませんが、凸面のポリゴンでは問題なく動作するはずです。

これは、照明を適用した後に遮蔽オブジェクト(壁、キャラクター、空飛ぶ紫色の人を食べる人)が画面にペイントされた場合に機能します。そうしないと、壁の半分が他の半分よりもかなり明るく見えます。ポイントライトが同じ壁の2組の頂点から等距離にある場合(壁の高さのちょうど半分の高さ)、三角形を最も離れた2つの頂点ではなく、最も近い2つの頂点に適用します。

また、この方法では、動的に作成された頂点のポイントが必要であり、ライトの半径のエッジがオクルージョンオブジェクトのサーフェスと交わる点にも言及する必要があります。これにより、すべてのオクルージョンオブジェクトに対して最低3つの頂点が作成され、ライトの半径を超えて(または画面外に)伸びる壁がライトをブロックすることもできます。

凹面ポリゴンと凸面ポリゴンの詳細

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.