您的位置:首页 > 理论基础

基本涵盖计算机图形学所有知识点的一个场景

2016-04-09 01:44 429 查看
#include <GL/glut.h>

#include <stdio.h>

#include <math.h>

#include <stdlib.h>

#include<windows.h>

//#include <glaux.h>

#include<iostream.h>

//#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )

#define PI 3.14159265358979323846f

#define WIDTH 800

#define HEIGHT 600

#define MAX_CHAR 128

static GLfloat angle=0.0f,cangle=0.0f,cangle1=90.0f,pangle=0.0f,pangle1=0.0f,pangle2=0.0f,pangle3=0.0f,pangle4=0.0f,pangle5=0.0f,pangle6=0.0f;

static GLfloat sx=9.5f,sy= 9.5f,sz=5.0f;//太阳坐标

static GLfloat px=-4.0f,py= -3.0f,pz=0.0f;//人坐标

static GLfloat ex=0.0f,ey= 0.0f,ez=-8.0f;//人坐标

static GLfloat cx=0.0f,cy= 0.0f,cz=0.0f;

float theta = PI/2,phi = -PI/2;

static GLfloat xRot = 0.0f;

static GLfloat yRot = 0.0f;

static GLfloat zRot = 0.0f;

GLfloat red,green,blue;

GLint subMenu;

GLenum renderingMode=GL_SMOOTH;

GLuint g_texture = 0;

void init(void)

{

glClearColor(red,green,blue, 0.0);

}

void lighting()

{

// 定义太阳光源,它是一种白色的光源

GLfloat sun_light_position[] = { sx,sy,sz,1.0}; //光源的位置

GLfloat sun_light_ambient[] = {0.0f, 0.0f, 0.0f, 1.0f};//环境光反射

GLfloat sun_light_diffuse[] = {1.0f, 1.0f, 1.0f, 1.0f};//漫反射

GLfloat sun_light_specular[] = {1.0f, 1.0f, 1.0f, 1.0f};//镜面反射

glLightfv(GL_LIGHT0, GL_POSITION, sun_light_position);

glLightfv(GL_LIGHT0, GL_AMBIENT, sun_light_ambient);

glLightfv(GL_LIGHT0, GL_DIFFUSE, sun_light_diffuse);

glLightfv(GL_LIGHT0, GL_SPECULAR, sun_light_specular);

glEnable(GL_LIGHT0);//打开光源

glEnable(GL_LIGHTING);//激活OpenGL光源

glEnable(GL_DEPTH_TEST);//打开深度测试

}

void sun()

{

// 定义太阳的材质并绘制太阳

GLfloat sun_mat_ambient[] = {0.0f, 0.0f, 0.0f, 1.0f};//环境光反射

GLfloat sun_mat_diffuse[] = {0.0f, 0.0f, 0.0f, 1.0f};//漫反射

GLfloat sun_mat_specular[] = {0.0f, 0.0f, 0.0f, 1.0f}; //镜面反射

GLfloat sun_mat_emission[] = {1.0f, 1.0f, 0.0f, 1.0f}; //发射光颜色

GLfloat sun_mat_shininess = 0.0f; //镜面反射指数

glMaterialfv(GL_FRONT, GL_AMBIENT, sun_mat_ambient);

glMaterialfv(GL_FRONT, GL_DIFFUSE, sun_mat_diffuse);

glMaterialfv(GL_FRONT, GL_SPECULAR, sun_mat_specular);

glMaterialfv(GL_FRONT, GL_EMISSION, sun_mat_emission);

glMaterialf (GL_FRONT, GL_SHININESS, sun_mat_shininess);

glTranslatef(sx,sy,sz); //平移

glutSolidSphere(2.0, 40, 32);//绘制太阳

}

void table()

