2015-07-04 30 views
1

隨着我的代碼,當我旋轉Modelview;它會分別旋轉每個對象。
我想旋轉整個視圖平面。我怎樣才能做到這一點?OpenGL旋轉場景不如預期

我知道gluLookAt,但我想了解這背後的數學。

這是我的代碼:
Prepare_scene只叫在OpenGL的初始化和窗口重塑

// 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); 

回答

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();