基本的な状況は次のとおりです。2Dシンボル(たとえば、ポリゴンやラインストリップなど、基本的には単純なスプライト)を描画するOpenGLVBOがあります。原点(0、0)の周りの頂点を定義し、画面のピクセルで目的のシンボルサイズを取得できるようにしました。
私の現在のシーンは、モデルの特定の領域を表示するために、翻訳、スケーリング、およびオルソ投影されています。ここで、特定のモデルの場所を中心に、モデルに合わせて拡大縮小されないようにシンボルを描画します(つまり、VBOで定義されている画面のピクセルサイズに描画します)。シンボルの頂点バッファをプログラムで再入力することなく、これを実行したいと思います(つまり、変換やスケーリングを使用して、画面のピクセルでシンボルを目的の場所に描画したいのですが、 「モデル」座標で定義されます)。
簡単な例:経度と緯度を使用した地図が表示され、ユーザーは世界の特定の領域にパンおよびズームしました。ユーザーが興味のあるサイトをクリックし、その時点で「星」を表示したいと思います。星は地図とともにパンしますが、ユーザーがズームインまたはズームアウトしても同じサイズのままです。したがって、どの時点でも、星を「中心」にする場所(経度、緯度座標)がわかり、目的のサイズ(原点を中心)の星に対して(ピクセル座標で)定義されたVBOがあります。
では、この場合、「スケーリングされていない」シンボル/スプライトをレンダリングするための「最良の」方法は何でしょうか。
どこに行けばいいのかはわかっていると思いますが、(1)アプローチが正しいかどうかわからない、(2)思った通りに動かないようです。これが私の一般的な考えのいくつかの擬似コードです:
void DrawSymbol()
{
...
[Not Shown: Determine the screen coordinates of the symbol's desired model location]
gl.MatrixMode(GL_PROJECTION);
gl.PushMatrix(); // Store the current projection
gl.LoadIdentity(); // Set projection to identity (no projection)
gl.MatrixMode(GL_MODELVIEW);
gl.PushMastrix(); // Store the current model view (was scaled and translated)
gl.LoadIdentity(); // Set model view matrix to identity (1-to-1 with screen coords)
[Not Shown: Translate the model view so that the origin is at the desired screen coordinate found above]
[Not Shown: Draw the VBO for the symbol] // should draw to raw screen pixels, right?
gl.MatrixMode(GL_MODELVIEW);
gl.PopMatrix(); // Set model view matrix to previous value -- should only effect any future renders, right?
gl.MatrixMode(GL_PROJECTION);
gl.PopMatrix(); // Set projection matrix to previous value -- again, should only effect any future renders, right?
...
}
私はこれを試しましたが(実際には、翻訳されたVBOを使用するのではなく、目的の画面位置に単純なLineStripを直接レンダリングして試しましたが、テストのためだけに)、機能しなかったようです。しかし、理由はわかりません。アプローチは健全に見えますか?
提案?