【问题标题】:OpenGL rotate scene not as expectedOpenGL旋转场景不如预期
【发布时间】:2015-07-04 02:03:41
【问题描述】:

使用我的代码,当我旋转模型视图时;它单独旋转每个对象。
我正在尝试旋转整个视图平面。我怎样才能做到这一点?

我知道 gluLookAt,但我正试图了解这背后的数学原理。

这是我的代码:
Prepare_scene 仅在 opengl init 和窗口重塑时调用

// prepare_scene
    glViewport(0, 0, windowWidth, windowHeight); 

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity(); 

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glOrtho(0, windowWidth, 0, windowHeight, 0, 40); 

    glEnable(GL_DEPTH_TEST);    

    glShadeModel(GL_SMOOTH);                            // Enable Smooth Shading

    glClearDepth(1.0f);                                 // Depth Buffer Setup
    glEnable(GL_DEPTH_TEST);                            // Enables Depth Testing
    glDepthFunc(GL_LEQUAL);                             // The Type Of Depth Testing To Do
    glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);

    glEnable(GL_POINT_SMOOTH);
    glPointSize(4); 

    glClearColor(0.0f, 0.0f, 0.0f, 1);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

每个绘图帧都会调用渲染

// render

        glClearColor(0.0f, 0.0f, 0.0f, 1); // black
        //glClearColor(1.0f, 1.0f, 1.0f, 1); // white
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        //

        // try to control the camera
        // push_matrix (and at the end of render, add pop_matrix)
        glMatrixMode(GL_MODELVIEW);
        glPushMatrix();

        glTranslatef(eye_x, eye_y, eye_z);
        glRotatef(x_angular, 0, 1, 0); 

        // Go back to projection mode
        glMatrixMode(GL_PROJECTION);

        GLfloat mat_black[] = {0.0,0.0,0.0, 1.0};
        // Transparent white-grey window
        GLfloat mat_specular_w[] = {0.8,0.88,0.88, 1.0};
        GLfloat mat_shine_w[] = {20.0};

        glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular_w);
        glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_specular_w);
        glMaterialfv(GL_FRONT, GL_AMBIENT, mat_specular_w);
        glMaterialfv(GL_FRONT, GL_SHININESS, mat_shine_w);  


        // for each object in objects:
                glPushMatrix();

                // object "world coordinates"
                // in glTranslatef(x,y,z); // z is always 0; for this test
                glTranslatef( (*obj_i)->anchor[0] , (*obj_i)->anchor[1], (*obj_i)->anchor[2]);
                glutWireSphere((*obj_i)->r, 15, 15);
                //glutSolidSphere((*obj_i)->r, 30, 30); // (*obj_i)->r

                glPopMatrix();



        glMatrixMode(GL_MODELVIEW);
        glPopMatrix();

        glFlush();

        SwapBuffers(hdc);

【问题讨论】:

    标签: c++ windows opengl rotation


    【解决方案1】:

    Stop doin' weird camera/object stuff the GL_PROJECTION 堆栈。

    将其保存为GL_MODELVIEW

    // Every frame
    
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    // do projection matrix stuff here (gluPerspective(), glOrtho(), etc.)
    glOrtho(0, windowWidth, 0, windowHeight, 0, 40); 
    
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity(); 
    // do camera transform (gluLookAt(), etc.) here
    // I'm guessing this was your camera transform(s):
    glTranslatef(eye_x, eye_y, eye_z);
    glRotatef(x_angular, 0, 1, 0); 
    
    // foreach object:
    glPushMatrix();
    {
        // do whatever
        glTranslatef( (*obj_i)->anchor[0] , (*obj_i)->anchor[1], (*obj_i)->anchor[2]);
        ...
    }
    glPopMatrix();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 2018-01-31
      • 2017-03-07
      • 1970-01-01
      相关资源
      最近更新 更多