{

GLfloat mat_ambient[] = {0.0f, 0.0f, 0.5f, 1.0f};

GLfloat mat_diffuse[] = {0.0f, 0.0f, 0.5f, 1.0f};

GLfloat mat_specular[] = {0.0f, 0.0f, 1.0f, 1.0f};

GLfloat mat_emission[] = {0.0f, 0.0f, 0.0f, 1.0f};

GLfloat mat_shininess = 30.0f;

glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);

glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);

glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);

glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);

glMaterialf (GL_FRONT, GL_SHININESS, mat_shininess);

glPushMatrix();

glTranslatef(0,-5,2);

//画出桌面:

glPushMatrix();

glScalef(5,.1,5);

glutSolidCube(1);

glColor3f(0.39,0.30,0.1);

glutWireCube(1);

glPopMatrix();

//绘制四个桌腿

glPushMatrix();

glPushMatrix();

glEnable(GL_COLOR_MATERIAL);

glColorMaterial(GL_FRONT,GL_AMBIENT);

glColor4f(1.0,0.05,0.0,0.0);

glTranslatef(2,-1,-2);

glScalef(.1,2,.1);

glutSolidCube(1);

glDisable(GL_COLOR_MATERIAL);

glPopMatrix();

glPushMatrix();

glEnable(GL_COLOR_MATERIAL);

glColorMaterial(GL_FRONT,GL_AMBIENT);

glColor4f(1.0,0.05,0.0,0.0);

glTranslatef(-2,-1,-2);

glScalef(.1,2,.1);

glutSolidCube(1);

glDisable(GL_COLOR_MATERIAL);

glPopMatrix();

glPushMatrix();

glEnable(GL_COLOR_MATERIAL);

glColorMaterial(GL_FRONT,GL_AMBIENT);

glColor4f(1.0,0.05,0.0,0.0);

glTranslatef(-2,-1,2);

glScalef(.1,2,.1);

glutSolidCube(1);

glDisable(GL_COLOR_MATERIAL);

glPopMatrix();

glPushMatrix();

glEnable(GL_COLOR_MATERIAL);

glColorMaterial(GL_FRONT,GL_AMBIENT);

glColor4f(1.0,0.05,0.0,0.0);

glTranslatef(2,-1,2);

glScalef(.1,2,.1);

glutSolidCube(1);

glDisable(GL_COLOR_MATERIAL);

glPopMatrix();

glPopMatrix();

glPopMatrix();

}

void goods()

{

//桌面上摆放物品,茶壶一只,立方体一个,球一个

glPushMatrix();

//茶壶

GLfloat mat_emission2[] = {0.2f, 0.2f, 0.2f, 1.0f};

glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission2);

glColorMaterial(GL_FRONT,GL_AMBIENT);

glTranslatef(0,-4.5,2);

glScalef(.6,1,.6);

glutSolidTeapot(.6);

glDisable(GL_COLOR_MATERIAL);

glPopMatrix();

glPushMatrix();//立方体

GLfloat mat_emission3[] = {0.5f, 0.5f, 0.2f, 1.0f};

glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission3);

glColorMaterial(GL_FRONT,GL_AMBIENT);

glColor4f(1.00,0.91,0.05,0.8);

glTranslatef(-1.3,-4.5,1.5);

glScalef(.6,1.0,2);

glutSolidCube(1);

glPopMatrix();

//球

GLfloat mat_emission4[] = {0.1f, 0.5f, 0.2f, 1.0f};

glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission4);

glTranslatef(.8,-4.7,-0.3);

glRotatef(90,1,0,0);

glScalef(.5,.5,.5);

glutSolidSphere(.5,40,40);

glDisable(GL_COLOR_MATERIAL);

glPopMatrix();

}

void car()

{

//绘制小车

GLfloat mat_ambient1[] = {0.0f, 0.0f, 0.5f, 1.0f};

GLfloat mat_diffuse1[] = {0.0f, 0.0f, 0.5f, 1.0f};

GLfloat mat_specular1[] = {0.0f, 0.0f, 1.0f, 1.0f};

GLfloat mat_shininess1 = 30.0f;

glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient1);

glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse1);

glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular1);

glMaterialf (GL_FRONT, GL_SHININESS, mat_shininess1);

//车上部

glPushMatrix();

glTranslatef(3+cx,-3+cy,2+cz);

glRotatef(cangle1,0,1,0);

glScalef(.5,.5,.5);

glPushMatrix();

glTranslatef(-1,0,-1);

glPushMatrix();

GLfloat mat_emission1[] = {1.0f, 0.3f, 0.0f, 1.0f};

glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission1);

glTranslatef(2,-5,2);

glScalef(2,1,1.5);

glutSolidCube(1);

glPopMatrix();

glPushMatrix();

GLfloat mat_emission5[] = {1.0f, 0.2f, 0.0f, 1.0f};

glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission5);

glTranslatef(2,-6,2);

// glRotatef(angle,0,1,0);

glScalef(4,1,1.5);

glutSolidCube(1);

glPopMatrix();

glPopMatrix();

//四个车轮

glPushMatrix();

GLfloat mat_emission2[] = {0.0f, 0.0f, 0.0f, 1.0f};

glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission2);

glTranslatef(-1,0,-1);

glPushMatrix();

glTranslatef(0.8,-6.8,1.6);

glRotatef(cangle,0,0,1);

glutSolidTorus(.2,.6,5,100);

glPopMatrix();

glPushMatrix();

glTranslatef(2.8,-6.8,1.6);

glRotatef(cangle,0,0,1);

glutSolidTorus(.2,.6,5,100);

glPopMatrix();

glPushMatrix();

glTranslatef(0.8,-6.8,2.4);

glRotatef(cangle,0,0,1);

glutSolidTorus(.2,.6,5,100);

glPopMatrix();

glPushMatrix();

glTranslatef(2.8,-6.8,2.4);

glRotatef(cangle,0,0,1);

glutSolidTorus(.2,.6,5,100);

glPopMatrix();

glPopMatrix();

glPopMatrix();

}

void people()

{

glPushMatrix();

GLfloat mat_ambient1[] = {0.0f, 0.0f, 0.5f, 1.0f};

GLfloat mat_diffuse1[] = {0.0f, 0.0f, 0.5f, 1.0f};

GLfloat mat_specular1[] = {0.0f, 0.0f, 1.0f, 1.0f};

GLfloat mat_shininess1 = 30.0f;

glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient1);

glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse1);

glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular1);

glMaterialf (GL_FRONT, GL_SHININESS, mat_shininess1);

GLfloat mat_emission1[] = {1.0, 0.9f, 0.2f, 1.0f};

GLfloat mat_emission2[] = {1.0, 1.0f, 0.1f, 1.0f};

GLfloat mat_emission3[] = {1.0, 0.7f, 0.1f, 1.0f};

GLfloat mat_emission4[] = {.5, 0.5f, 0.8f, 1.0f};

GLfloat mat_emission5[] = {0.0, 0.0f, 0.0f, 1.0f};

glTranslatef(px,py,pz);

glRotatef(pangle,0.0,1.0,0.0);

//头

glPushMatrix();

glMaterialfv(GL_FRONT, GL_EMISSION,mat_emission1);

glTranslatef(0.0,1.5,0.0);

glScalef(10.0, 10.0, 10.0);

glutSolidSphere(0.04,40,40);

glPopMatrix();

//眼睛

glPushMatrix();

glMaterialfv(GL_FRONT, GL_EMISSION,mat_emission5);

glTranslatef(0.2,1.6,-0.28);

glutSolidSphere(0.06,10,10);

glPopMatrix();

glPushMatrix();

glMaterialfv(GL_FRONT, GL_EMISSION,mat_emission5);

glTranslatef(-0.2,1.6,-0.28);

glutSolidSphere(0.06,10,10);

glPopMatrix();

//身体

glPushMatrix();

