問題タブ [ray-picking]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
3d - LIBGDX 3D: カメラ レイが当たったメッシュ三角形を正確に判断できない
LIBGDX を使用して、テクスチャ ブロック (キューブ) から作成された Minecraft のような世界を作成する方法を学んでいます。私は 3D ワールドをレンダリングしましたが、プレーヤーの動きは完璧に機能しています (結果と 3D ワールドを介した動きの経験は期待どおりに感じられます)。
私は今、ブロックのどちらの面/面がカメラによって指されているかを一人称視点で検出することを目指しています。を使用して、Intersector.intersectRayBounds
どのブロックが指されているかを判断できました。視覚的な結果を得るために、見つかったブロックの周りにバウンディング ボックスを描画します。
次のステップは、ブロック (立方体) の正確な側面/面を視覚的にマークすることです。Intersector.intersectRayTriangles
見つかったブロックのメッシュパーツのリストを繰り返し処理し、メッシュのインデックス/頂点を取得することで、これを達成しようとしています。
現在の結果は、指している立方体の側面/面をマークできるということですが、不正確です。特定のコーナーのブロックを「指している」場合にのみ、正の交差が得られます。まるで、すべてではなく三角形のサブセットのみをテストできるかのようです。
どのブロック (キューブ) がポイントされているかを判断するコード例:
コードのこの部分は、見つかったブロックになりmBlockPointed
ます。
次のコード部分で、指しているブロックの正確な側面/面を決定しようとします。
このコードパートの背後にある私の考えは次のとおりです。
- モデル インスタンスのすべてのノードを反復処理します (現在、関与するノードは 1 つだけです)。
- モデル インスタンスのノードのすべてのノード パーツを反復処理します (ブロックの側面/面ごとに 6 つ)。
- ノードのメッシュを取得し、検出されたブロックが指し示すようにメッシュを変換します (ワールド位置、回転、スケーリングを取得するため)。
- 現在のメッシュ パーツのインデックス バッファ内のオフセットに基づいてインデックスを取得します
- 頂点の数と使用される頂点のサイズに基づいて、メッシュのすべての頂点を取得します
- 指定された光線と現在のメッシュ パーツのインデックス/頂点に対して交差三角形テストを実行します。
その結果、(パースペクティブ) カメラを動かしたときに、カメラがブロックサイドのコーナー領域の 1 つを指している場合にのみ、肯定的な結果が得られます。私はこの原因を考えることができません。それができれば、これを解決する方向に進むことができます.
編集 -ModelInstance.Renderer.worldTransform
代わりに使用した後の作業コードModelInstance.transform
また、いくつかのインライン コメントと最適化でコードを更新しました。
opengl - フレームバッファでレンダリングされたクワッドをマウスで選択できない
ポイント/クワッドをマウスでピックするのに苦労しています。間違った空間で座標を使用しているか、フレームバッファの位置/サイズを考慮していない可能性があります(メインウィンドウのサブウィンドウです)。
さまざまな異なる座標空間に変換し、モデル マトリックスも反転してみました。現在、ワールド空間に光線を投影し (うまくいけば正しく)、それをポイント (クワッド) の位置と比較しようとしています。ポイントはローカル空間で指定されていますが、エンティティは原点 (0f、0f、0f) でレンダリングされるため、ワールド空間で違いはないと思いますか?
ワールド空間でマウス レイを取得するには:
ポイント (11.25, -0.75) にカーソルを合わせると、光線座標は (0.32847548, 0.05527423) になります。ポイントの位置を正規化してみましたが、まだ一致しません。
何かを見落としている/見落としている、または単に座標系を誤って操作しているように感じます。どんな洞察でも大歓迎です、ありがとう。
詳細を編集してください:
クワッドの頂点は次のとおりです。
(-0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, 0.5f, -0.5f)
行列をシェーダーにロードしています:
頂点シェーダーで gl_Position を計算する:
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 0.0, 1.0);
編集 2: Rabbid のコメントに基づいてさらに資料を読んだ後、コードを変更しました。ビューポート サイズを 2 で割る必要があるかどうかわかりません (Retina MacBook ディスプレイを使用しています)。