ゲーム内オブジェクトでブロックできる2Dライティングが欲しい。私のゲームにはトップダウンビューがあり、すべてのゲームオブジェクトは長方形で表されます。
10x10の世界があり、1x1にライトを配置し、そのライトの周りに壁を配置するとします。光源が壁に遮られているため、1x1で光源を見ることができるようにしたいのですが、他の場所では光源を表示できません。
光線を当てることで効果があると聞いたことがありますが、実際にはどのように機能しますか?
ゲーム内オブジェクトでブロックできる2Dライティングが欲しい。私のゲームにはトップダウンビューがあり、すべてのゲームオブジェクトは長方形で表されます。
10x10の世界があり、1x1にライトを配置し、そのライトの周りに壁を配置するとします。光源が壁に遮られているため、1x1で光源を見ることができるようにしたいのですが、他の場所では光源を表示できません。
光線を当てることで効果があると聞いたことがありますが、実際にはどのように機能しますか?
回答:
Amit Patelが2Dレイキャスティングに関する非常に素晴らしい記事を書いています。
これには、光源の範囲内の各頂点に光線をキャストして、ライトメッシュを作成することが含まれます。
視覚的な例はすべて、投稿内でインタラクティブであり、非常に理解しやすくなっています。
箱に限定する必要もありません。追跡する境界線は、好きな形にすることができます。
レイキャスティングアルゴリズムを使用する必要があります。つまり、光線(半直線)とシーン内の任意のオブジェクト(直線、正方形、円、三角形など)の交差を計算し、最も近い交差を選択できる必要があります。すべての方向に光線を投射し、最も近いオブジェクトにのみ「ライトを描画」します。
レイキャスティングとは何かを知っている場合は、実際にハードコーディングするだけです。各頂点の座標があれば、それほど複雑ではありません。
まず、光を発するオブジェクトを作成します。ライトを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つの頂点が作成され、ライトの半径を超えて(または画面外に)伸びる壁がライトをブロックすることもできます。