「ブロックベースのゲーム」(Minecraft のようなもの) を開発していますが、1 つのことに行き詰まりました。
世界中のすべてのもの (ブロックとエンティティ) を制御でき、それらのすべてに AABB (場所、サイズなど) があると仮定すると、マウスが見ている/指している対象を取得するにはどうすればよいでしょうか? プレーヤーは、マウスの動きに応じた回転システムを備えています。見ているブロック/エンティティを取得する方法がわかりません。
マークのバリアントの代わりに、色によるピッキングを使用できます。これを行うには、次の手順が必要です。
1) ライティング、ブレンディング、マルチサンプリング、テクスチャリングなどをオフにします。シェーダーを使用する場合は、最も単純なシェーダー プログラムをセットアップするだけです (1 回の呼び出しだけで済むように準備する必要がありglUseProgram
ます)。このプログラムは、ジオメトリのみを変換し、指定された色でその各部分をレンダリングします。Z バッファーをオフにしないでください。
2) すべての変換が適用されたオフスクリーン バッファにシーンをレンダリングします。区別したい各アイテムには、独自の色が必要です。3 つのカラー チャネルごとに 8 ビットの場合、2^(3*8)=16777216 項目から選択できます。
3) 関心のあるポイント、つまりマウス ポインタのウィンドウ座標で、オフスクリーン バッファからカラー値を選択します。最初のステップでは、z バッファをオフにしなかったため、マウスでポイントされた最も近いオブジェクトの色が得られます。
4) レンダリング状態をリセットし (マルチサンプリングをオンにするか、適切なシェーダーを選択するか、照明やその他の効果をオンにする)、シーンをウィンドウ バッファーにレンダリングします。
私の考えでは、この手法はレイキャスティングよりも実装がはるかに簡単です。レンダラーの状態を調整するだけで、ハードウェアがすべてのハードワークを実行するからです。
この手法のパフォーマンスは、錐台カリング、octree、bspなどを使用して通常のレンダリングのパフォーマンスを向上させると、自動的に向上します。
フレームバッファ オブジェクトの詳細:
カラーピッキングに関するトピック:
Google で色分けされたピッキングに関するチュートリアルをさらに見つけることができると確信しています。
目のベクトルからレイ キャスティングの形式を使用できます。基本的には、そのレイをプレーヤーの手の届く範囲で考慮できる距離まで伸ばしてから、そのレイと近くのブロックとの交差をテストします。交差点が最も近いブロックが、注目しているブロックになります。
その光線とブロックとの交差をテストするには、ブロックの各平面に対してチェックする必要があります。これを実現するために、光線と平面の交差アルゴリズムを使用できます。
明らかに、パフォーマンスを向上させるために、テストするブロックとプレーンの数をできるだけ減らすようにしてください。