实验四 图形消隐(完结版)_第1页
实验四 图形消隐(完结版)_第2页
实验四 图形消隐(完结版)_第3页
实验四 图形消隐(完结版)_第4页
实验四 图形消隐(完结版)_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机图形学 实验报告 2011 年 1 月 实实验验四四 图图形形综综合合运运用用 4 1 实实验验目目的的 1 通过本次实验 掌握三维图形的旋转等变换和消隐的基本概念和相关算法 2 掌握凸多面体的消隐算法和实现 3 进一步熟练和掌握编程环境中三维图形的绘制和消隐的程序设计方法 4 2 实实验验内内容容 利用 openGL 绘制模型 4 2 1 绘制一个三维几何图形绘制一个三维几何图形 简单光照例程简单光照例程 light0 cpp include glos h include include include void myinit void void CALLBACK myReshape GLsizei w GLsizei h void CALLBACK display void void myinit void GLfloat light position 1 0 1 0 1 0 0 0 glLightfv GL LIGHT0 GL POSITION light position glEnable GL LIGHTING glEnable GL LIGHT0 glDepthFunc GL LESS glEnable GL DEPTH TEST void CALLBACK display void glClear GL COLOR BUFFER BIT GL DEPTH BUFFER BIT auxSolidSphere 1 0 glFlush void CALLBACK myReshape GLsizei w GLsizei h glViewport 0 0 w h glMatrixMode GL PROJECTION glLoadIdentity if w h glOrtho 1 5 1 5 1 5 GLfloat h GLfloat w 1 5 GLfloat h GLfloat w 10 0 10 0 else glOrtho 1 5 GLfloat w GLfloat h 1 5 GLfloat w GLfloat h 1 5 1 5 10 0 10 0 glMatrixMode GL MODELVIEW glLoadIdentity void main void auxInitDisplayMode AUX SINGLE AUX RGBA auxInitPosition 0 0 500 500 auxInitWindow Simple Lighting myinit auxReshapeFunc myReshape auxMainLoop display 程序运行结果 显示一个具有灰色光影的球 其中函数 myinit 中包含了关键的设定 光源位置 启动光照等几句 而其它程序语言几乎与以前的没有多大区别 但效果却完全 不一样 4 2 2 OpenGLOpenGL 法向定义法向定义 OpenGL 法向定义函数为 void glNormal3 bsifd TYPE nx TYPE ny TYPE nz void glNormal3 bsifd v const TYPE v 设置当前法向值 非向量形式定义法向采用第一种方式 即在函数中分别给出法向三 个分量值 nx ny 和 nz 向量形式定义采用第二种 即将 v 设置为一个指向拥有三个元素 的指针 例如 v 3 nx ny nz 因为法向的各分量值只定义法向的方向 因此它的大小不 固定 但最好将各值限制在 1 0 1 0 之间 即法向归一化 若法向不归一化 则在定义法 向之前必须启动法向归一 即调用函数 glEnable GL NORMALIZE 这样会降低整个程序 运行性能 自定义颜色立方体法向程序 nmlcolr cpp include glos h include include include static GLfloat p1 0 5 0 5 0 5 p2 0 5 0 5 0 5 p3 0 5 0 5 0 5 p4 0 5 0 5 0 5 p5 0 5 0 5 0 5 p6 0 5 0 5 0 5 p7 0 5 0 5 0 5 p8 0 5 0 5 0 5 static GLfloat m1 1 0 0 0 0 0 m2 1 0 0 0 0 0 m3 0 0 1 0 0 0 m4 0 0 1 0 0 0 m5 0 0 0 0 1 0 m6 0 0 0 0 1 0 static GLfloat c1 0 0 0 0 1 0 c2 0 0 1 0 1 0 c3 1 0 1 0 1 0 c4 1 0 0 0 1 0 c5 1 0 0 0 0 0 c6 1 0 1 0 0 0 c7 0 0 1 0 0 0 c8 1 0 1 0 1 0 void myinit void void CALLBACK myReshape GLsizei w GLsizei h void CALLBACK display void void DrawColorBox void void myinit void GLfloat light ambient 0 3 0 2 0 5 GLfloat light diffuse 1 0 1 0 1 0 GLfloat light position 2 0 2 0 2 0 1 0 GLfloat light1 ambient 0 3 0 3 0 2 GLfloat light1 diffuse 1 0 1 0 1 0 GLfloat light1 position 2 0 2 0 2 0 1 0 glLightfv GL LIGHT0 GL AMBIENT light ambient glLightfv GL LIGHT0 GL DIFFUSE light diffuse glLightfv GL LIGHT0 GL POSITION light position glLightfv GL LIGHT1 GL AMBIENT light1 ambient glLightfv GL LIGHT1 GL DIFFUSE light1 diffuse glLightfv GL LIGHT1 GL POSITION light1 position glEnable GL LIGHTING glEnable GL LIGHT0 glEnable GL LIGHT1 glDepthFunc GL LESS glEnable GL DEPTH TEST glColorMaterial GL FRONT AND BACK GL DIFFUSE glEnable GL COLOR MATERIAL void CALLBACK display void glClear GL COLOR BUFFER BIT GL DEPTH BUFFER BIT glPushMatrix glRotatef 45 0 0 1 0 0 0 glRotatef 315 0 0 0 0 1 0 DrawColorBox glPopMatrix glFlush void CALLBACK myReshape GLsizei w GLsizei h glViewport 0 0 w h glMatrixMode GL PROJECTION glLoadIdentity if w h glOrtho 1 5 1 5 1 5 GLfloat h GLfloat w 1 50 GLfloat h GLfloat w 10 0 10 0 else glOrtho 1 5 GLfloat w GLfloat h 1 5 GLfloat w GLfloat h 1 5 1 5 10 0 10 0 glMatrixMode GL MODELVIEW glLoadIdentity void DrawColorBox void glBegin GL QUADS glColor3fv c1 glNormal3fv m1 glVertex3fv p1 glColor3fv c2 glVertex3fv p2 glColor3fv c3 glVertex3fv p3 glColor3fv c4 glVertex3fv p4 glColor3fv c5 glNormal3fv m5 glVertex3fv p5 glColor3fv c6 glVertex3fv p6 glColor3fv c7 glVertex3fv p7 glColor3fv c8 glVertex3fv p8 glColor3fv c5 glNormal3fv m3 glVertex3fv p5 glColor3fv c6 glVertex3fv p6 glColor3fv c3 glVertex3fv p3 glColor3fv c4 glVertex3fv p4 glColor3fv c1 glNormal3fv m4 glVertex3fv p1 glColor3fv c2 glVertex3fv p2 glColor3fv c7 glVertex3fv p7 glColor3fv c8 glVertex3fv p8 glColor3fv c2 glNormal3fv m5 glVertex3fv p2 glColor3fv c3 glVertex3fv p3 glColor3fv c6 glVertex3fv p6 glColor3fv c7 glVertex3fv p7 glColor3fv c1 glNormal3fv m6 glVertex3fv p1 glColor3fv c4 glVertex3fv p4 glColor3fv c5 glVertex3fv p5 glColor3fv c8 glEnd void main void auxInitDisplayMode AUX SINGLE AUX RGBA auxInitPosition 0 0 500 400 auxInitWindow ColorBox myinit auxReshapeFunc myReshape auxMainLoop display 以上程序运行结果 是一个自定义法向的彩色正方体 其中每个顶点的颜色值不一样 且为光滑的明暗处理模式 4 2 3 雾化效果雾化效果 雾化效果在当今的计算机图形学中应用极广 它不仅可以使场景中的物体看起来更加 真 实 而且还可提高绘制速度 在很多情况下 计算机图像有时会出现不符合实际的精 细和棱 角分明 上一节的反走样技术可以通过光顺着物体的边界反走样 使其看起来更真实 雾化处理可以使物体看起来更加自然 即在雾中 离视点远的物体会变得模糊 雾 是一个描述类似于大气效果的一般术语 在视景仿真中应用很广 它可以模拟烟 雾 haze 薄雾 mist 浓烟 smoke 和污染 pollution 等效果 当启动雾后 离视点较远的物 体开始淡化成雾的颜色 同时 雾的浓度可以控制 即随着距离的增加物体变淡的速率可 控 雾的颜色也可以任意设定 雾在两种颜色方式下都能使用 在 OpenGL 程序中使用雾化效果非常容易 其步骤有三 如下 一 启动雾 函数调用为 glEnable GL FOG 二 控制雾 函数调用为 glFog 用它选择控制浓度和颜色的雾方程 其具体形式 为 void glFog if v GLenum pname TYPE param 设置计算雾的参数和函数 若 pname 为 GL FOG MODE 则 param 可以是 GL EXP 缺省 GL EXP2 或 GL LINEAR 分别代表三个雾因子 若 pname 为 GL FOG DENSITY GL FOG START 或 GL FOG END 则 param 为雾方程中对应的 density start 和 end 的值 缺省值为 1 0 1 在 RGBA 方式下 pname 可以是 GL FOG COLOR 此时参数 param 为指向含有 RGBA 值的向量指针 同样 在颜色表方式下 pname 相应值为 GL FOG INDEX 其对 应的 param 是雾的颜色索引值 三 若有必要 可用函数 glHint GL FOG HINT 提供一个值 RGBA 方式下使用雾的实例方式下使用雾的实例 fogrgb cpp include glos h include include include include include void myinit void void CALLBACK myReshape GLsizei w GLsizei h void CALLBACK display void void myinit void GLfloat mat ambient 0 7 0 6 0 4 1 00 GLfloat mat diffuse 0 7 0 0 0 99 1 0 GLfloat mat specular 1 0 0 0 1 0 1 00 GLfloat mat shininess 15 0 GLfloat position 5 0 5 0 5 0 1 0 GLfloat fogColor 4 0 6 0 6 0 6 1 0 glMaterialfv GL FRONT GL AMBIENT mat ambient glMaterialfv GL FRONT GL DIFFUSE mat diffuse glMaterialfv GL FRONT GL SPECULAR mat specular glMaterialfv GL FRONT GL SHININESS mat shininess glEnable GL DEPTH TEST glDepthFunc GL LESS glLightfv GL LIGHT0 GL POSITION position glFrontFace GL CW glEnable GL LIGHTING glEnable GL LIGHT0 glEnable GL FOG glFogi GL FOG MODE GL LINEAR glFogfv GL FOG COLOR fogColor glFogf GL FOG START 3 0 glFogf GL FOG END 15 0 glHint GL FOG HINT GL DONT CARE glClearColor 0 3 0 3 0 3 1 0 void CALLBACK display void glClear GL COLOR BUFFER BIT GL DEPTH BUFFER BIT glPushMatrix glTranslatef 3 0 1 5 2 0 auxSolidTorus 0 6 1 5 glPopMatrix glPushMatrix glTranslatef 0 5 0 5 7 0 auxSolidTorus 0 6 1 5 glPopMatrix glPushMatrix glTranslatef 2 0 0 8 10 0 auxSolidTorus 0 6 1 5 glPopMatrix glFlush void CALLBACK myReshape GLsizei w GLsizei h glViewport 0 0 w h glMatrixMode GL PROJECTION glLoadIdentity if w h 3 glOrtho 6 0 6 0 2 0 GLfloat h 3 GLfloat w 2 0 GLfloat h 3 GLfloat w 0 0 10 0 else glOrtho 6 0 GLfloat w GLfloat h 3 6 0 GLfloat w GLfloat h 3 2 0 2 0 0 0 10 0 glMatrixMode GL MODELVIEW glLoadIdentity void main void auxInitDisplayMode AUX SINGLE AUX RGBA auxInitPosition 0 0 500 400 auxInitWindow Fog RGB mode myinit auxReshapeFunc myReshape auxMainLoop display 以上程序运行结果是 显示三个不同远近的蓝紫色环形圈在雾中的效果 这里的雾化 计算采用线性方式 GL LINEAR 4 2 4 OpenGL 动画 OpenGL 提供了双缓存 可以用来制作动画 也就是说 在显示前台缓存内容中的一 帧画面时 后台缓存正在绘制下一帧画面 当绘制完毕 则后台缓存内容便在屏幕上显示 出来 而前台正好相反 又在绘制下一帧画面内容 这样循环反复 屏幕上显示的总是已 经画好的图形 于是看起来所有的画面都是连续的 在 OpenGL 中 设计这样的动画程序很简单 只需掌握一个重点函数 即 void auxSwapBuffers void 设置交换缓存 即执行完一次绘制过程 便交换前后台缓存 以便让下一帧图形在屏 幕后绘制完成 当然 使用不同的窗口系统设置交换缓存的函数也可能不一样 比如在 X 窗口系统下 就最好用 glxSwapBufferS 此外 在窗口显示模式中还应设置双缓存模式 下面看一个双缓存动画例子 dbufcolr c 这个程序是在 nmlcolr cpp 的基础上改制而成的 对比起来看看 就会发现 OpenGL 动 画程序设计其实是件极其容易和有趣的事情 双缓存动画例程双缓存动画例程 dbufcolr cpp include glos h include include include 定义旋转和比例因子的初始值 GLfloat step 0 0 s 0 1 定义立方体的顶点坐标值 static GLfloat p1 0 5 0 5 0 5 p2 0 5 0 5 0 5 p3 0 5 0 5 0 5 p4 0 5 0 5 0 5 p5 0 5 0 5 0 5 p6 0 5 0 5 0 5 p7 0 5 0 5 0 5 p8 0 5 0 5 0 5 定义立方体的顶点方向值 static GLfloat m1 1 0 0 0 0 0 m2 1 0 0 0 0 0 m3 0 0 1 0 0 0 m4 0 0 1 0 0 0 m5 0 0 0 0 1 0 m6 0 0 0 0 1 0 定义立方体的顶点颜色值 static GLfloat c1 0 0 0 0 1 0 c2 0 0 1 0 1 0 c3 1 0 1 0 1 0 c4 1 0 0 0 1 0 c5 1 0 0 0 0 0 c6 1 0 1 0 0 0 c7 0 0 1 0 0 0 c8 1 0 1 0 1 0 void myinit void void CALLBACK myReshape GLsizei w GLsizei h void CALLBACK stepDisplay void void CALLBACK startIdleFunc AUX EVENTREC event void CALLBACK stopIdleFunc AUX EVENTREC event void CALLBACK display void void DrawColorBox void void myinit void GLfloat light ambient 0 3 0 2 0 5 GLfloat light diffuse 1 0 1 0 1 0 GLfloat light position 2 0 2 0 2 0 1 0 GLfloat light1 ambient 0 3 0 3 0 2 GLfloat light1 diffuse 1 0 1 0 1 0 GLfloat light1 position 2 0 2 0 2 0 1 0 glLightfv GL LIGHT0 GL AMBIENT light ambient glLightfv GL LIGHT0 GL DIFFUSE light diffuse glLightfv GL LIGHT0 GL POSITION light position glLightfv GL LIGHT1 GL AMBIENT light1 ambient glLightfv GL LIGHT1 GL DIFFUSE light1 diffuse glLightfv GL LIGHT1 GL POSITION light1 position glLightModeli GL LIGHT MODEL TWO SIDE GL TRUE glEnable GL LIGHTING glEnable GL LIGHT0 glEnable GL LIGHT1 glDepthFunc GL LESS glEnable GL DEPTH TEST glColorMaterial GL FRONT AND BACK GL DIFFUSE glEnable GL COLOR MATERIAL void CALLBACK display void glClear GL COLOR BUFFER BIT GL DEPTH BUFFER BIT s 0 005 if s 1 0 s 0 1 glPushMatrix glScalef s s s glRotatef step 0 0 1 0 0 0 glRotatef step 0 0 0 0 1 0 glRotatef step 1 0 0 0 0 0 DrawColorBox glPopMatrix glFlush auxSwapBuffers 交换缓存 void CALLBACK stepDisplay void step step 1 0 if step 360 0 step step 360 0 display void CALLBACK startIdleFunc AUX EVENTREC event auxIdleFunc stepDisplay void CALLBACK stopIdleFunc AUX EVENTREC event auxIdleFunc 0 void CALLBACK myReshape GLsizei w GLsizei h glViewport 0 0 w h glMatrixMode GL PROJECTION glLoadIdentity if w h glOrtho 1 5 1 5 1 5 GLfloat h GLfloat w 1 50 GLfloat h GLfloat w 10 0 10 0 else glOrtho 1 5 GLfloat w GLfloat h 1 5 GLfloat w GLfloat h 1 5 1 5 10 0 10 0 glMatrixMode GL MODELVIEW glLoadIdentity void DrawColorBox void glBegin GL QUADS glColor3fv c1 glNormal3fv m1 glVertex3fv p1 glColor3fv c2 glVertex3fv p2 glColor3fv c3 glVertex3fv p3 glColor3fv c4 glVertex3fv p4 glColor3fv c5 glNormal3fv m5 glVertex3fv p5 glColor3fv c6 glVertex3fv p6 glColor3fv c7 glVertex3fv p7 glColor3fv c8 glVertex3fv p8 glColor3fv c5 glNormal3fv m3 glVertex3fv p5 glColor3fv c6 glVertex3fv p6 glColor3fv c3 glVertex3fv p3 glColor3fv c4 glVertex3fv p4 glColor3fv c1 glNormal3fv m4 glVertex3fv p1 glColor3fv c2 glVertex3fv p2 glColor3fv c7 glVertex3fv p7 glColor3fv c8 glVertex3fv p8 glColor3fv c2 glNormal3fv m5 glVertex3fv p2 glColor3fv c3 glVertex3fv p3 glColor3fv c6 glVertex3fv p6 glColor3fv c7 glVertex3fv p7 glColor3fv c1 glNormal3fv m6 glVertex3fv p1 glColor3fv c4 glVertex3fv p4 glColor3fv c5 glVertex3fv p5 glColor3fv c8 glVertex3fv p8 glEnd void main void auxInitDisplayMode AUX DOUBLE AUX RGBA 设置双缓存和 RGBA 颜色模式 auxInitPosition 0 0 500 400 auxInitWindow Double Buffer Animation myinit auxReshapeFunc myReshape auxIdleFunc stepDisplay auxMouseFunc AUX LEFTBUTTON AUX MOUSEDOWN startIdleFunc auxMouseFunc AUX RIGHTBUTTON AUX MOUSEDOWN stopIdleFunc auxMainLoop display 以上程序运行结果 是在屏幕上显示一个不断旋转和由小到大变化的五彩立方体 4 2 5 实时动画实时动画 实现小球的动态模型 实现其翻转 移动等基本变换 实时动画 cpp 4 2 6 纹理坐标纹理坐标 1 坐标定义 坐标定义 在绘制纹理映射场景时 不仅要给每个顶点定义几何坐标 而且也要定义纹理坐标 经过多种变换后 几何坐标决定顶点在屏幕上绘制的位置 而纹理坐标决定纹理图像中的 哪一个纹素赋予该顶点 并且顶点之间的纹理坐标插值与基础篇中所讲的平滑着色插值方 法相同 纹理图像是方形数组 纹理坐标通常可定义成一 二 三或四维形式 称为 s t r 和 q 坐标 以区别于物体坐标 x y z w 和其他坐标 一维纹理常用 s 坐标表示 二维纹理常用 s t 坐标表示 目前忽略 r 坐标 q 坐标象 w 一样 一半值为 1 主要用于建立齐次坐标 OpenGL 坐标定义的函数是 void gltexCoord 1234 sifd v TYPE coords 设置当前纹理坐标 此后调用 glVertex 所产生的顶点都赋予当前的纹理坐标 对于 gltexCoord1 s 坐标被设置成给定值 t 和 r 设置为 0 q 设置为 1 用 gltexCoord2 可 以设置 s 和 t 坐标值 r 设置为 0 q 设置为 1 对于 gltexCoord3 q 设置为 1 其它坐标 按给定值设置 用 gltexCoord4 可以给定所有的坐标 使用适当的后缀 s i f 或 d 和 TYPE 的相应值 GLshort GLint glfloat 或 GLdouble 来说明坐标的类型 2 坐标自动产生 在某些场合 环境映射等 下 为获得特殊效果需要自动产生纹理坐标 并不要求为 用函数 gltexCoord 为每个物体顶点赋予纹理坐标值 OpenGL 提供了自动产生纹理坐标 的函数 其如下 void glTexGen if v GLenum coord GLenum pname TYPE param 自动产生纹理坐标 第一个参数必须是 GL S GL T GL R 或 GL Q 它指出纹理 坐标 s t r q 中的哪一个要自动产生 第二个参数值为 GL TEXTURE GEN MODE GL OBJECT PLANE 或 GL EYE PLANE 第三个参数 param 是一个定义纹理产生参数的指针 其值取决于第二个参数 pname 的设置 当 pname 为 GL TEXTURE GEN MODE 时 param 是一个常量 即 GL OBJECT LINEAR GL EYE LINEAR 或 GL SPHERE MAP 它们决定用哪一个函数 来产生纹理坐标 对于 pname 的其它可能值 param 是一个指向参数数组的指针 纹理坐标自动产生实例 texpot cpp include glos h include include include void myinit void void makeStripeImage void void CALLBACK display void void CALLBACK myReshape GLsizei w GLsizei h define stripeImageWidth 64 GLubyte stripeImage 3 stripeImageWidth void makeStripeImage void int j for j 0 j stripeImageWidth j stripeImage 3 j 255 stripeImage 3 j 1 255 2 j stripeImage 3 j 2 255 参数设置 GLfloat sgenparams 1 0 1 0 1 0 0 0 void myinit void glClearColor 0 0 0 0 0 0 0 0 makeStripeImage glPixelStorei GL UNPACK ALIGNMENT 1 glTexEnvf GL TEXTURE ENV GL TEXTURE ENV MODE GL MODULATE glTexParameterf GL TEXTURE 1D GL TEXTURE WRAP S GL REPEAT glTexParameterf GL TEXTURE 1D GL TEXTURE MAG FILTER GL LINEAR glTexParameterf GL TEXTURE 1D GL TEXTURE MIN FILTER GL LINEAR glTexImage1D GL TEXTURE 1D 0 3 str

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论