ピッキング処理

OpenGLピッキング(ポリゴン選択)処理をするには以下の方法で出来る。ソースコードPython

viewport = glGetIntegerv(GL_VIEWPORT)
glSelectBuffer(BUFMAX)
glRenderMode(GL_SELECT)
…
hits = glRenderMode(GL_RENDER)

この方法でうまく選択出来ないで悩んでいたが、ModelView行列に移動と回転の効果を入れるのを忘れていたためだった。


ポリゴン選択はこの方法で出来たが、これだとMSC.Patranの任意領域のポリゴン(要素)選択が出来ない。しかし、gluProject()で要素の節点座標をオブジェクト座標からウィンドウ座標に変換すれば、2D上で点が任意領域(複数の点で囲まれる領域)の中に入るかどうかという問題になるので、実装できそう。


しかし、1点だけ分からないのは、MSC.Patranでは複数要素の表面のもののみ選択(ピック)出来るが、このやり方が分からない。


glRenderMode(GL_SELECT)を使用した方法では、選択された要素のZ値が取得可能なので、一番手前の1つの要素(フェース)を検索することは可能である。この要素にトポロジー的につながった要素を検索していけば、表面の複数要素を選択できる。このアルゴリズムだと非常に軽いので、この方法で自作アプリ(Calamari)に組み込むつもり。


追記(8/4):
glRenderMode(GL_SELECT)を使用した方法は、選択される要素(ポリゴン)の精度が低い。余計なものまで選択されてしまったり、Z値がうまく手前のものを判定できなかったりした。そこで、視点とマウスクリック位置の座標値をgluUnProject()で取得して、自前で要素選択処理を実装した。パフォーマンスを考えてglRenderMode(GL_SELECT)とのハイブリッドにした。


追記(8/6):
glRenderMode(GL_SELECT)で大量の要素(ポリゴン)を選択するとパフォーマンスが悪いので、自前の要素選択処理のみで実装することにした。