2015-05-30 55 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