3

正投影のように見えるように遠近投影を調整するにはどうすればよいのでしょうか。たとえば、正投影ではすべてがうまく整列する、それぞれが異なるz値を持つ10x10の点のグリッドがあるとします。透視投影では、もちろん、カメラとz深度を基準にした位置を調整します。各ポイントを、まだ整列して正投影で表示されているように見せるために、どのような調整を行う必要がありますか?(もちろんカメラが動くまで)。

私は、目の位置からz平面を通る光線を計算する線に沿って考えています(それがあなたがそれを呼んでいる場合)、それを表示したいポイントで、必要な深さまで光線を追跡します。これを実装する方法はよくわかりませんが。

4

2 に答える 2

0

典型的な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.

透視オブジェクトとオーバーラップする正投影オブジェクトがある場合は、正投影レンダリング中に深度テストをオフにすることをお勧めします。

于 2011-08-05T22:42:31.570 に答える
-1

OpenGLを使用している場合は、何も実装/計算する必要はありません。必要なのは、を使用してカメラを正射影glOrthoに設定してから、シーン(3Dポイントのグリッド)を設定することだけです。

glFrustum後でカメラが移動すると、このイベントをキャッチし、またはを使用してカメラを透視投影に「リセット」できますgluPerspective。ただし、本当にこれを実行したいことを確認してください。突然の投影の変更は見栄えがよくありません。

カメラプロジェクションの数学をお探しの場合は、このリンクをお勧めします。

http://www.songho.ca/opengl/gl_projectionmatrix.html

于 2011-08-05T22:37:17.467 に答える