为什么此程序没有正确移动相机?

时间:2010-12-26 05:16:11

标签: opengl camera 3d

在按下向下键的同时,我希望茶壶能够被拉得更远,但它仍保持相同的大小。为什么?

注意:这是家庭作业,我不允许使用glTranslate

#include <stdlib.h>
#include <stdio.h>
#include <GL/glut.h>
#include <GL/gl.h>


void display(void);

class Camera {


public: float eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ;
        float aimX, aimY, aimZ; 

        Camera () {

        eyeX = 0.0f ;
        eyeY = 0.0f;
        eyeZ = 0.5f ;

        centerX = 0.0f;
        centerY = 0.0f;
        centerZ = 0.0f;

        upX = 0.0f;
        upY = 1.0f;
        upZ = 0.0f; 

    }


    void move_camera(double speed) {

        aimX = centerX - eyeX;
        aimY = centerY - eyeY;
        aimZ = centerZ - eyeZ;



        eyeX += aimX * speed;
        eyeY += aimY * speed;
        eyeZ += aimZ * speed;

        centerX += aimX *speed;
        centerY += aimY *speed;
        centerZ += aimZ *speed;

    }

};






Camera camera; 

void init(void){

    glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW);

    glLoadIdentity();


}


void specialKeys(int key, int x, int y){


    if (key==GLUT_KEY_UP){
        camera.move_camera(0.03f);
        display();
    }

    if (key==GLUT_KEY_DOWN){
        camera.move_camera(-0.03f);
        display();

    }

}

void reshape(int w, int h){

    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0f, (float)w/(float)h, 0.0f, 200.0f); // fov, aspect ratio, ncp, fcp 
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();   

    //gluLookAt(camera.eyeX, camera.eyeY, camera.eyeZ, // eye 
    //        camera.centerX, camera.centerY, camera.centerZ, // center
    //        camera.upX, camera.upY, camera.upZ // up 
    //
    //);


}


void display(void){


    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();


    gluLookAt(camera.eyeX, camera.eyeY, camera.eyeZ, // eye 
              camera.centerX, camera.centerY, camera.centerZ, // center
              camera.upX, camera.upY, camera.upZ // up 
    );

    //glTranslatef(0.0,0.0,1.0f);
    glutWireTeapot(0.5f);



    glutSwapBuffers();
    glFlush();

}


int main (int argc, char *argv[]){

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
    //glutCreateWindow(argv[0]);
    glutInitWindowPosition(500,200);
    glutInitWindowSize(800,600);
    glutCreateWindow("fgh");
    init();

    glutDisplayFunc(display);

    glutSpecialFunc(specialKeys);

    glutIdleFunc(display);

    glutMainLoop();

    return 0;

}

2 个答案:

答案 0 :(得分:1)

您的投影矩阵已损坏。

gluPerspective(45.0f, (float)w/(float)h, 0.0f, 200.0f); // fov, aspect ratio, ncp, fcp 

第三个参数是近剪裁平面的距离。它不能等于0,因为这意味着您需要一个无限精度的深度缓冲区。设为0.10.01

答案 1 :(得分:-1)

我错过了对glutReshapeFunc(reshape);的电话。而已。