1

シンプルな 3D シーンを表す研究プロジェクトがあります。モデル ビュー マトリックスを変更して、原点以外のポイントに視点を移動しgluLookAt()、ワイヤ球を原点に配置しています。そして最後に、 を使用していくつかのパラメーターを使用して正射影を受け取るように射影行列を変更していますglOrtho()。しかし、ウィンドウのサイズを変更すると、球が歪んでしまいます。機能を変更する必要があると思いますreshape()glOrtho()、どうすればよいですか?

void display(void){
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3b(197, 96, 63);
    glLoadIdentity();    
    gluLookAt(2, 0.5 ,2, 0, 0, 0, 0, 1, 0);
    glutWireSphere(0.2, 20, 10);  
    glFlush();
}

void reshape(int w, int h){
    glViewport(0, 0, (GLsizei) w, (GLsizei) h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-1, 1, -1, 1, 0.8 , 100);
    glMatrixMode(GL_MODELVIEW);
}
4

3 に答える 3

3

コメントで述べたように、ウィンドウに合うように正投影を設定する必要があります。サイズを変更する前にOpenGLウィンドウが正方形として始まったと仮定すると、(-1, 1, -1, 1, ...)は正方形の座標系を想定していました。ウィンドウのアスペクト比をより適切に反映するように変更すると、見栄えが良くなるはずです。次のことを試してください。

glOrtho ((float)w/(float)h, (float)-w/(float)h, -1, 1, 0.8, 100);

これにより、設定したとおりの座標系が維持されますが、アスペクト比(幅による)は尊重されます。

于 2013-02-27T09:11:40.510 に答える
2

まず、問題とはまったく関係ありません。現在持っているものをすべて移動しreshapeて表示します。はい、私は多くのチュートリアルがあなたがそれをしたようにそれを持っていることを知っています、しかし私を信じてください、それはこの方法でそれをしないとき物事をとても明確にします。


ここであなたの質問について:Orthoはビュースペースにボリュームを設定します。これはビューポート座標にマッピングされています。glOrthoの(下、左)コーナーはglViewportの(x、y)にマップされ、(top、right)はglViewportの(x、y)+(width、height)にマップされます。

したがって、glOrthoパラメータをビューポートのアスペクト比に調整する必要があります。簡単:

void display(void)
{
    int const win_width  = glutGet(GLUT_WINDOW_WIDTH);
    int const win_height = glutGet(GLUT_WINDOW_HEIGHT);
    float const win_aspect = (float)win_width / (float)win_height;

    glClear(GL_COLOR_BUFFER_BIT);
    glViewport(0, 0, win_width, win_height);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-win_aspect, win_aspect, -1, 1, 0.8 , 100);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();    
    gluLookAt(2, 0.5 ,2, 0, 0, 0, 0, 1, 0);

    glColor3b(197, 96, 63);
    glutWireSphere(0.2, 20, 10);  
    glFlush();
}
于 2013-02-27T09:22:16.217 に答える
0

現時点ではglOrtho(-1, 1, -1, 1, 0.8 , 100);、幅と高さが等しくないため、ウィンドウをで2次出力に投影します。歪みを防ぐために、最初の4つのパラメータをウィンドウの現在のアスペクト比に変更する必要があります。好き

glOrtho(-w/2f, w/2f, -h/2f, h/2f, 0.8 , 100);

(私の例では、投影面が自分の球よりも大きくなるため、球を大きくする必要があります。)

于 2013-02-27T09:10:24.813 に答える