glMaterialfv(GL_FRONT, GL_EMISSION,mat_emission2);

glScalef(1.0,2.1,0.5);

glutSolidCube(1);

glPopMatrix();

glPushMatrix();

glPushMatrix();

glTranslatef(0.0,1.0,0.0);

glRotatef(pangle6,1,0,0);

glRotatef(-pangle1,1,0,0);

glPushMatrix();

//左肢上

glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission3);

glTranslatef(0.7,-0.5,0.0);

glScalef(0.2,1.0,0.25);

glutSolidCube(1);

glPopMatrix();

//左肢下

glPushMatrix();

glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission4);

glTranslatef(0.0,-1.0,0.0);

glRotatef(-pangle2,1,0,0);

glTranslatef(0.7,0,0.0);

glRotatef(pangle5,1,0,0);

glTranslatef(0,-0.3,0.0);

glScalef(0.2,0.6,0.25);

glutSolidCube(1);

glPopMatrix();

glPopMatrix();

glPushMatrix();

glTranslatef(0.0,1.0,0.0);

glRotatef(pangle1,1,0,0);

//右肢上

glPushMatrix();

glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission3);

glTranslatef(-0.7,-0.5,0.0);

glScalef(0.2,1.0,0.25);

glutSolidCube(1);

glPopMatrix();

//右肢下

glPushMatrix();

glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission4);

glTranslatef(0.0,-1.0,0.0);

glRotatef(pangle2,1,0,0);

glTranslatef(-0.7,-0.3,0.0);

glScalef(0.2,0.6,0.25);

glutSolidCube(1);

glPopMatrix();

glPopMatrix();

glPopMatrix();

glPushMatrix();

glPushMatrix();

glTranslatef(0.0,-1.2,0.0);

glRotatef(pangle3,1,0,0);

//左腿上

glPushMatrix();

glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission3);

glTranslatef(0.2,-0.3,0.0);

glScalef(0.25,1.2,0.25);

glutSolidCube(1);

glPopMatrix();

//左腿下

glPushMatrix();

glTranslatef(0.0,-0.9,0.0);

glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission4);

glRotatef(pangle4,1,0,0);

glTranslatef(0.2,-0.5,0.0);

glScalef(0.25,1.0,0.25);

glutSolidCube(1);

glPopMatrix();

glPopMatrix();

glPushMatrix();

glTranslatef(0.0,-1.0,0.0);

glRotatef(-pangle3,1,0,0);

//右腿上

glPushMatrix();

glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission3);

glTranslatef(-0.2,-0.3,0.0);

glScalef(0.25,1.2,0.25);

glutSolidCube(1);

glPopMatrix();

//右腿下

glPushMatrix();

glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission4);

glTranslatef(0.0,-0.9,0.0);

glRotatef(pangle4,1,0,0);

glTranslatef(-0.2,-0.5,0.0);

glScalef(0.25,1.0,0.25);

glutSolidCube(1);

glPopMatrix();

glPopMatrix();

glPopMatrix();

glPopMatrix();

}

void house()

{

glPushMatrix();

glEnable(GL_TEXTURE_2D);

glColor3f(1.0,0.0,5.0);

glTranslatef(0.0,0.0,12.0);

glScalef(20,20,1);

glutWireCube(1.0);

glPopMatrix();

glPushMatrix();

glColor3f(1.0,0.0,0.0);

glTranslatef(9,0.0,2);

glScalef(1,15,15);

glutWireCube(1.0);

glPopMatrix();

glPushMatrix();

glColor3f(1.0,0.0,0.0);

glTranslatef(-9,0.0,2);

glScalef(1,15,15);

glutWireCube(1.0);

glPopMatrix();

}

void display()

