• NeHe OpenGL lession 4


    // lession4.c
    
    #include <OpenGL/OpenGL.h>
    #include <GLUT/GLUT.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    /* ASCII code for teh escape key. */
    #define ESCAPE 27
    
    /* The number of our GLUT window */
    int window;
    
    /* rotation angle for the triangle. */
    float rtri = 0.0f;
    
    /* rotation angle for the quadrilateral. */
    float rquad = 0.0f;
    
    /* A general OpenGL initialization function. Sets all of the initial parameters. */
    // We call this right after our OpoenGL window is created.
    void initGL(int width, int height) { 
    	// This will clear The background color to black.
    	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    	glClearDepth(1.0); 			// Enables clearing of the depth buffer
    	glDepthFunc(GL_LESS); 		// The type of test to do.
    	glEnable(GL_DEPTH_TEST); 	// Enables depth testing.
    	glShadeModel(GL_SMOOTH);    // Enalbes smooth color shading.
    
    	glMatrixMode(GL_PROJECTION); 
    	glLoadIdentity(); 			// Reset the projection matrix.
    
    	// calculate the aspect ratio of the window.
    	gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f);
    
    	glMatrixMode(GL_MODELVIEW);
    }
    
    /* The function called when our window is resized (which shouldn't happend, 
       because we're fullscreen) */
    void resizeGLScene(int width, int height) {
    	if (height == 0)  // Prevent a divide by zero if the window is too small. 
    		height = 1;
    
    	glViewport(0, 0, width, height); // Reset the current viewport and perspective transformation
    
    	glMatrixMode(GL_PROJECTION);
    	glLoadIdentity();
    
    	gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f);
    	glMatrixMode(GL_MODELVIEW);
    }
    
    /* The main drawing function. */
    void drawGLScene() {
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear the screen and the depth buffer
    	glLoadIdentity(); // Reset the view.
    
    	glTranslatef(-1.5f, 0.0f, -6.0f); // Move left 1.5 units and into the screen 6.0.
    
    	glRotatef(rtri, 0.0f, 1.0f, 0.0f); // Rotate the triangle on the y axis
    	// Draw a triangel (in smooth coloring mode)
    	glBegin(GL_POLYGON);	// Start drawing a polygon
    		glColor3f(1.0f, 0.0f, 0.0f); 	// set the color to red
    		glVertex3f(0.0f, 1.0f, 0.0f); 	// top
    
    		glColor3f(0.0f, 1.0f, 0.0f); 	// set the color to green.
    		glVertex3f(1.0f, -1.0f, 0.0f); 	// bottom right
    
    		glColor3f(0.0f, 0.0f, 1.0f); 	// set the color to blue.
    		glVertex3f(-1.0f, -1.0f, 0.0f); // bottom left.
    	glEnd(); // we're done with the polygon (smooth color interpolation)
    
    	glLoadIdentity(); 	// make sure we're no longer rotated.
    	glTranslatef(1.5f, 0.0f, -6.0f);   // Move Right 3 Units, and back into the screen 6.0
    
    	glRotatef(rquad, 1.0f, 0.0f, 0.0f); 	// Roate the quad on the x axis
    	// Draw a square (quadrilateral)
    	glColor3f(0.5f, 0.5f, 1.0f);		// set color to a blue shade.
    
    	glBegin(GL_QUADS); 				// Start drawing a polygon (4 sides);
    		glVertex3f(-1.0f,  1.0f, 0.0f);		// top left.
    		glVertex3f( 1.0f,  1.0f, 0.0f); 	// top right.
    		glVertex3f( 1.0f, -1.0f, 0.0f);     // bottom right.
    		glVertex3f(-1.0f, -1.0f, 0.0f); 	// bottom left.
    	glEnd(); 						// done with the polygon.
    
    	rtri += 15.0f;		// Increase the rotation variable for the triangle
    	rquad -= 15.0f; 	// decrease the rotation variable for the quad.
    
    	// swap the buffers to display, since double buffering in used.
    	glutSwapBuffers();
    }
    
    /* The function called whenever a key is pressed. */
    void keyPressed(unsigned char key, int x, int y) {
    	/* sleep to avoid thrashing this procedure */
    	usleep(100);
    
    	/* If escape is pressed, kill everything. */
    	if (key == ESCAPE) {
    		/*shut down our window */
    		glutDestroyWindow(window);
    
    		/* exit the program...normal termination. */
    		exit(0);
    	}
    }
    
    int main(int argc, char **argv) {
    	glutInit(&argc, argv);
    
    	/* Select type of display mode:
    	   Double buffer
    	   RGBA color
    	   Alpha components supported
    	   Depth buffer */
    	 glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH);
    
    	 /* Get a 640 x 480 window */
    	 glutInitWindowSize(640, 480);
    
    	 /* the window starts at teh upper left corner of the screen */
    	 glutInitWindowSize(0, 0);
    
    	 /* Openg a window */
    	 window = glutCreateWindow("Jeff Molofee's GL Code Tutorial ... NeHe '99");
    
    	 /* Register the function to do all our OpenGL drawing. */
    	 glutDisplayFunc(&drawGLScene);
    
    	 /* Go full screen. This is as soon as possible. */
    	// glutFullScreen();
    
    	 /* Even if there are not events, redarw our gl scene. */
    	 glutIdleFunc(&drawGLScene);
    
    	 /* register the function called when our window is resized. */
    	 glutReshapeFunc(&resizeGLScene); 
    
    	 /* Register the function claled when teh keyboard is pressed. */
    	 glutKeyboardFunc(&keyPressed);
    
    	 /* Initialize our window. */
    	 initGL(640, 480);
    
    	 /* start event processing engine. */
    	 glutMainLoop();
    
    	 return 1;
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    主要介绍了旋转



    塞塞塞

  • 相关阅读:
    前端日期格式化
    前端显示省略号
    模糊搜索和时间区间搜索
    数字保持小数点后一位
    每天一个linux命令(tcpreplay)
    每天一个linux命令(find)
    每天一个linux命令(netstat)
    每天一个linux命令(lsof)
    每天一个linux命令(tcpdump)
    每天一个linux命令(route)
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4231740.html
Copyright © 2020-2023  润新知