数千行の 3D シーンがあります。マウス カーソルの 10 ピクセル付近にあるすべての 3D ラインを選択できるようにしたい (透視投影を使用)。ユニークな色ベースの方法を使用しようとしました。しかし、この方法は私には適していません。なぜなら、すべての行を選択することはできず、最も近い行だけを選択できるからです。私の問題の受け入れ可能な解決策はありますか? OpenGL または DirectX - それは問題ではありません。
3 に答える
古い OpenGL (<= 2.1) では、選択モードを使用して正確にこれを行うことができます。カーソルgluPickMatrix()
位置の周囲の小さな領域を選択し、選択バッファを初期化し、選択モード ( glRenderMode(GL_SELECT)
) に入り、シーンを再描画するために使用します。次に、選択モードから戻ると、選択バッファは、関心領域に表示されるすべての描画オブジェクトの完全な名前 (実際には ID 番号) になります。glPushName(objIndex)
レンダリングする各オブジェクトの周りに名前 ( ) をプッシュ/ポップするには、描画コードを少し変更する必要があります。
最新のグラフィックス ハードウェアを最も効率的に使用する方法ではありませんが、常に機能します。
それらの線と問題の点の間の距離を計算するだけではどうですか? これは、2D の線から点への距離の計算です。おそらく、Lua インターピーターを呼び出す Python 実行可能ファイルを呼び出す Perl スクリプトを使用して実装でき、それでも 1 秒間に 100,000 個の処理を実行できます。
これは、「私がハンマーしか持っていないとき、すべての問題は釘のように見える」というトンネルビジョンの問題の1つです. ピッキングを行うためにレンダリングを使用する必要はありません。
OpenGL も DirectX も描画のみを行うため、代わりに作業を行うことはありません。シーン内のすべての線を画面に投影し、選択した位置に最も近い点が目的の最大距離よりも近いかどうかをテストする必要があります。ラインを何らかの空間細分構造 (Kd ツリーなど) に保持して、条件に一致しないすべてのラインをすばやく破棄することで、これを加速できます。