版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、三维图形的光照、贴图及阴影处理(OpenGL)实验过程:一、在VS6.0中建立新工程。1、新建一个Win32 Application的工程。2、向工程项目添加C+源文件。3、将OpenGL框架复制到文件中。4、设置OpenGL窗口标题。二、场景设置。1、视线处于一具有地板及前、左、右三面墙壁的空间中。2、空间顶部中央有一光源。3、空间中央有一地球仪,不断旋转。三、建立视口结构及视点属性。1、在坐标系上建立视图结构。如图。2、参数设置。窗口大小:800*600。视口大小:800*600。透视深度:0.1100。透视角:60°。视点位置:(0.0, 2.0, 15.0)。视线方向:z轴负
2、方向。视点上方向:y轴正方向。3、调用函数glViewport()、gluPerspective()和gluLookAt()实现。四、绘制三维图形。1、开启深度测试模式。为防止图形重叠时出现层次混乱,必须对绘制图形进行消隐处理。直接调用函数glEnable(GL_DEPTH_TEST)开启深度测试。2、绘制地面与墙壁。调用OpenGL基本几何元素绘制过程glBegin(GL_QUADS)、glBegin(GL_QUAD_STRIP)绘制四个平面,坐标范围为:x: -1010, y: -220, z: -1010。坐标系结构如图。3、绘制地球仪。设计函数void DrawEarth()实现地球仪
3、的绘制,分别调用OpenGL球面绘制函数gluSphere()绘制地球形状、柱面绘制函数gluCylinder()绘制地轴两头形状。(1)参数设置。球面半径:2。球面细度:水平100,垂直100。柱面半径:0.05。柱面高度:1。柱面细度:水平50,垂直1。(2)结构如图。4、绘制模拟光源。(1)绘制“灯罩”。调用glBegin(GL_TRIANGLE_STRIP)绘制4个三角形,构成棱椎形灯罩的4个侧面。(2)绘制“灯泡”。调用gluSphere()绘制球形灯泡。(3)参数设置。灯罩底面:四个底面顶点距底面中心距离为1。灯罩高度:1。灯罩颜色:顶点为(0.8, 0, 0),底面顶点为(0.8
4、, 0.8, 0),绘制时颜色自然过渡。灯泡半径:0.4。灯泡颜色:(1, 1, 0.8)。(4)整体结构如图。五、光照效果。1、设置全局环境光。调用函数glLightModelfv()调节全局泛射光强度为(1, 1, 1, 1)。2、设置光源0。调用函数glLightfv()调节光源泛射光强度为(1, 1, 1, 1),漫反射光强度为(2, 2, 2, 1),光源位置为(0, 10, 0, 1),最后一个参数指定光照类型为非平行光。3、光照效果开启与关闭。光照效果仅作用于地面、墙壁、地球及地轴,模拟光源不使用光照效果。调用函数glEnable(GL_LIGHTING)和glDisable(G
5、L_LIGHTING)实现光照模式的开启和关闭。六、设置地球仪和模拟光源的自转。调用函数glRotatef()实现旋转,转轴与地轴同一直线,设置变量earth_rotate为旋转角度,每帧更新递增4°,则绘图时自动旋转。七、纹理贴图。1、载入贴图。(1)设计函数BOOL LoadTexture()实现贴图载入,对应的贴图引用ID保存在数组textureNTEX中。(2)在初始化函数Initialize()中调用LoadTexture()载入贴图。2、绘制贴图。(1)调用函数glBindTexture()为下面绘制的图形绑定贴图。(2)调用函数glTexCoord2f()建立二维图形与
6、贴图的坐标映射。(3)调用函数gluQuadricTexture()建立球面与贴图的坐标映射。3、贴图模式的开启与关闭。贴图只应用于地面、墙壁和地球面,地轴和模拟光源不使用贴图。调用函数glEnable(GL_TEXTURE_2D)和glDisable(GL_TEXTURE_2D)实现贴图模式的开启和关闭。4、带光照效果和纹理贴图的图形绘制。八、阴影效果。1、平面阴影投射矩阵的推导。设投射平面的方程为Ax + By + Cz + D=0,光源位置为L(Lx, Ly, Lz),空间某点P(Px, Py, Pz)在平面上的投影坐标为S(Sx', Sy', Sz'),则有L,
7、P,S共线,且ASx' + BSy' + CSz' + D = 0。如图。令向量L = (Lx, Ly, Lz, 0),P = (Px, Py, Pz, 1),S = (Sx', Sy', Sz', 1),N = (A, B, C, D),则有ASx' + BSy' + CSz' + D = S · N = k'(P L) + L · N= k'P + (1 k')L · N = 0,令k = (k' 1) / k'得(P + kL) · N=
8、0,解得k = (P · N) / (L · N) = (APx + BPy + CPz + D) / (ALx + BLy + CLz)。将上式代入S = P + kL可得Sx' = Px + kLx = Px Lx(APx + BPy + CPz + D)/(ALx + BLy + CLz)
9、 = Px · (BLy + CLz) Py · BLx Pz · CLx 1 · DLx/(ALx + BLy + CLz) = P · (BLy + CLz, BLx, CLx,
10、0; DLx )/(ALx + BLy + CLz),Sy' = P · ( ALy,
11、160; ALx + CLz, CLy, DLy
12、 )/(ALx + BLy + CLz),Sz' = P · ( ALz, BLz, ALx + BLy, DLz
13、 )/(ALx + BLy + CLz),1 = P · (0,
14、; 0, 0, ALx + BLy + CLz )/(ALx + BLy
15、 + CLz)。在OpenGL中,四维坐标有以下转换关系:(x, y, z, k) = (kx, ky, kz, 1)。由此,得到S的四维向量坐标S = HP,其中P为空间某点P的向量坐标,H即为平面阴影投射矩阵。在OpenGL中,有一个4×4的空间平面坐标变换矩阵R,将三维坐标映射为屏幕实际显示出来的二维图形。故有S0 = RS = RHP = R'P,其中R' = RH。从而在R'的变换下,图形将被“压扁”地绘制到阴影投射平面上。2、阴影投射矩阵的生成算法。设计函数void GenerateShadow()计算阴影投射矩阵,记录在二维数组shadow44中
16、。3、绘制阴影。(1)关闭光照和纹理贴图,设置阴影颜色。(2)为防止阴影与投射平面重合导致绘图层次混乱,将阴影绘制平面上移一个小单位。(3)对于四个阴影投射平面,分别计算阴影投射矩阵,并与当前模型视图矩阵相乘。(4)由于当前模型视图矩阵被修改,要恢复之前的状态必须将运算前的矩阵压入矩阵栈,阴影绘制结束后弹出。(5)调用地球仪绘制函数DrawEarth()即可完成阴影绘制。九、键盘控制。1、设置变量posX、posY、posZ、rotH、rotV,分别控制地球仪坐标和水平、垂直旋转角度。2、在地球仪绘制函数void DrawEarth()中添加坐标变换函数。3、在框架函数void Update(
17、)中添加键盘按键响应及边缘控制。十、文字说明。1、制作文字贴图。2、绘制文字贴图平面。绑定贴图,建立坐标映射,绘制平面。平面位置在视口空间的前部,即总在地球仪位置前方。3、设置透明效果。设置混合类型,开启透明模式,关闭深度测试,设置阴影颜色及其透明度。绘制结束后关闭透明模式,重新开启深度测试。实验结果:一、图形绘制效果。1、整体效果较为理想。2、消隐效果良好。如不开启深度测试,则会出现以下现象。二、透视效果。1、窗口结构和整体透视效果与计算预期结果一致。2、地球仪移动到窗口边缘时会出现明显变形,如图所示。三、光照效果。1、仅地球仪和墙壁、地面受中心光源0光照,其他只受全局环境泛射光影响,与预期
18、结果相同。2、地球仪受光明显,出现光照面与阴暗面,且方向正确。3、关闭贴图可以看到良好的整体光照效果。四、贴图效果。1、平面、球面贴图均得到较好效果。图略。2、颜色深度设置为16位色,如果图片格式不正确,会出现贴图错误。五、阴影效果。1、在透明模式下,地球阴影与地轴阴影相叠加,阴影明显失真。2、阴影在多个面的交汇处得到十分准确的效果。六、动画效果。1、实现了地球仪和模拟光源的自转,转速适中。2、使用10个键盘按键实现地球仪的平移和旋转控制。3、在接近墙壁、地面和视点处设置坐标控制,限制了球面的平移范围。但因地轴位置不确定,无法实现范围控制,即有可能穿透边缘。七、文字说明及其透明效果。1、位于所
19、有图形之前,窗口右上角边缘附近。2、透明效果良好。实验讨论:一、关于OpenGL框架。1、老师给的框架无法直接实现键盘控制功能,所以选用了计算机图形学实验教程(OpenGL版)中的简单框架。2、在OpenGL框架下,只需要增加一些全局变量,修改少数几个函数的内容即可实现绘图及控制功能。如在Initialize()函数中初始化窗口环境,在DrawSceneGL()中绘制图形和其他效果,在Update()中设置键盘实时控制。3、但是在这个VC环境的框架下,每个函数分别实现了不同的功能,不可混用。Initialize()只在创建窗口时调用一次,DrawSceneGL()在整个程序运行过程中被反复调用
20、,而Update()则在有键盘动作时响应。刚开始时将LoadTexture()函数放在DrawSceneGL()中调用,结果程序运行是反复载入纹理贴图,最终导致内存溢出,程序崩溃。4、在OpenGL中,图形是根据DrawSceneGL()被连续绘制的,因此动画控制无需用循环实现,只需设置改变量即可。二、OpenGL是一个状态机。1、OpenGL的整个绘制过程时刻贯穿着“状态机”的思想,强调的是“当前状态”。即在每一个图形的绘制之前必须先设置好各种绘制状态,如视图属性、光照效果、贴图功能、透明模式等等,图形的绘制都是根据当前的绘制状态进行绘制的。2、我们可以将OpenGL设想成为一台机器,机器上许多状态开关,当我们设定好一组状态组合之后,就可以开始绘制。在工作过程中,机器根据状态组合进行实时计算,得到被绘制图形上各个点的实际显示结果。绘制完成后可以重新设定状态组合,进行另一轮的图形绘制,但无法对已经绘制
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《济南的冬天》素养进阶表格式教学设计
- 2025-2030年网红IP跨界授权与合作平台企业制定与实施新质生产力战略分析研究报告
- 2025-2030年木制槽、盆行业市场营销创新战略制定与实施分析研究报告
- 2025-2030年去中心化数据治理服务行业深度调研及发展战略咨询报告
- 新形势下集成光电子器件行业可持续发展战略制定与实施分析报告
- 2025年惠州博罗县第三人民医院招聘考试试卷真题
- 幼儿转学证明
- 2026调查面试题及答案
- 2026督考办面试题目及答案
- 2026福诺产品面试题及答案
- DB11T583-2022扣件式和碗扣式钢管脚手架安全选用技术规程
- 2025年度华住酒店集团酒店客房布草洗涤与供应合同
- GB/T 44963-2024储粮保水技术规范
- 国家开放大学电大《生产与运作管理》期末试题题库及答案试卷代号
- 2024年红河州国有资产(持股)经营有限公司招聘笔试冲刺题(带答案解析)
- 《实验室安全教育》课件-事故急救与应急处理
- 物业工程部管理方案
- 浦发银行征信异议申请书
- 个人房屋租赁合同房屋租赁合同
- 青霉素发酵的过程控制
- YY/T 0242-2007医用输液、输血、注射器具用聚丙烯专用料
评论
0/150
提交评论