4

四角い窓に多角形を描いています。フルスクリーンなどでウィンドウのサイズを変更すると、縦横比が乱れます。参考文献から、縦横比を維持する 1 つの方法を見つけました。コードは次のとおりです。

    void reshape (int width, int height) {
    float cx, halfWidth = width*0.5f;
    float aspect = (float)width/(float)height; 
    glViewport (0, 0, (GLsizei) width, (GLsizei) height);
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glFrustum(cx-halfWidth*aspect, cx+halfWidth*aspect, bottom, top, zNear, zFar);
    glMatrixMode (GL_MODELVIEW);
}

ここで、cx は X の zNear 平面の目の空間の中心です。誰かがこれをどのように計算できるか説明していただければ幸いです。これは、glFrustum() への最初の最初の 2 つの引数の平均であるべきだと思います。私は正しいですか?どんな助けでも大歓迎です。

4

2 に答える 2

7

It looks like what you want to do is maintain the field of view or angle of view when the aspect ratio changes. See the section titled 9.085 How can I make a call to glFrustum() that matches my call to gluPerspective()? of the OpenGL FAQ for details on how to do that. Here's the short version:

fov*0.5 = arctan ((top-bottom)*0.5 / near)
top = tan(fov*0.5) * near
bottom = -top
left = aspect * bottom
right = aspect * top

See the link for details.

于 2012-04-17T04:47:56.163 に答える
1

最初の 2 つの引数は、目の空間における左右のクリッピング プレーンの X 座標です。軸外のトリック (たとえば、複数のモニターで中心から外れた投影を表示する) を行っていない限り、左と右は同じ大きさで反対の符号を持つ必要があります。これにより、 cx 変数がゼロになります。

glFrustrum の理解に問題がある場合は、代わりに gluPerspective をいつでも使用できます。これは、やや単純化されたインターフェイスを備えています。

于 2012-04-17T04:36:08.563 に答える