{

//表示要清除颜色缓冲以及深度缓冲

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// 创建透视效果视图

//GL_MODELVIEW 是模型矩阵GL_PROJECTION 是投影矩阵

glMatrixMode(GL_PROJECTION);

//glLoadIdentity该函数的功能是重置当前指定的矩阵为单位矩阵

glLoadIdentity();

//设置透视投影矩阵

gluPerspective(90.0f, 1.0f, 1.0f, 20.0f);

//GL_MODELVIEW,对模型视景矩阵堆栈应用随后的矩阵操作

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

gluLookAt(ex, ey, ez, 0.0, 0.0, 0.0, 0.0, 0.1, 0.0);

lighting();

glPushMatrix();

sun();

glPopMatrix();

glPushMatrix();

people();

glPopMatrix();

glPushMatrix();

house();

car();

table();

goods();

glPopMatrix();

glPushMatrix();

glPopMatrix();

glutSwapBuffers();

}

void reshape(GLint w,GLint h)

{

// 设置视口大小

glViewport(0, 0, (GLsizei) w, (GLsizei) h);

// 切换矩阵模式为投影矩阵

glMatrixMode(GL_PROJECTION);

// 载入单位矩阵

glLoadIdentity();

// 进行二维平行投影

gluPerspective(65, (GLfloat) w/h, 1.0, 1000); //设置投影矩阵

// 切换矩阵模式为模型矩阵

glMatrixMode(GL_MODELVIEW);

glLoadIdentity(); //变为单位矩阵

// 发送重绘

glutPostRedisplay();

}

void timefuncupdate(int value)

{

sx-=0.3f;

if(sx<-11.0f) sx=11.0f;

glutPostRedisplay();

glutTimerFunc(300,timefuncupdate,0);

}

void keyboard(unsigned char key, int x, int y)

{

display();

switch( key )

{

case 'a':

cangle1=0;

cx+=.1;

cangle+=10;

glutPostRedisplay();

break;

case 'b':

cangle1=0;

cx-=.1;

cangle-=10;

glutPostRedisplay();

break;

case 'c':

cangle1=90;

cz+=.05;

cangle+=10;

glutPostRedisplay();

break;

case 'd':

cz-=.05;

cangle1=90;

cangle-=10;

glutPostRedisplay();

break;

case 'p':

pangle+=10;

glutPostRedisplay();

break;

case 'o':

pz+=0.1;

px+=pz*tan(pangle);

pangle1+=5;

pangle2+=2;

pangle3+=3;

pangle4-=0.8;

if(pangle1>=50) pangle1=-50;

if(pangle2>=40)pangle2=0;

if(pangle3>=30)pangle3=-30;

if(pangle4<=-16)pangle4=0;

glutPostRedisplay();

break;

case 'l':

pangle6+=3;

if(pangle6==30)

pangle6=-30;

pangle5+=5;

if(pangle5==50)

pangle5=-50;

glutPostRedisplay();

break;

case 'x':

ex+=0.03;

glutPostRedisplay();

break;

case 'y':

ex-=0.03;

glutPostRedisplay();

break;

case 'z':

ez+=0.03;

glutPostRedisplay();

break;

case 's':

ex=0.0f;ey= 0.0f;ez=-8.0f;

glutPostRedisplay();

break;

case '1':

glutFullScreen();

glutPostRedisplay();

break;

case '2':

glutPositionWindow(100,100);

glutReshapeWindow(800,600);

break;

case 27: //关闭窗口

exit(0);

};

}

void SpecialKeys(int key, int x, int y)

{

if(key == GLUT_KEY_UP||key == GLUT_KEY_DOWN||key == GLUT_KEY_LEFT||key == GLUT_KEY_RIGHT)

{

pangle1+=1;

pangle2+=.4;

pangle3+=.6;

pangle4-=0.16;

if(pangle1>=50) pangle1=-50;

if(pangle2>=40)pangle2=0;

if(pangle3>=30)pangle3=-30;

if(pangle4<=-16)pangle4=0;

}

if(key == GLUT_KEY_UP)

{

py+= 0.05f;

pz+= 0.05f;

pangle=180;

}

if(key == GLUT_KEY_DOWN)

{

py-= 0.05f;

pz-= 0.05f;

pangle=0;

}

if(key == GLUT_KEY_LEFT)

{

px += 0.05f;

pangle=-90;

}

if(key == GLUT_KEY_RIGHT)

{

px -= 0.05f;

pangle=90;

}

}

