ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:295.81KB ,
资源ID:18254401      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-18254401.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实验三 基于OpenGL的圆柱绘制 OpenGL纹理光照.docx)为本站会员(b****0)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

实验三 基于OpenGL的圆柱绘制 OpenGL纹理光照.docx

1、实验三 基于OpenGL的圆柱绘制 OpenGL纹理光照实验三 基于OpenGL的圆柱绘制1. 实验目的通过圆柱的绘制,掌握OpenGL编程环境的设置,基本图元的使用,光照的设置以及纹理的设置,理解曲面绘制的基本原理。2. 实验内容(1)设置OpenGL编程环境;(2)利用三角形和四边形等基本图元绘制底面圆圆心在坐标原点,半径为r,高 为h,方向沿z轴方向的圆柱;(3)设置光照(4)设置纹理:在圆柱的侧面上显示一张图片3.主要问题&结果截图1如何绘制圆柱?一种方法是调用gluc中的函数gluCylinder但本实验要求利用三角形和四边形等基本图元绘制所以这里主要采用类似微积分的方式绘制,就是将

2、椭圆的侧面用多个四边形,底面用多个三角形来表示关键代码void Circle()底面的圆形void Cylinder()圆柱的侧面glBegin(GL_TRIANGLE_FAN);/扇形连续填充三角形串glVertex3f(0.0f, 0.0f, 0.0f);/圆心:这是三角形作为圆心的顶点int i = 0;for (i = 0; i = 360; i += 15) float p = i * 3.14 / 180; glVertex3f(sin(p), cos(p), 0.0f);/圆周:这是三角形作为扇形弧端点的顶点(p的值取0-2PI)就能画出一个类似圆形glEnd();glBegin

3、(GL_QUAD_STRIP);/连续填充四边形串 int i = 0; for (i = 0; i = 360; i += 15) float p = 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();效果:再调用画圆形的函数画上两个底面 Circle(); glTranslatef(0, 0, 1);/设定高度为1,画上底面 Circ

4、le();效果:2如何纹理贴图?关键代码: 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); int i = 0; for (i = 0; i = 360; i += 15) float p = i * 3.14 / 180; glTexCoord2f(1.0f, 0.0f);/将纹理图(1,0)映射到圆周 glVertex3f(sin(p), cos(p), 0.0f); glEnd();这实际上不是一个贴图的效果,因为圆心到圆周上距离相等的点对应的纹理点都是一样的,是一个同心圆的图样效果:纹理那么再看圆柱侧面:glBegin(GL_QUAD

6、_STRIP);/连续填充四边形串 int i = 0; for (i = 0; i = 360; i += 15) float p = 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、的效果图:是不是很像一段木桩呢?3如何设置光照?/定义光源 GLfloat ambient=0.0,0.0,0.0,1.0; GLfloat diffuse=9.0,9.0,9.0,9.0;GLfloat position=i/6,2.0,2.0,0.0;/我把光源位置设置得和旋转时用到的角度相关联/把定义值给GL_LIGHT1 glLightfv(GL_LIGHT1,GL_AMBIENT,ambient);/设置环境光 glLightfv(GL_LIGHT1,GL_DIFFUSE,diffuse);/设置漫反射光 glLightfv(GL_LIGHT1,GL_POSITION,positio

8、n);/设置光源位置 glEnable(GL_LIGHTING);/启用光照 glEnable(GL_LIGHT1);/启用1号光源效果:可以观察到物体亮度明暗交替的变化4.实验总结这次实验,我算花了比较多心思的。不过我也不是从零开始写的代码,其实原本对于Opengl我也没有很好的基础。我先是从网上找到了几个demo,有的是只能完成贴图的,有的是只能画圆的,有的是只能画侧面的,这些小型的程序比较简单易懂,我通过学习它们的源码,举一反三,最终按照实验要求完成了自己的程序。其中,自己看代码最难理解的就是纹理映射的方式,看懂了之后会发现很简单,学习Opengl,就要理解它状态机的基本思想,自己动手实

9、践一下,改改代码,就很容易理解。附录:源码main.cpp#include#include#include#include#include #include texture.hvoid Circle() glClearColor(0.0,0.0,0.0,0.0); /glClear(GL_COLOR_BUFFER_BIT);/有l这个会把圆柱侧面清掉 glEnable(GL_TEXTURE_2D);/执行纹理映射,启用二维文理 glBindTexture(GL_TEXTURE_2D, ID);/允许建立一个绑定到目标纹理的有名称的纹理/ID 纹理的名称,并且,该纹理的名称在当前的应用中不能被再

