典型的なOpenGLプロジェクションマトリックス(glFrustumまたはgluPerspectiveから取得するもの)は、カメラポイントを原点に配置します。投影面は(0、0、-1)にあります:カメラの前の1ユニット。
したがって、特定の頂点について、見つける必要があるのは、(0、0、-1)平面への投影で得られるX位置とY位置です。これは技術的には「レイトレーシング」ですが、軸に沿った平面であり、カメラが原点にあるため、実際には単純な計算です。
vec3 newPosition = oldPosition * (-1.0 / oldPosition.z);
この透視投影の下での補間パラメータは、目/カメラ空間ではなく、ウィンドウ空間で線形になることに注意してください。つまり、遠近法による正しい補間はありません。
また、上記の「単純な無気力」はFOVを考慮していないことに注意してください。oldPosition
これを処理するには、パースペクティブ行列の左上部分でのXとYを変換する必要があります。または、射影行列から0,0と1,1の値を抽出し、それらにのXとYを掛けますoldPosition
。これでスケーリングが処理されます。
これの全体的な目標を述べていないので、もう1つ注意してください。
OpenGLでは、単一の投影行列でシーン全体をレンダリングする必要はありません。シーンの一部をオルソグラフィックにレンダリングし、残りのシーンにはパースペクティブマトリックスを使用できます。これは、ゲーム自体が3Dパースペクティブであるのに対し、HUDとテキスト要素が正射投影でレンダリングされるゲームでよく行われます。
これがあなたがしていることであるならば、あなたがする必要があるのは次のようなものだけです:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(...);
glMatrixMode(GL_MODELVIEW);
//Render my perspective stuff here.
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(...);
glMatrixMode(GL_MODELVIEW);
// Render my orthographic stuff here.
透視オブジェクトとオーバーラップする正投影オブジェクトがある場合は、正投影レンダリング中に深度テストをオフにすることをお勧めします。