0

これは、MFC でプロジェクトを実行するためにこれまで使用してきたCOpenGl コントロールクラスです。
私はすでにこのクラスpanzoom toolfixed zoom infixed zoom outなどの多くのナビゲーション関数を作成しており、その上に画像をレンダリングすることもできました。
そして、これらすべてのナビゲーション タスクで、実装するためにマウス イベントと opengl ウィンドウ座標を使用しました。
現在、プロジェクトの一部 (シェープファイルを使用して tiff 画像を登録する処理を行っています) では、ワールド座標を使用する必要があります。
たとえば、画像をズームして点をクリックしたとします。私がズームしている画像は、opengl ウィンドウのピクセルではありません。
または、opengl でレンダリングされたシェープファイルをズームしてポイントをクリックするとします。たとえば、クリックしたポイントの座標 (65696.5577,43995.3245) メートルを知る必要があります。

どうすればopenglでこのようなことを達成できますか?

  • opengl ウィンドウをクリックしたときにレンダリングされた形状のワールド座標を取得するにはどうすればよいですか?
4

1 に答える 1

0

私が見た多くのアプローチがあります。

  • クリックしたオブジェクトだけに興味がある場合は、すべてのオブジェクトが一意の色でレンダリングされ、マウスの下のピクセルがクリックされるレンダー パスを実行した人もいます。これは信頼できない可能性があり、アンチエイリアシングなどによって壊れるため、お勧めできません。これがすべてのフレームで行われる場合、GPU ドライバーは描画が完了するまで待機し、停止して画像を返してから続行する必要があるため、パフォーマンスはそれほど高くありません。
  • 変換マトリックスを手元に持っている場合は、マウスカーソルの位置を正規化されたデバイス座標に変換できます (-1: 左/下、0: 画面の中央、1: 右/上 - 上/下が混同されている可能性があります)そこに) -1 と 1 の Z で変換を逆にして、衝突を実行できる光線の開始と終了を取得します。統一されたメッシュ クラスを使用している場合、またはシーン内のすべての三角形を反復する方法がある場合、これは簡単です。
  • 上記の 2 つの方法を組み合わせて、深度バッファーから深度を取得し、(線形化する必要があります) それを使用して、光線の近点と遠点の間を補間します。
  • シーン内のすべての三角形を反復処理し、それらを正規化されたデバイス座標に変換してから画面空間に変換し (1 を加算し、画面の幅/高さを掛けて、2 で割ります)、画面空間内の三角形に対して三角形内のポイント チェックを実行します。マウスが上に置かれている三角形を見つけるまでにワールド空間座標を保持している場合は、重心座標を見つけて、各頂点の位置に対して乗算します。
于 2013-09-15T08:31:13.197 に答える