实验三OpenGL鼠标响应Word下载.docx
《实验三OpenGL鼠标响应Word下载.docx》由会员分享,可在线阅读,更多相关《实验三OpenGL鼠标响应Word下载.docx(9页珍藏版)》请在冰豆网上搜索。
2.旋转后的茶壶:
5、实验代码
1.#include<
gl/glut.h>
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<
mouseDy)
119.{rx=-1;
ry=0;
}
120.elseif(xMouse==mouseDx&
yMouse>
121.{rx=1;
122.elseif(xMouse>
123.{rx=-1;
124.elseif(xMouse>
125.{rx=1;
126.elseif(xMouse<
127.{rx=-1;
128.elseif(xMouse<
129.{rx=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