-2

これは私のreshape funcがどのように見えるかです

`void Reshape(int w, int h)
{
     const float ar = (float)w/(float)h;
     glViewport(0,0,w,h);
     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();              
     gluPerspective(20.0, ar, 1.0, 60.0); // fovy, aspect ratio, zNear, zFar
     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity();          
     gluLookAt(7,7,7,0,-1,0,0,1,0);
}`

ビューを回転させてからウィンドウのサイズを変更すると、カメラはgluLookAtで設定された位置に戻ります。リサイズ後にカメラを回転したままにしたい場合、何を変更すればよいですか?

4

3 に答える 3

0

私はあなたが表示されている別のgluを見ているに違いない. そうです。変形後の次のフレームでこれを拭くだけです。

とにかく、ウィンドウサイズを保存してint w, h;から、ディスプレイにglulookatを表示するか、機能を更新することをお勧めします。または実際には、ビューポートの呼び出しをそこに残すことができます。

これを修正したら、GLUT ではなく GLFW を確認することをお勧めします。

于 2013-05-15T11:14:17.917 に答える
0

displayfunc に glulookat がある場合、カメラを回転させることはできません。

誰が言ったのですか?次のスニペットで使用されている「クラス Camera」のコードを開示するつもりはありませんが、セマンティクスは非常に明確なはずです。

void reshape(int w, int h) {
    g_width = w; g_height = h;
    glViewport (0, 0, (GLsizei) w, (GLsizei) h);
    ::glutPostRedisplay();
} 


void display(void) {
    /* 
       ...
    */    
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity();
    /* 
       ...
    */    
    gluPerspective(60.0, g_width/g_height, 0.1, 100.0);

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity();
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearColor(0.2,0.2,0.2,1.0);

    real* polar = &(Camera::get_instance()->polar[0]);

    gluLookAt(polar[0]*cos(polar[2])*sin(-polar[1]), 
              polar[0]*cos(polar[1]),
              polar[0]*sin(-polar[2])*sin(-polar[1]), 
              0,0,0, // look_at
              0.0f, 1.0f, 0.0f);

    /* 
        building the scene 
        [...] 
    */
}

g_width と g_height は、モジュール スコープの変数です。

于 2013-05-15T12:15:05.433 に答える