资源描述:
《实验三基于某OpenGL地圆柱绘制OpenGL纹理光照》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、文档实验三基于OpenGL的圆柱绘制1.实验目的通过圆柱的绘制,掌握OpenGL编程环境的设置,基本图元的使用,光照的设置以及纹理的设置,理解曲面绘制的基本原理。2.实验内容(1)设置OpenGL编程环境;(2)利用三角形和四边形等基本图元绘制底面圆圆心在坐标原点,半径为r,高为h,方向沿z轴方向的圆柱;(3)设置光照(4)设置纹理:在圆柱的侧面上显示一张图片3.主要问题&结果截图① 如何绘制圆柱?一种方法是调用gluc中的函数gluCylinder但本实验要求利用三角形和四边形等基本图元绘制所以这里主要采用类似微积分的方式绘制,就是将椭圆的侧面用多个四边
2、形,底面用多个三角形来表示关键代码voidCircle()底面的圆形voidCylinder()圆柱的侧面glBegin(GL_TRIANGLE_FAN);//扇形连续填充三角形串glVertex3f(0.0f,0.0f,0.0f);//圆心:这是三角形作为圆心的顶点inti=0;for(i=0;i<=360;i+=15){floatp=i*3.14/180;glVertex3f(sin(p),cos(p),0.0f);//圆周:这是三角形作为扇形弧端点的顶点(p的值取0-2PI)就能画出一个类似圆形}glBegin(GL_QUAD_STRIP);//连续
3、填充四边形串inti=0;for(i=0;i<=360;i+=15){floatp=i*3.14/180;glTexCoord2f(p/10,0.1f);glVertex3f(sin(p),cos(p),1.0f);//这个1.0f指定的是高度glTexCoord2f(p/10,0.0f);glVertex3f(sin(p),cos(p),0.0f);}glEnd();文档glEnd();效果:再调用画圆形的函数画上两个底面Circle();glTranslatef(0,0,1);//设定高度为1,画上底面Circle();效果:① 如何纹理贴图?关键代码
4、:glEnable(GL_TEXTURE_2D);//执行纹理映射,启用二维文理glBindTexture(GL_TEXTURE_2D,ID);//允许建立一个绑定到目标纹理的有名称的纹理//ID——纹理的名称,并且,该纹理的名称在当前的应用中不能被再次使用纹理贴图的原理是纹理映射,即将纹理图片上的点和图形中的点建立对应关系。所以,我们需要glEnable底下的点定义之前关联上与之对应的纹理坐标即先调用glTexCoord2f设置纹理,再调用glVertex3f绘制点例如之前的圆形:glBegin(GL_TRIANGLE_FAN);//扇形连续填充三角形串
5、glTexCoord2f(0.0f,0.0f);//将纹理图(0,0)映射到圆心glVertex3f(0.0f,0.0f,0.0f);inti=0;for(i=0;i<=360;i+=15){floatp=i*3.14/180;文档glTexCoord2f(1.0f,0.0f);//将纹理图(1,0)映射到圆周glVertex3f(sin(p),cos(p),0.0f);}glEnd();这实际上不是一个贴图的效果,因为圆心到圆周上距离相等的点对应的纹理点都是一样的,是一个同心圆的图样效果:纹理那么再看圆柱侧面:glBegin(GL_QUAD_STRIP)
6、;//连续填充四边形串inti=0;for(i=0;i<=360;i+=15){floatp=i*3.14/180;glTexCoord2f(p/10,0.1f);//p和圆周是相对应的,这里让纹理的横坐标随圆周扫过的角度一起改变,就能够将纹理图“刷”上去了,而纵坐标设置为图像的高度和纹理高度的对应,这里合适的参数是根据实际测试得到的glVertex3f(sin(p),cos(p),1.0f);glTexCoord2f(p/10,0.0f);glVertex3f(sin(p),cos(p),0.0f);}glEnd();文档这是最终的效果图:是不是很像一段
7、木桩呢?① 如何设置光照?//定义光源GLfloatambient[]={0.0,0.0,0.0,1.0};GLfloatdiffuse[]={9.0,9.0,9.0,9.0};GLfloatposition[]={i/6,2.0,2.0,0.0};//我把光源位置设置得和旋转时用到的角度相关联//把定义值给GL_LIGHT1glLightfv(GL_LIGHT1,GL_AMBIENT,ambient);//设置环境光glLightfv(GL_LIGHT1,GL_DIFFUSE,diffuse);//设置漫反射光glLightfv(GL_LIGHT1,GL
8、_POSITION,position);//设置光源位置glEna