10、次使用 glBegin(GL_TRIANGLE_FAN);/扇形连续填充三角形串 glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 0.0f, 0.0f); int i = 0; for (i = 0; i = 360; i += 15) float p = i * 3.14 / 180; glTexCoord2f(1.0f, 0.0f); glVertex3f(sin(p), cos(p), 0.0f); glEnd(); glDisable(GL_TEXTURE_2D);void Cylinder() glClearColor(0.0,0.0,0.0,0

11、.0); /glClear(GL_COLOR_BUFFER_BIT);/有l这个会把圆柱侧面清掉 glEnable(GL_TEXTURE_2D);/执行纹理映射,启用二维文理 glBindTexture(GL_TEXTURE_2D, ID);/允许建立一个绑定到目标纹理的有名称的纹理/ID 纹理的名称,并且,该纹理的名称在当前的应用中不能被再次使用 glBegin(GL_QUAD_STRIP);/连续填充四边形串 int i = 0; for (i = 0; i 360) i = 0; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); gl

12、LoadIdentity(); glPushMatrix(); /glColor3f(0, 1, 1);/设置颜色 glTranslatef(0.0, 0.0, -7);/指定位置,大小 glRotatef(i, 1, 1 ,1);/旋转轴/定义光源 GLfloat ambient= 0.0,0.0,0.0,1.0; GLfloat diffuse= 9.0,9.0,9.0,9.0; GLfloat position= i/6,2.0,2.0,0.0;/把定义值给GL_LIGHT1 glLightfv(GL_LIGHT1,GL_AMBIENT,ambient);/设置环境光 glLightfv

13、(GL_LIGHT1,GL_DIFFUSE,diffuse);/设置漫反射光 glLightfv(GL_LIGHT1,GL_POSITION,position);/设置光源位置 glEnable(GL_LIGHTING);/启用光照 glEnable(GL_LIGHT1);/启用1号光源 Cylinder();/绘制圆柱 /Circle(); glDisable(GL_TEXTURE_2D); glPopMatrix(); glutSwapBuffers();void changeSize(int w, int h) / 防止除数即高度为0 / (你可以设置窗口宽度为0). if (h = 0

14、) h = 1; float ratio = 1.0* w / h; / 单位化投影矩阵。 glMatrixMode(GL_PROJECTION); glLoadIdentity(); / 设置视口大小为整个窗口大小 glViewport(0, 0, w, h); / 设置正确的投影矩阵 gluPerspective(45, ratio, 1, 1000); /下面是设置模型视图矩阵 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, -1.0, 0.0f, 1.0f, 0.0f);/

15、设置观测点int main(int argc, char * argv) glutInit(&argc, argv); glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); glutInitWindowPosition(100, 100); glutInitWindowSize(400, 400); glutCreateWindow(圆柱 by陈羽丰); glutDisplayFunc(renderScene); glutIdleFunc(renderScene); /指定程序空闲时调用函数 glutReshapeFunc(cha

16、ngeSize); /指定窗口形状变化时的回调函数 glEnable(GL_DEPTH_TEST); init(); glutMainLoop(); return 0;texture.h#include#include#includeusing std:vector;using std:cout;using std:endl;unsigned int ID;int LoadBitmap(const char *file) unsigned int ID; /纹理的id int width,height,i; byte *image,t; /接受图像数据 FILE *fp; /文件指针 BITM

17、APFILEHEADER FileHeader; /接受位图文件头 BITMAPINFOHEADER InfoHeader; /接受位图信息头 fp=fopen(file,rb); if (fp = NULL) perror(LoadBitmap); /打开文件失败 return -1; fread(&FileHeader, sizeof(BITMAPFILEHEADER), 1, fp); if(FileHeader.bfType != 0x4D42) /确保文件是一个位图文件,效验文件类型 printf(Error: This file is not a bmp file!); fclos

18、e(fp); return -1; fread(&InfoHeader, sizeof(BITMAPINFOHEADER), 1, fp); width=InfoHeader.biWidth; height=InfoHeader.biHeight; if (InfoHeader.biSizeImage = 0) /确保图像数据的大小 InfoHeader.biSizeImage = width*height*3; fseek(fp, FileHeader.bfOffBits, SEEK_SET); /将文件指针移动到实际图像数据处 image=(byte *)malloc(sizeof(byte)*InfoHeader.biSizeImage); /申请空间 if (image = NULL) free(image); printf(Error: No enough space!); return -1; fread(image, 1, InfoHeader.biSizeImage, fp); for(i=0; ih?h:w; glViewport(0,0,(GLsizei)w,(GLsizei)w);void init() ID=LoadBitmap(cyf.bmp); if (ID = -1) exit(0);

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2