1

私はOpenGLSuperBible第4版を使用しています。背が高くて薄いウィンドウで、ビューポートがウィンドウのサイズと一致しているが、正方形のクリッピングボリュームにマップされている場合、画像が歪んで表示される(ビューポートのように背が高くて薄い)方法についての説明があります。

画像を正方形に保つための解決策は、次のコードです。

// Establish clipping volume (left, right, bottom, top, near, far) 
aspectRatio = (GLfloat)w / (GLfloat)h; 
if (w <= h)       
    glOrtho (-100.0, 100.0, -100 / aspectRatio, 100.0 / aspectRatio, 1.0, -1.0);
else       
    glOrtho (-100.0 * aspectRatio, 100.0 * aspectRatio, -100.0, 100.0, 1.0, -1.0);

このコードには説明がありますが、理解できません。アスペクト比に従ってクリッピングボリュームの高さを拡張するのはなぜですか?

4

1 に答える 1

2

OpenGLには、次の2つのアスペクト比に注意する必要があります。

  1. ビューポートのアスペクト比。これは、呼び出し時に指定されます。glViewport
  2. 表示錐台のアスペクト比。これは、正投影(たとえば、によって設定glOrtho)または遠近法(glFrustum、またはgluPerspectiveほとんどの場合に設定)のいずれであっても、投影変換によって指定されます。

ここで、正方形を正方形としてレンダリングし続けるには、2つのアスペクト比が一致している必要があります。ウィンドウのサイズを変更するときは、次の呼び出しでビューポートのアスペクト比を暗黙的に設定します。glViewport( 0, 0, width, height );

gluPerspective2番目のパラメータは表示錐台のアスペクト比であるため、投影変換のアスペクト比を指定することは、を呼び出すときのように明示的です。ただし、、、、などの呼び出しのglOrtho場合glFrustum、表示錐台のアスペクト比は表示ボリュームの幅と高さによって制御されます。あなたが言及した正投影の場合(そして同じ議論が透視投影についても機能します)、ここでの表示ボリュームの幅は右-左、同様に高さは上-下であり、これら2つの量の比率は表示ボリュームのアスペクト比です。 。

ここで、2つのアスペクト比を一致させる必要があることを思い出してください。ビューポートを変更できる可能性は低いです。通常、ウィンドウ内のすべてのピクセルを使用する場合や、オブジェクトがクリップされるリスクがない場合は、ビューポートを取得するために表示ボリュームのアスペクト比を変更する必要があります。合わせる。これを行うには、ビューポートのアスペクト比に基づいて表示ボリュームの幅または高さを変更します。これは、指定したコードに表示されるものです。特に、ビューポートのアスペクト比が1.0より大きい場合(つまり、高さよりも広い場合)、表示ボリュームを広くする必要があります。そのため、左右を乗算しますアスペクト比による。同様に、ビューポートのアスペクトが1.0未満の場合は、表示ボリュームを高くする必要があります。この場合、アスペクト比の逆数(1.0より大きくなります)を使用して、上下に適切なスケーリングを提供ます

于 2013-03-20T23:26:10.037 に答える