实验三 消隐.docx

上传人:b****5 文档编号:6445550 上传时间:2023-01-06 格式:DOCX 页数:9 大小:40.12KB
下载 相关 举报
实验三 消隐.docx_第1页
第1页 / 共9页
实验三 消隐.docx_第2页
第2页 / 共9页
实验三 消隐.docx_第3页
第3页 / 共9页
实验三 消隐.docx_第4页
第4页 / 共9页
实验三 消隐.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

实验三 消隐.docx

《实验三 消隐.docx》由会员分享,可在线阅读,更多相关《实验三 消隐.docx(9页珍藏版)》请在冰豆网上搜索。

实验三 消隐.docx

实验三消隐

湘潭大学实验报告

课程名称计算机图形学实验名称消隐页数

专业计算机科学与技术班级12级计算机2班同组者姓名

学号**********姓名黄柳实验日期____2015-4-20____

一、实验目的

1)了解OpenGL图形库的功能和结构;

2)学习了解OpenGL程序的基本结构,及常用函数;

3)学习使用OpenGL消隐,画一个正方体的消隐图;

二、实验内容和要求

1)使用OpenGL编写一个简单的C++程序,使该程序能够绘制出消隐的正方体。

使得现实中看不见的面在屏幕上也看不见。

三、实验方案设计

主要设计思路:

1)在系统上配置好OpenGL的环境(头文件,库文件,和链接库文件);

2)使用VisualV++6.0新建一个C++文档,并创建相应的工程;

3)在文档中引入OpenGL的头文件,编辑代码实现。

算法设计:

算法流程图:

四、程序运行结果及分析

 

五、性能、扩展性等方面存在的不足和可能的改进之处。

在完成计算机图形学消隐实验后,我发现还有许多不足,所学到的知识还远远不够,以至于还有一些功能不能很好完成。

其实我的这个设计只是一个很简单的东西,仅仅实现了最简单的透视投影图,三视图的算法罢了,受限于知识缺乏的影响,不能实现较理想的设计。

我认为较理想的设计是,最重要的一点是增加设计的灵动性,最大便利于用户和观众,让他们觉得这个设计是不错的东西。

可以再程序中实现让用户输入三维物体的顶点和面的信息,并且建立一个三维坐标系将图形放在原点处,使用户一目了然,同时也将三视图置于二维坐标系中,并标出哪个是哪个图形,即各个图形代表的意思。

我认为解决以上问题只有通过在以后的学习,对图形学和OpenGL有更深的了解才有可能解决该问题。

同时要彻底学好C++这门语言,没有精通的语言,就无法实现更完美的功能和设计。

这次实践增强了我的动手能力,提高和巩固了图形学方面的知识,特别是软件方面。

让我认识到把理论应用到实践中去是多么重要。

这个过程中,我花费了大量的时间和精力,更重要的是,我在学会实践的基础上,同时还懂得合作精神的重要性,学会了互相学习。

这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在各位同学和老师地帮助下,终于游逆而解。

同时,在老师那里我学到了很多实用的知识。

我表示再次衷心的感谢!

附件实验代码

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.}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1