实验四OpenGL透视投影与消隐.docx
《实验四OpenGL透视投影与消隐.docx》由会员分享,可在线阅读,更多相关《实验四OpenGL透视投影与消隐.docx(9页珍藏版)》请在冰豆网上搜索。
![实验四OpenGL透视投影与消隐.docx](https://file1.bdocx.com/fileroot1/2022-11/25/81561616-c5b6-4e64-9353-ef0c32cde6bc/81561616-c5b6-4e64-9353-ef0c32cde6bc1.gif)
实验四OpenGL透视投影与消隐
实验四、OpenGL透视投影与消隐
1、实验目的
1)了解OpenGL图形库的功能和结构;
2)学习了解OpenGL程序的基本结构,及常用函数;
3)学习使用OpenGL透视投影与深度测试;
2、实验内容
1)使用OpenGL编写一个简单的C++程序,使该程序能够绘制出透视投影的球体。
2)在该C++程序中,更改代码,使该程序启动深度测试,实现消隐。
3、实验过程
1)在系统上配置好OpenGL的环境(头文件,库文件,和链接库文件);
2)使用VisualV++6.0新建一个C++文档,并创建相应的工程;
3)在文档中引入OpenGL的头文件,编辑代码实现:
透视投影下,多个球体的绘制,光照的设置,球体材质设置,启动深度测试,实现球体运动时消隐。
4、实验结果
窗口中显示了四个球体,三个球体围绕中心球体做不同半径,不同速度的圆周运动,单击鼠标左键关闭或开启深度测试,可观察出球体运动时,是否产生消隐。
结果截图:
1.启用深度测试的球体运动:
2.关闭深度测试的球体运动:
5、实验代码
1.#include"stdio.h"
2.#include
3.#include
4.
5.//用于确定当前的深度比较测试方式
6.GLenumDepthFunc=GL_LESS;
7.///////初始化
8.voidInitial()
9.{
10.glEnable(GL_DEPTH_TEST);//启用深度测试
11.//glClearColor(1.0f,1.0f,1.0f,1.0f);
12.glClearColor(0.9,0.9,0.8,1.0);//初始背景色
13./*********光照处理**********/
14.GLfloatlight_ambient[]={0.0,0.0,0.0,1.0};
15.GLfloatlight_diffuse[]={1.0,1.0,1.0,1.0};
16.GLfloatlight_specular[]={1.0,1.0,1.0,1.0};
17.GLfloatlight_position0[]={0.0,0.0,-220,1.0};
18.//定义光位置得齐次坐标(x,y,z,w),如果w=1.0,为定位光源(也叫点光源),
19.//如果w=0,为定向光源(无限光源),定向光源为无穷远点,因而产生光为
20.//平行光。
21.glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);//环境光
22.glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);//漫射光
23.glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);//镜面反射
24.glLightfv(GL_LIGHT0,GL_POSITION,light_position0);//光照位置
25.
26./********材质处理***********/
27./*GLfloatmat_ambient[]={0.0,0.2,1.0,1.0};
28.GLfloatmat_diffuse[]={0.8,0.5,0.2,1.0};
29.GLfloatmat_specular[]={1.0,1.0,1.0,1.0};
30.GLfloatmat_shininess[]={100.0};//材质RGBA镜面指数,数值在0~128范围内
31.
32.glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);
33.glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
34.glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
35.glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
36.*/
37.glEnable(GL_LIGHTING);//启动光照
38.glEnable(GL_LIGHT0);//使第一盏灯有效
39.glEnable(GL_DEPTH_TEST);//测试深度缓存
40./********其他可选项***********/
41.//glDepthFunc(GL_LESS);//函数指定比较函数,用来比较每个引入象素的z值和深度缓存中给定的z值,只有当
42.//激活深度检验时才执行此比较。
43.//glEnable(GL_CULL_FACE);//剔除多边形表面:
在三维空间中,一个多边形虽然有两个面,
44.
45.//但我们无法看见背
46.//面的那些多边形,而一些多边形虽然是正面的,但被其他多边形所遮挡。
如果将
47.//无法看见的多边形和可见的多边形同等对待,无疑会降低我们处理图形的效率。
48.//在这种时候,可以将不必要的面剔除。
49.//glCullFace(GL_FRONT);//glCullFace的参数可以是GL_FRONT,GL_BACK或者GL_FRONT_AND_BACK,分别表示
50.//剔除正面、剔除反面、剔除正反两面的多边形。
51.glEnable(GL_COLOR_MATERIAL);//材质颜色追踪当前颜色
52.}
53.
54.voidChangeSize(intw,inth)
55.{
56.if(h==0)h=1;
57.glViewport(0,0,w,h);
58.glMatrixMode(GL_PROJECTION);
59.glLoadIdentity();
60.GLfloatfAspect;
61.fAspect=(float)w/(float)h;
62./////////////////透视投影
63.gluPerspective(45.0,fAspect,1.0,500.0);
64.glMatrixMode(GL_MODELVIEW);
65.glLoadIdentity();
66.}
67.
68.
69./////////////////鼠标点击
70.voidMousePlot(GLintbutton,GLintaction,GLintxMouse,GLintyMouse){
71.if(button==GLUT_LEFT_BUTTON&&action==GLUT_DOWN){
72.if(DepthFunc==GL_LESS){
73.DepthFunc=GL_GREATER;
74.glClearDepth(0.0);//不同的比较测试方式需要不同的初始化值
75.printf("关闭深度测试,不能消隐!
\n");
76.}
77.elseif(DepthFunc=GL_GREATER){
78.DepthFunc=GL_LESS;
79.glClearDepth(1.0);
80.printf("启动深度测试,可以实现消隐!
\n");
81.}
82.}
83.}
84.
85.voidDisplay(void)
86.{
87.staticfloatfElect1=0.0f,fElect2=0.0f,fElect3=0.0f;
88.glDepthFunc(DepthFunc);//设置深度比较测试方式
89.
90.glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
91.
92.glMatrixMode(GL_MODELVIEW);
93.glLoadIdentity();
94.
95.glTranslatef(0.0f,0.0f,-250.0f);
96.glColor3f(1.0f,0.4f,0.2f);
97.///////////////中心球
98.glutSolidSphere(16.0f,24,24);
99.
100.
101.glColor3f(0.6f,0.6f,1.0f);
102./////////环绕球1
103.glPushMatrix();
104.glRotatef(fElect1,0.0f,1.0f,0.0f);
105.glTranslatef(90.0f,0.0f,0.0f);
106.glutSolidSphere(6.0f,16,16);
107.glPopMatrix();
108.
109.glColor3f(1.0f,1.0f,0.8f);
110.//////////环绕球2
111.glPushMatrix();
112.glRotatef(45.0f,0.0f,0.0f,1.0f);
113.glRotatef(fElect2,0.0f,1.0f,0.0f);
114.glTranslatef(-70.0f,0.0f,0.0f);
115.glutSolidSphere(10.0f,16,16);
116.glPopMatrix();
117.
118.glColor3f(0.5f,1.0f,1.0f);
119.//////////环绕球3
120.glPushMatrix();
121.glRotatef(-45.0f,0.0f,0.0f,1.0f);
122.glRotatef(fElect3,0.0f,1.0f,0.0f);
123.glTranslatef(0.0f,0.0f,40.0f);
124.glutSolidSphere(3.0f,16,16);
125.glPopMatrix();
126.
127.//////旋转角度参数递增
128.fElect1+=10.0f;
129.fElect2+=5.0f;
130.fElect3+=20.0f;
131.if(fElect1>360.0f)fElect1=10.0f;
132.if(fElect2>360.0f)fElect2=5.0f;
133.if(fElect3>360.0f)fElect3=20.0f;
134.
135.glutSwapBuffers();
136.}
137.////////定时函数
138.voidTimerFunc(intvalue)
139.{
140.glutPostRedisplay();
141.glutTimerFunc(100,TimerFunc,1);
142.}
143.
144.intmain(intargc,char*argv[])
145.{
146.glutInit(&argc,argv);
147.glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
148.glutInitWindowSize(600,600);
149.glutCreateWindow("透视与深度测试");
150.glutReshapeFunc(ChangeSize);
151.glutDisplayFunc(Display);
152.glutMouseFunc(MousePlot);
153.glutTimerFunc(300,TimerFunc,1);
154.Initial();
155.glutMainLoop();
156.return0;
157.}