//创建主菜单项

void mainMenu(GLint renderingOption)

{

switch(renderingOption)

{

case 1:renderingMode=GL_FLAT;break;

case 2:renderingMode=GL_SMOOTH;break;

}

glutPostRedisplay();

}

//创建子菜单项

void SubMenu(GLint option)

{

switch(option)

{

case 1:

red=0.0;green=0.0;blue=1.0;

break;

case 2:

red=0.0;green=1.0;blue=0.0;

break;

case 3:

red=1.0;green=1.0;blue=1.0;

break;

}

glClearColor(red,green,blue, 0.0);

glutPostRedisplay();

}

void output()

{

cout<<"-----------------------------场景功能快捷键说明-----------------------------"<<endl<<endl;

cout<<" 我所绘制的场景包括三堵墙,一张桌子及桌上物品,一辆小车,一个人以及随时间运动的光源太阳。"<<endl;

cout<<"该场景所实现的功能及所用到的快捷键如下如下:"<<endl<<endl;

cout<<"1、关于小车:"<<endl;

cout<<"(1)a----小车旋转并向左行驶"<<endl;

cout<<"(2)b----小车旋转并向右行驶"<<endl;

cout<<"(3)c----小车向前行驶"<<endl;

cout<<"(4)d----小车向后行驶"<<endl<<endl;

cout<<"2、关于小人:"<<endl;

cout<<"(1)左键----小人旋转并向左走"<<endl;

cout<<"(2)右键----小人旋转并向右走"<<endl;

cout<<"(3)上键----小人旋转并向后走"<<endl;

cout<<"(4)下键----小人旋转并向前走"<<endl;

cout<<"(5)l----小人左胳膊做前后摇摆运动"<<endl;

cout<<"(6)p----长按旋转至任意方向"<<endl;

cout<<"(7)o----沿任意方向行走"<<endl<<endl;

cout<<"3、关于视角(人眼位置):"<<endl;

cout<<"(1)x----人眼向左移动,即场景向右旋转"<<endl;

cout<<"(2)y----人眼向右移动,即场景向左旋转"<<endl;

cout<<"(3)z----人眼向靠近场景的方向移动,即场景向前移动"<<endl;

cout<<"(4)s----复原场景至最初界面"<<endl<<endl;

cout<<"4、关于下拉菜单:"<<endl;

cout<<"在场景中任意点点击鼠标右键,会弹出下拉菜单,选择颜色的任意一种,即可改变背景颜色。"<<endl<<endl;

cout<<"5、关于窗口:"<<endl;

cout<<"(1)1----窗口进入全屏模式"<<endl;

cout<<"(2)2----窗口复原至初始状态"<<endl;

cout<<"(3)Esc----关闭窗口"<<endl;

}

void main(int argc,char** argv)

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);

glutInitWindowPosition(500,100);

glutInitWindowSize(WIDTH,HEIGHT);

glutCreateWindow("计算机图形学");

init();

glutKeyboardFunc(keyboard);

glutSpecialFunc(SpecialKeys);

glutDisplayFunc(display);

glutTimerFunc(2,timefuncupdate,0);

glutReshapeFunc(reshape);

subMenu = glutCreateMenu(SubMenu);

glutAddMenuEntry("Blue",1);

glutAddMenuEntry("Green",2);

glutAddMenuEntry("White",3);

glutCreateMenu(mainMenu);

glutAddMenuEntry("Solid-Color Fill",1);

glutAddMenuEntry("Color-rpolation Fill",2);

glutAddSubMenu("Color",subMenu);

glutAttachMenu(GLUT_RIGHT_BUTTON);

output();

glutMainLoop();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: