3

gluUnProjectを使用してレイをシーンにキャストし、そこにプリミティブを追加しています。私がやろうとしているのは、既存のプリミティブを正確に選択することです。したがって、球が3つある場合は、1つをクリックして削除できます。

解決策は、光線がオブジェクトと交差しているかどうかを確認し、キャストの原点に最も近いかどうかを確認することになると思います。これまでの私の解決策は原始的であり、すべてのオブジェクトを境界キューブで囲んでいます。とにかく、次のように球を使用してこれを正確に行う方法はありますか。

does the ray intersect with ( object)

また

returnRayIntersections(ray);

最後に、GLUTでOpenGLを使用しています。

みんなありがとう、ローレンス

4

2 に答える 2

3

OpenGL選択モードを使用するのがこれを行うための最良の方法です。これは、球だけでなく、任意に複雑なレンダリングを処理できるためです。これに関する多くのチュートリアルを見ることができますが、大まかに言うと、GLを選択モードに設定することから始めます。

glRenderMode (GL_SELECT);

次に、レンダリングするフラグメントの名前をキャプチャする選択バッファを設定した後、シーンを描画します。この記事から始めましょう。

Neheのチュートリアルは長いですが、とても良いです。

于 2009-12-31T02:46:40.747 に答える
1

OpenGLでピッキングを実装するもう1つの良い方法は、次のとおりです。

選択するプリミティブごとに固有の色を使用して、シーンをバックバッファに描画します。24ビットモードを使用している場合、色は単純に#000001、#000002などになります。指定した色がピクセルが使用する正確な色になるように、照明や霧などをオフにします。

バックバッファを画面にブリットしないでください(glSwapBuffersを使用しないでください)。代わりに、glReadPixelsを使用して、GLバックバッファをメモリバッファに読み込みます。この後、画面上のマウスの位置に対応するピクセル値を読み取ることができるメモリビットマップができます。これから読み取ったカラー値は、プリミティブに簡単にマッピングできます(#000001、#000002などになるため)。

このスタイルの選択に関する詳細は次のとおりですこれは、GL_SELECTIONモードに比べて1つの利点があるため、私が使用したいものです。3Dシーンが変化せず、マウスがその上を移動している場合、メモリビットマップ内の適切なピクセルを参照するだけで、バックバッファーのコピーを1つ取得し、マウスの下にあるエンティティをすばやく推定できます。シーンが変わるまで、GL呼び出しをまったく使用する必要はありません。私のアプリケーションでは、3Dシーン上に多くのマウスを置いており、マウスがどのエンティティの上に浮かんでいるかをすばやく知る必要があるため、この方法は非常に高速であることがわかりました。

于 2009-12-31T03:01:08.097 に答える