電腦圖形學OpenGL
— —鍵盤控制三維汽車
最終實現效果:
原始碼:
#include "stdafx.h"#include <windows.h>#include <gl/gl.h>#include <gl/glu.h>#include <gl/glut.h>#include <math.h>static GLfloat xRot = 0.0f;static GLfloat yRot = 0.0f;void Display(void){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glRotatef(xRot, 1.0f, 0.0f, 0.0f); //繞x軸旋轉glRotatef(yRot, 0.0f, 1.0f, 0.0f); //繞y軸旋轉//車下半部glBegin(GL_POLYGON);glColor3f(0.1, 0.1, 0.8);glVertex3f(-40.0f,0.0f,15.0f);glVertex3f(40.0f,0.0f,15.0f);glColor3f(1, 0.5, 0.8);glVertex3f(40.0f,-15.0f,15.0f);glVertex3f(-40.0f,-15.0f,15.0f);glEnd();glBegin(GL_POLYGON);glColor3f(0.3, 0.2, 0.5);glVertex3f(40.0f,0.0f,-15.0f);glVertex3f(40.0f,0.0f,15.0f);glVertex3f(40.0f,-15.0f,15.0f);glVertex3f(40.0f,-15.0f,-15.0f);glEnd();glBegin(GL_POLYGON);glColor3f(0.3, 0.1, 0.3);glVertex3f(-40.0f,0.0f,-15.0f);glVertex3f(-40.0f,0.0f,15.0f);glVertex3f(-40.0f,-15.0f,15.0f);glVertex3f(-40.0f,-15.0f,-15.0f);glEnd(); glBegin(GL_POLYGON);glColor3f(0.1, 0.1, 0.8);glVertex3f(-40.0f,0.0f,-15.0f);glVertex3f(40.0f,0.0f,-15.0f);glColor3f(1, 0.5, 0.8);glVertex3f(40.0f,-15.0f,-15.0f);glVertex3f(-40.0f,-15.0f,-15.0f);glEnd();glBegin(GL_POLYGON);glColor3f(0, 0, 1);glVertex3f(-40.0f,0.0f,15.0f);glVertex3f(-40.0f,0.0f,-15.0f);glVertex3f(40.0f,0.0f,-15.0f);glVertex3f(40.0f,0.0f,15.0f);glEnd();glBegin(GL_POLYGON);glColor3f(0.8, 0.5, 0.2);glVertex3f(-40.0f,-15.0f,15.0f);glVertex3f(-40.0f,-15.0f,-15.0f);glVertex3f(40.0f,-15.0f,-15.0f);glVertex3f(40.0f,-15.0f,15.0f);glEnd();//車上半部glBegin(GL_POLYGON);glColor3f(0, 0, 1);glVertex3f(-20.0f,0.0f,15.0f);glVertex3f(-10.0f,10.0f,15.0f);glVertex3f(20.0f,10.0f,15.0f);glVertex3f(25.0f,0.0f,15.0f);glEnd();glBegin(GL_POLYGON);glColor3f(0, 0, 1);glVertex3f(-20.0f,0.0f,-15.0f);glVertex3f(-10.0f,10.0f,-15.0f);glVertex3f(20.0f,10.0f,-15.0f);glVertex3f(25.0f,0.0f,-15.0f);glEnd();glBegin(GL_POLYGON);glColor3f(0, 1, 1); glVertex3f(-10.0f,10.0f,15.0f); glVertex3f(-10.0f,10.0f,-15.0f);glVertex3f(20.0f,10.0f,-15.0f);glVertex3f(20.0f,10.0f,15.0f);glEnd(); glBegin(GL_POLYGON);glColor3f(0.5, 0.8, 0.8); glVertex3f(-10.0f,10.0f,15.0f);glVertex3f(-20.0f,0.0f,15.0f);glVertex3f(-20.0f,0.0f,-15.0f); glVertex3f(-10.0f,10.0f,-15.0f);glEnd();glBegin(GL_POLYGON);glColor3f(0, 0.5, 0.5);glVertex3f(20.0f,10.0f,15.0f);glVertex3f(20.0f,10.0f,-15.0f);glVertex3f(25.0f,0.0f,-15.0f);glVertex3f(25.0f,0.0f,15.0f);glEnd();glBegin(GL_POLYGON);glColor3f(0, 0, 1);glVertex3f(-30.0f,-15.0f,15.0f);glVertex3f(-30.0f,-15.0f,-15.0f);glVertex3f(30.0f,-15.0f,-15.0f);glVertex3f(30.0f,-15.0f,15.0f);glEnd();//車輪glColor3f(1, 0, 0);glTranslated(-20.0f,-15.0f,15.0f); glutSolidTorus(2,5,5,100);glTranslated(0.0f,0.0f,-30.0f); glutSolidTorus(2,5,5,100);glTranslated(45.0f,0.0f,0.0f); glutSolidTorus(2,5,5,100);glTranslated(0.0f,0.0f,30.0f); glutSolidTorus(2,5,5,100); glPopMatrix();glutSwapBuffers(); //交換緩衝}//定義鍵盤控制函數void SpecialKeys(int key, int x, int y){ if(key == GLUT_KEY_UP)xRot-= 5.0f; if(key == GLUT_KEY_DOWN)xRot += 5.0f;if(key == GLUT_KEY_LEFT)yRot -= 5.0f;if(key == GLUT_KEY_RIGHT)yRot += 5.0f;glutPostRedisplay(); // 重新整理視窗}int main(int argc, char* argv[]){ glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);glutCreateWindow("車");glClearColor(0.0f, 0.0f, 0.0f, 1.0f );glEnable(GL_DEPTH_TEST);glShadeModel(GL_SMOOTH);glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho (-100, 100, -100, 100,-100, 100);glutSpecialFunc(SpecialKeys); //註冊功能鍵回呼函數glutDisplayFunc(Display);glutMainLoop();return 0;}