使用GLUT在3d空间中围绕原点旋转

时间:2017-04-17 01:14:05

标签: c glut

我试图让这个代码在使用过剩的Visual Studio 2012中工作。它呈现了一个10/10 3D网格,但它不会响应我从键盘输入的内容。当我按下左箭头键时,我试图让相机围绕原点旋转。

//此示例显示如何为3D图形创建相机。

#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif

#include <iostream>
#include <cmath>
#include <math.h>

using namespace std;

int g_winWidth  = 1024;
int g_winHeight = 512;
bool keyStatus[256];

float angle = 0.0f; //angle for rotating camera
float beginning_angle = 0.0f;

float cx = 10.0, cy = 10.0, cz = -10.0;

void initialGL()
{
    glEnable(GL_DEPTH_TEST);

    glClearColor (1.0f, 1.0f, 1.0f, 0.0f);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glMatrixMode (GL_MODELVIEW);
    glLoadIdentity();
}

//initialize the keyboard keys 
void initialization()
{
    for(int i =0; i<256; i++)
        keyStatus[i] = false;
}

//function to draw the colored x,y, and z axis
void drawCS()
{
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glScalef(10.0f, 10.0f, 10.0f);

    glLineWidth(2.5f);
    glBegin(GL_LINES);

    //axis x
    glColor3f(1.0f, 0.0f, 0.0f);
    glVertex3f(0.0f, 0.0f, 0.0f);
    glVertex3f(0.3f, 0.0f, 0.0f);

    //text x
    glVertex3f(0.4f, 0.05f, 0.0f);
    glVertex3f(0.5f, -0.05f, 0.0f);
    glVertex3f(0.4f, -0.05f, 0.0f);
    glVertex3f(0.5f, 0.05f, 0.0f);

    //axis y
    glColor3f(0.0f, 1.0f, 0.0f);
    glVertex3f(0.0f, 0.0f, 0.0f);
    glVertex3f(0.0f, 0.3f, 0.0f);

    //text y
    glVertex3f(0.0f, 0.5f, 0.0f);
    glVertex3f(0.0f, 0.4f, 0.0f);
    glVertex3f(-0.05f, 0.55f, 0.0f);
    glVertex3f(0.0f, 0.5f, 0.0f);
    glVertex3f(0.05f, 0.55f, 0.0f);
    glVertex3f(0.0f, 0.5f, 0.0f);

    //axis z
    glColor3f(0.0f, 0.0f, 1.0f);
    glVertex3f(0.0f, 0.0f, 0.0f);
    glVertex3f(0.0f, 0.0f, 0.3f);

    //text z
    glVertex3f(-0.025f, 0.025f, 0.4f);
    glVertex3f(0.025f, 0.025f, 0.4f);
    glVertex3f(0.025f, 0.025f, 0.4f);
    glVertex3f(-0.025f, -0.025f, 0.4f);
    glVertex3f(-0.025f, -0.025f, 0.4f);
    glVertex3f(0.025f, -0.025f, 0.4f);

    glEnd();
    glLineWidth(1.0f);

    glPopMatrix();
}

//function to draw the grid
void drawGrid()
{
    int size = 10;  // determining the grid size and the numbers of cells
    if(size%2 != 0) ++size;

    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    //glScalef(30.0f, 30.0f, 30.0f);
    glBegin(GL_LINES);
    for (int i =0; i<size+1; i++) {
        if((float)i == size/2.0f) {
            glColor3f(0.0f, 0.0f, 0.0f);
        } else {
            glColor3f(0.8f, 0.8f, 0.8f);
        }
        glVertex3f(-size/2.0f, 0.0f, -size/2.0f+i);
        glVertex3f(size/2.0f, 0.0f, -size/2.0f+i);
        glVertex3f(-size/2.0f+i, 0.0f, -size/2.0f);
        glVertex3f(-size/2.0f+i, 0.0f, size/2.0f);
    }
    glEnd();
    glPopMatrix();
}

//function to display everything that is happening in window
void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    drawGrid();// call to function to draw the grid
    drawCS();//call to function to draw the x,y,z axis 


    glutSwapBuffers();
}

void reshape(int w, int h)
{
    g_winWidth = w;
    g_winHeight = h;

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    //this function sets the initial position of the camera in 3D space
    /*
    Need to find a way to rotate around the origin from left to right 
    */

    gluLookAt( cx, cy, cz,  //camera position
                0.0f, 0.0f, 0.0f, //what camera looks at
                0.0f, 1.0f, 0.0f); //


    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45, g_winWidth/g_winHeight, 0.1, 100);//specifies the view for the scene

    glViewport(0, 0, w, h);
    //angle += 0.1f;
}

//keyboard function for the exit key
void keyboard(unsigned char key, int x, int y)
{
    keyStatus[key] = true;
    switch (key) {
        case 27:
            exit(0);
            break;

        default:
            break;
    }
}


//sets the keyboard callback to the current window 
void keyboardUp(unsigned char key, int x, int y)
{
    keyStatus[key] = false;
}


//function for arrow keys output
void processSpecialKeys(int key, int xx, int yy) {

    switch(key) {
        case GLUT_KEY_LEFT :
            //What the left arrow key does
            angle -= 0.01f;
            cx = sin(angle);
            cz = -cos(angle);
            break;
        case GLUT_KEY_RIGHT :
            //What the right arrow key does
            break;
        case GLUT_KEY_UP :
            //What the up arrow key does    
            break;
        case GLUT_KEY_DOWN :
            //What the down arrow key does
            break;
    }
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(g_winWidth, g_winHeight);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("Camera");
    initialGL();

    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutIdleFunc(display);

    glutKeyboardFunc(keyboard);
    glutKeyboardUpFunc(keyboardUp);
    glutSpecialFunc(processSpecialKeys);


    glEnable(GL_DEPTH_TEST);
    initialization();

    glutMainLoop();
    return 1;//changed from EXIT_SUCCESS

}

0 个答案:

没有答案