2015-05-30 56 views
0

我試圖在觸摸F2和F3時改變場景中的視野。 爲此,我有我的specialKey功能如下:GluPerspective表演奇怪

void specialKey(int key, int x, int y) { 
    switch (key) { 
    case GLUT_KEY_F2: 
     changeFOV = true; 
     fovScale = 0.05; 
     break; 
    case GLUT_KEY_F3: 
     changeFOV = true; 
     fovScale = -0.05; 
     break; 
} 

我有打電話myDisplay每個milisecond並且在功能我做了定時功能:

if(changeFOV){ 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    fovAngle += fovScale; 
    gluPerspective(fovAngle, screenWidth/screenHeight, 2, 200); 
    glTranslatef(camera.x, camera.y, camera.z); 
    glMatrixMode(GL_MODELVIEW); 
    changeFOV = false; 
} 

現在我第一次按下F2或F3,場景會縮小到一個像素的大小(aprox),但如果我繼續按F3,則場景會越來越近,然後正常工作(F2和F3)。

fovAngle最初爲60.0f(場景看起來沒有按F2或F3)。

這是我的init()函數:

void init() { 
    glInitNames(); 
    gluPerspective(fovAngle, screenWidth/screenHeight, 2, 200); 
    glTranslatef(camera.x, camera.y, camera.z); 
    glClearColor(0, 0, 0, 1); 
    glViewport(0.0, 0.0, screenWidth, screenHeight); 

    glutInitWindowSize(screenWidth, screenHeight); 
    string windowName = "AMAZING 3D MODELING - "; 
    windowName += (sceneMode ? "Scene" : "Camera"); 
    glutCreateWindow(windowName.c_str()); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 
    glEnable(GL_NORMALIZE); 
    glEnable(GL_COLOR_MATERIAL); 
    glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); 
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); 
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); 
    glLightfv(GL_LIGHT0, GL_POSITION, light_position); 
    glMaterialfv(GL_FRONT, GL_AMBIENT, object_ambient); 
    glMaterialfv(GL_FRONT, GL_DIFFUSE, object_diffuse); 
    glMaterialfv(GL_FRONT, GL_SPECULAR, object_specular); 
    glMaterialfv(GL_FRONT, GL_SHININESS, object_shine); 
    glutDisplayFunc(displayFunc); 
    glutMouseFunc(mouse); 
    glutMotionFunc(motion); 
    glutSpecialFunc(specialKey); 
    glutKeyboardFunc(keyboard); 
    glutTimerFunc(2, idle, 1); 
    glutMainLoop(); 
} 

有什麼想法? (如果需要更多代碼,請詢問我將編輯問題)

回答

3

主要問題是您在OpenGL上下文之前調用GL函數。上下文創建爲glutCreateWindow()的一部分,因此您的所有OpenGL調用(如整個初始投影設置)需要在glutCreateWindow()之後移動

你似乎也錯過了一個電話glutInit(),這應該在一開始。我很驚訝你的代碼在沒有它的情況下工作。

相機翻譯通常應該在模型視圖矩陣模式下。它不會改變幾何結果的位置,但是否則照明將會出錯。

這種行爲的原因很可能是你的相機很遙遠。由於投影/相機未在初始渲染時設置,因此不會應用投影/相機,並且會出現幾何圖形。然後,投影機/相機首次投入使用時,所有東西都會變得很小,因爲您從很遠的地方看它。然後,當您將FOV縮小時,幾何體的大小會增加。

所以,你需要做的是:在開始

  • 添加呼叫glutInit()
  • glutCreateWindow()之後移動所有初始化調用。
  • 在模型查看模式下設置攝像機轉換。
  • 移近相機。

我會將轉換設置放入一個函數中,您可以在init時間以及它發生更改時調用它們。該功能將包含這樣的事情:

void setTransformations() { 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(fovAngle, screenWidth/screenHeight, 2, 200); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glTranslatef(camera.x, camera.y, camera.z); 
} 

然後你初始化過程中調用它:

glutCreateWindow(...); 
setTransformations(); 

當FOV的變化:

if (changeFOV) { 
    fovAngle += fovScale; 
    changeFOV = false; 
    setTransformations(); 
} 
+0

好,太好了,現在它的做工精細! – Javi