2Dアイソメゲームでのリアルタイムシャドウキャスティング


15

私はC ++で小さな2Dアイソメトリックエンジンを書いており、リアルタイムのシャドウキャスティングを実装しようとしています。このページで説明されている簡単なアプローチに従いました。結果は次のとおりです(光は黄色のキューブと同じ位置にあります)。

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

結果は非常に良いですが、壁とキューブの上部に影がありません。これがどのように見えるかの例を次に示します(予想される影を緑色で描画しました)。

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

描画されるすべてのキューブは、XY位置に配置され、Z深度(z = x + y)の3つの2Dクワッドで単純に作成されます。OpenGLを正投影マトリックス(glOrtho)と共に使用します。影はステンシルバッファーを使用して描画されます。

このシャドウキャストの実装を完了するのに役立つリソースまたはソリューションを探しています。

どうもありがとう!


5
「このページ」へのリンクは、ページではなく画像を指しています。また、私はここで推測しているだけですが、3Dでその問題を解決し、カメラを幾何学的に投影する方が簡単かもしれません。
テトラッド

おっと、あなたは正しい、私はリンクを修正しました。3Dプロジェクションの方が確かに簡単ですが、2Dにはその利点もあり、これを2Dで実装するソリューションがあると確信しています。
-XPac27

回答:


6

屋根と壁の場合、壁セグメントと生成された影領域の間の交点を決定しようとする場合があります。シャドウの2パスレンダリングが必要です。最初のものは、あなたが今日していることをします(メモリストレージで)。2回目のパスでは、屋根と壁の交差点を計算します。最後の段階は実際のレンダリングです。DeadMGは間違っています、あなたはそれをすることができます。

注:屋根の場合、影の領域と屋根の領域を交差させる必要があります。


良いアドバイスをありがとう!シャドウセグメントのものと比較して、セグメントのドット積を使用して計算する必要がある壁をチェックすることにより、この2番目のパスを最適化できる場合。私はそれを試して、それが機能する場合は投稿します。
XPac27

しばらく経ちましたが、あなたの提案のおかげでようやく機能するようになりました!必要なジオメトリメソッドは2つだけです(ポイントがポリゴン内にあるかどうかを知る方法と、2つのセグメントの交差を取得する方法)。私はまだ屋根を扱う必要がありますが、知るのは簡単に見えます。このビデオで結果を見て、ここでソースコードを見ることができます(私はちょうど1日作業したので、さらに最適化できる可能性があります)。
XPac27

@ XPac27それはすごい。共有してくれてありがとう。
ashes999

0

基本的に、探していることはできません。たくさんの2Dオブジェクトを取得して、3Dオブジェクトであるかのように影を落としたいとします。完全な3Dシャドウが必要な場合は、3Dオブジェクトが必要です。


1
しかし、それは質問のような3Dシャドウキャスティングではありません。どんな壁でもその方向の視線を完全にブロックします。可変の高さのオブジェクトを持つことはできません。
yuriks

0

説明されたソリューションは、完全な3Dソリューションを必要としないため、完全な3Dではありません。ように見えますが、そうではありません。シャドウキャストの作成は、ボリューム間の交差と見なす必要があります。彼が必要とするものはそれほど複雑ではありません。(知っているなら)ドゥームとレンダリングエンジンのようなドゥームを覚えておいてください。すべての処理は2次元で行われました。


0

このゲームを小さくしたいのであれば、現在のシャドウの実装で十分だと言うのはどうですか?

私はこれを実際に見たことがないことを認めています。つまり、このゲームが動的なオブジェクトと動的な光源でライブで実行されている、あなたの画像から判断すると、影の欠陥が邪魔になるか、邪魔されないかは見ていません「これで十分です。今はゲームを完成させることに集中してください」と言いたいと思います。現在の実装が小さくて高速に実行され、問題と思われるものを修正するとコードが大きくなり、遅くなる場合は、それらの影を心配しない方が良いと思います。

問題の解決策として「問題を解決しようとしないでください」という提案は悪い習慣かもしれません。それでも、コードのフットプリントを小さくしたいのであれば、それは本当に良いことだと正直に言いたいです。

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