OpenGL-GLUT tutorial (8) glut scenario Roaming II

Source: Internet
Author: User

GLUT Tutorial Keyboard example ------ Scenario roaming II  In this section, let's take a look at the previous example. This time we will use advanced keyboard control. In the initialization section, we have two variables: deltaangle and deltamode. These variables control rotation and movement of cameras. When the value is not 0, the camera performs some operations. When the value is 0, the camera does not move. The initial values of these two variables are 0, that is, the initial state of the camera does not move.
#include <math.h>
#include <GL/glut.h>
 
float angle=0.0,deltaAngle = 0.0,ratio;
float x=0.0f,y=1.75f,z=5.0f;
float lx=0.0f,ly=0.0f,lz=-1.0f;
GLint snowman_display_list;
int deltaMove = 0;
 
 
void changeSize(int w, int h)
         {
         // Prevent a divide by zero, when window is too short
         // (you cant make a window of zero width).
         if(h == 0)
                 h = 1;
 
         ratio = 1.0f * w / h;
         // Reset Projection Matrix
         glMatrixMode(GL_PROJECTION);
         glLoadIdentity();
         
         // Set the size of the view.
         glViewport(0, 0, w, h);
 
         // Set the visible space
         gluPerspective(45,ratio,1,1000);
         glMatrixMode(GL_MODELVIEW);
         glLoadIdentity();
         gluLookAt(x, y, z, 
                       x + lx,y + ly,z + lz,
                           0.0f,1.0f,0.0f);
 
 
         }
 
 
void drawSnowMan() {
         glColor3f(1.0f, 1.0f, 1.0f);
// Draw Body     
         glTranslatef(0.0f ,0.75f, 0.0f);
         glutSolidSphere(0.75f,20,20);
 
// Draw Head
         glTranslatef(0.0f, 1.0f, 0.0f);
         glutSolidSphere(0.25f,20,20);
 
// Draw Eyes
         glPushMatrix();
         glColor3f(0.0f,0.0f,0.0f);
         glTranslatef(0.05f, 0.10f, 0.18f);
         glutSolidSphere(0.05f,10,10);
         glTranslatef(-0.1f, 0.0f, 0.0f);
         glutSolidSphere(0.05f,10,10);
         glPopMatrix();
 
// Draw Nose
         glColor3f(1.0f, 0.5f , 0.5f);
         glRotatef(0.0f,1.0f, 0.0f, 0.0f);
         glutSolidCone(0.08f,0.5f,10,2);
}
 
GLuint createDL() {                          //Returns a display list.
         GLuint snowManDL;
 
         // Create the id for the list
         snowManDL = glGenLists(1);
 
         // start list
         glNewList(snowManDL,GL_COMPILE);
 
         // call the function that contains 
         // the rendering commands
                 drawSnowMan();
 
         // endList
         glEndList();
 
         return(snowManDL);
}
 
void initScene() {
 
         glEnable(GL_DEPTH_TEST);
         snowman_display_list = createDL();
 
}
 
void orientMe(float ang) {
         lx = sin(ang);
         lz = -cos(ang);
         glLoadIdentity();
         gluLookAt(x, y, z, 
                       x + lx,y + ly,z + lz,
                           0.0f,1.0f,0.0f);
}
 
void moveMeFlat(int i) {
         x = x + i*(lx)*0.1;
         z = z + i*(lz)*0.1;
         glLoadIdentity();
         gluLookAt(x, y, z, 
                       x + lx,y + ly,z + lz,
                           0.0f,1.0f,0.0f);
}
The following code is different from the previous one. The following function first checks whether the two variables we define are 0. If it is not 0, the corresponding function is called to control the movement and rotation of the camera.
void renderScene(void) {
 
         if (deltaMove)
                 moveMeFlat(deltaMove);
         if (deltaAngle) {
                 angle += deltaAngle;
                 orientMe(angle);
         }
         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Draw ground
         glColor3f(0.9f, 0.9f, 0.9f);
         glBegin(GL_QUADS);
                 glVertex3f(-100.0f, 0.0f, -100.0f);
                 glVertex3f(-100.0f, 0.0f, 100.0f);
                 glVertex3f( 100.0f, 0.0f, 100.0f);
                 glVertex3f( 100.0f, 0.0f, -100.0f);
         glEnd();
// Draw 36 SnowMen
         for(int i = -3; i < 3; i++)
                 for(int j=-3; j < 3; j++) {
                          glPushMatrix();
                          glTranslatef(i*10.0,0,j * 10.0);
                          glCallList(snowman_display_list);;
                          glPopMatrix();
                 }
         glutSwapBuffers();
}
The following functions are the callback functions of the special key control we registered, and the release of the key (the release of the key ).
void pressKey(int key, int x, int y) {
 
         switch (key) {
                 case GLUT_KEY_LEFT : 
                          deltaAngle = -0.01f;break;
                 case GLUT_KEY_RIGHT : 
                          deltaAngle = 0.01f;break;
                 case GLUT_KEY_UP : 
                          deltaMove = 1;break;
                 case GLUT_KEY_DOWN : 
                          deltaMove = -1;break;
         }
}
 
void releaseKey(int key, int x, int y) {
 
         switch (key) {
                 case GLUT_KEY_LEFT : 
                 case GLUT_KEY_RIGHT : 
                          deltaAngle = 0.0f;break;
                 case GLUT_KEY_UP : 
                 case GLUT_KEY_DOWN : 
                          deltaMove = 0;break;
         }
}
There are three new lines of code in the main function.
 
The glutignorekeyrepeat function transmits a non-zero value to tell glut not to send the keyborad repeat message. Then, the gluspecialupfunc and glukeyboardupfunc call the registered callback function.
 
 
int main(int argc, char **argv)
{
         glutInit(&argc, argv);
         glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
         glutInitWindowPosition(100,100);
         glutInitWindowSize(640,360);
         glutCreateWindow("SnowMen from 3D-Tech");
 
         initScene();
 
         glutIgnoreKeyRepeat(1);
         glutSpecialFunc(pressKey);
         glutSpecialUpFunc(releaseKey);
 
         glutDisplayFunc(renderScene);
         glutIdleFunc(renderScene);
 
         glutReshapeFunc(changeSize);
 
         glutMainLoop();
 
         return(0);
}
You can download this section of the vc6 ). You can also change the camera settings function.
Http://www.lighthouse3d.com/opengl/glut/index.php? 8)

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.