实验三OpenGL鼠标响应.docx
- 文档编号:2264666
- 上传时间:2022-10-28
- 格式:DOCX
- 页数:9
- 大小:79.02KB
实验三OpenGL鼠标响应.docx
《实验三OpenGL鼠标响应.docx》由会员分享,可在线阅读,更多相关《实验三OpenGL鼠标响应.docx(9页珍藏版)》请在冰豆网上搜索。
实验三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
2.
3.GLfloatrx=0,ry=0,angle=0;
4.GLintwinWidth=600,winHeight=600;
5.GLintmouseDx,mouseDy;
6.
7.
8.//////////显示函数
9.voidDisplay(){
10.////////GL_COLOR_BUFFER_BIT(用背景颜色填充)
11.glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
12.
13.//glPushMatrix();
14.
15.glRotatef(1,rx,ry,0);
16.
17.glColor3f(0.0,0.0,1.0);
18.
19.//glutWireTeapot(160);
20.glutSolidTeapot(120);
21.
22.//glPopMatrix();
23.
24.///交换缓冲区
25.glutSwapBuffers();
26.//glFlush();//刷新绘图命令
27.}
28.
29.
30.//设置渲染状态(听起来满下人,实际上很简单)
31.voidSetupRC(void)
32.{
33.//清除颜色(这里为黑色,为了方便找画的那个点),可以理解成背景颜色
34.//和glColor4f(1.0f,0.0f,0.0f,1.0f)一样,所有参数都在0.0到1.0之间,后缀f是表示参数是浮点型的
35.//最后的那个1.0f是透明度,0.0f表示全透明,1.0f是完全不透明
36.glClearColor(1.0f,1.0f,1.0f,1.0f);
37.}
38.
39.//当绘制的窗口大小改变时重新绘制,使绘制的图形同比例变化,
40.//几乎所有OpenGL程序中的这个函数都是一样的,所以,放心大胆的拷贝吧
41.voidChangeSize(intw,inth)
42.{
43.winWidth=w;
44.winHeight=h;
45.//设置观察视野为窗口大小(用FLASH里面的话来说应该叫设置摄象机视野)
46.glViewport(0,0,w,h);
47.//重置坐标系统,指定设置投影参数
48.glMatrixMode(GL_PROJECTION);
49.///////调用单位矩阵,去掉以前的投影参数设置
50.glLoadIdentity();
51.//////设置投影参数
52.glOrtho(-w/2,w/2,-h/2,h/2,-w,w);
53.
54.glMatrixMode(GL_MODELVIEW);
55.glLoadIdentity();
56.}
57.
58.
59.voidinit()//初始化背景颜色,光照,材质等
60.{
61.glClearColor(0.9,0.9,0.8,1.0);//初始背景色
62./*********光照处理**********/
63.GLfloatlight_ambient[]={0.0,0.0,0.0,1.0};
64.GLfloatlight_diffuse[]={1.0,1.0,1.0,1.0};
65.GLfloatlight_specular[]={1.0,1.0,1.0,1.0};
66.GLfloatlight_position0[]={100.0,100.0,100.0,0};
67.//定义光位置得齐次坐标(x,y,z,w),如果w=1.0,为定位光源(也叫点光源),
68.//如果w=0,为定向光源(无限光源),定向光源为无穷远点,因而产生光为
69.//平行光。
70.glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);//环境光
71.glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);//漫射光
72.glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);//镜面反射
73.glLightfv(GL_LIGHT0,GL_POSITION,light_position0);//光照位置
74./********材质处理***********/
75.GLfloatmat_ambient[]={0.0,0.2,1.0,1.0};
76.GLfloatmat_diffuse[]={0.8,0.5,0.2,1.0};
77.GLfloatmat_specular[]={1.0,1.0,1.0,1.0};
78.GLfloatmat_shininess[]={100.0};//材质RGBA镜面指数,数值在0~128范围内
79.
80.glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);
81.glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
82.glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
83.glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
84.glEnable(GL_LIGHTING);//启动光照
85.glEnable(GL_LIGHT0);//使第一盏灯有效
86.glEnable(GL_DEPTH_TEST);//测试深度缓存
87./********其他可选项***********/
88.//glDepthFunc(GL_LESS);//函数指定比较函数,用来比较每个引入象素的z值和深度缓存中给定的z值,只有当
89.//激活深度检验时才执行此比较。
90.//glEnable(GL_CULL_FACE);//剔除多边形表面:
在三维空间中,一个多边形虽然有两个面,但我们无法看见背
91.//面的那些多边形,而一些多边形虽然是正面的,但被其他多边形所遮挡。
如果将
92.//无法看见的多边形和可见的多边形同等对待,无疑会降低我们处理图形的效率。
93.//在这种时候,可以将不必要的面剔除。
94.//glCullFace(GL_FRONT);//glCullFace的参数可以是GL_FRONT,GL_BACK或者GL_FRONT_AND_BACK,分别表示
95.//剔除正面、剔除反面、剔除正反两面的多边形。
96.//glEnable(GL_COLOR_MATERIAL);//材质颜色追踪当前颜色
97.}
98.
99.
100./////////////////鼠标点击
101.voidMousePlot(GLintbutton,GLintaction,GLintxMouse,GLintyMouse){
102.if(button==GLUT_LEFT_BUTTON&&action==GLUT_DOWN){
103.mouseDx=xMouse;
104.mouseDy=yMouse;
105.}
106.if(button==GLUT_LEFT_BUTTON&&action==GLUT_UP){
107.glutPostRedisplay();
108.}
109.}
110.////////////////鼠标移动
111.voidMouseMove(GLintxMouse,GLintyMouse){
112.
113.//angle+=2;
114.if(xMouse>mouseDx&&yMouse==mouseDy)
115.{rx=0;ry=1;}
116.elseif(xMouse 117.{rx=0;ry=-1;} 118.elseif(xMouse==mouseDx&&yMouse 119.{rx=-1;ry=0;} 120.elseif(xMouse==mouseDx&&yMouse>mouseDy) 121.{rx=1;ry=0;} 122.elseif(xMouse>mouseDx&&yMouse 123.{rx=-1;ry=1;} 124.elseif(xMouse>mouseDx&&yMouse>mouseDy) 125.{rx=1;ry=1;} 126.elseif(xMouse 127.{rx=-1;ry=-1;} 128.elseif(xMouse 129.{rx=1;ry=-1;} 130. 131. 132.mouseDx=xMouse; 133.mouseDy=yMouse; 134.glutPostRedisplay(); 135.} 136. 137.//主函数 138.intmain(intargc,char*argv[]) 139.{ 140.glutInit(&argc,argv); 141.//设置显示模式 142.glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH); 143.//设置窗口大小像素 144.glutInitWindowSize(600,600); 145.////设置窗口出现在屏幕的位置 146.glutInitWindowPosit
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 OpenGL 鼠标 响应