版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
./北京邮电大学世纪学院毕业设计<论文>题目基于DirectX的第一人称射击游戏制作学号000学生姓名专业名称通信工程所在系〔院通信与信息工程指导教师20XX6月1日.北京邮电大学世纪学院毕业设计〔论文任务书姓名学号通信工程系〔院通信与信息工程设计〔论文题目基于DirectX的第一人称射击游戏制作题目分类□工程设计;■工程技术研究;□软件工程〔如CAI课题等;□专题研究;□艺术设计;□其他题目来源□自然科学基金与部、省、市级以上科研课题;□企、事业单位委托课题;□院级课题;■自拟课题□其他指导教师〔指导教师组组长及成员姓名职称工作单位备注李江军讲师北邮信通院指导老师毕业设计<论文>的内容和要求:[注意:选题尽量与实际应用需求相结合。要求写明本设计〔论文所涉及的分析方法或技术手段〔如定性、定量分析的方法;要求有学生独立的见解,设计内容要详细写明具体步骤和技术指标]。开发一个简单的第一人称射击游戏:1游戏规划,包括角色模型,菜单界面等;2创建和使用纹理和光照,增加对硬件光照和纹理的支持;3在程序中增加对脚本和GUI的支持;4用边界框和边界球为游戏加入碰撞检测;5通过Directinput为游戏引擎加入输入检测功能,检测来自键盘,鼠标等设备的输入;6使用DirectSound和DirectMucic播放声音,创建3D摄像机系统。应完成的工作和提交材料要求〔课题完成后应提交成果的种类、数量、质量等方面的要求:开题报告:3000字左右;论文的中文摘要:200-300字左右,包含关键词,并译成英文。英文摘要以250个左右实词为宜;论文正文不少于15000字;可执行文件及源代码;尽量结合课题,翻译1500汉字以上的有关技术资料或专业文献;参考文献中,主要的文献应达到10篇以上,其中外文文献在2篇以上。主要参考文献〔参考文献不少于4篇,参考文献目录按GB/T7714—2005的要求填写:[1]左鲁梅.三维图形引擎中的关键技术研究[D].北京:北京理工大学,2009:21~30[2]孙家广.计算机图形学[M].清华大学出版社.2008:50~70[3]王鸽鸽.三维引擎的研究与实现[D].XX:东北大学.2008:20~50[4]房晓溪.游戏引擎教程[M].中国水利水电出版社,2008:30~40[5]叶至军.VisualC++/DirectX93D游戏开发导引DirectX9gameprogrammingtutorials.[M].人民邮电出版社,2006:50~60[6]陈卡.DirectX93D图形程序设计[M].上海科学技术出版社,2003:25~55[7]AllenSherrod.DirectX游戏开发终极指南UltimategameprogrammingwithDirectX[M].清华大学出版社,2008:56~67[8]拉莫泽.3D游戏编程大师技巧[M].人民邮电出版社,2005:77~80[9]DavidM.Bourg&GlennSeemann.游戏开发中的人工智能AIforgamedevelopers[M].东南大学出版社,2006:102~130[10]Finney.K.C..3D游戏开发大全[M].清华大学出版社,2007:25~46[11]DonaldE.Knuth.TheArtofComputerProgrammingVolume1:FundamentalAlgorithms,ThirdEdition[M].计算机程序设计的艺术,卷1:基本算法.北京:机械工业出版社,2008:10~17[12]FrankBuschmann,RegineMeunier,HansRohnert,PeterSommerlad,MichaelStal.Pattern-OrientedSoftwareArchitectureVolume1[J].ASystemofPatterns.面向模式的软件体系结构,卷1:模式系统.福亮,皑等译.北京:机械工业出版社,2000:22~29毕业设计〔论文进度计划〔从正式启动时间开始,以周为单位填写:指导教师签字:日期:年月日教学单位意见审核人签字:系〔院〔盖章年月日学院意见审核专家签章年月日备注1、由指导教师撰写,可根据长度加页,一式三份,教务处、系〔院各留存一份,发给学生一份,任务完成后附在论文内;2、凡审核不通过的任务书,请重新申报。北京邮电大学世纪学院毕业设计〔论文诚信声明本人声明所呈交的毕业设计〔论文,题目《基于DCT的数字水印技术的研究与实现》是本人在指导教师的指导下,独立进行研究工作所取得的成果,除了文中特别加以标注和致谢中所罗列的内容以外,毕业设计〔论文中不包含其他人已经发表或撰写过的研究成果,也不包含为获得北京邮电大学或其他教育机构的学位或证书而使用过的材料。申请学位论文与资料若有不实之处,本人承担一切相关责任。本人签名:日期:毕业设计〔论文使用权的说明本人完全了解北京邮电大学世纪学院有关保管、使用论文的规定,其中包括:①学校有权保管、并向有关部门送交学位论文的原件与复印件;②学校可以采用影印、缩印或其它复制手段复制并保存论文;③学校可允许论文被查阅或借阅;④学校可以学术交流为目的,复制赠送和交换学位论文;⑤学校可以公布学位论文的全部或部分内容。本人签名:日期:指导教师签名:日期:.题目基于DirectX的第一人称射击游戏制作摘要如今,3D科技得到了突飞猛进的发展,把计算机显示的领域带进了一个新的高度,其中,3D广泛地应用于游戏制作中。市面上受到消费者欢迎的游戏往往是利用成熟的3D技术设计开发的游戏,这种游戏能带给消费者更多真实的感受,带玩家进入如同真实的虚拟世界。像一些大型的3D游戏,已经成了游戏界的传说,比如射击游戏使命召唤系列。出于对3D游戏的热爱,我选择了以DirectX软件入手,来研究如何设计开发一款第一人称射击游戏。在此过程中,以下几个技术起到了至关重要的作用:〔1游戏的总体规划,包括角色的模型和游戏的菜单界面等。〔2在游戏中加入纹理和光照,并且增加对硬件的纹理和光照的支持。〔3在程序中加入脚本与GUI。〔4应用边界框与边界球技术在游戏中添加碰撞测试。〔5利用Directinput把外界设备,例如键盘鼠标,加入到游戏的控制中。〔6利用DirectSound与DirectMusic添加声音,并且加入3D摄像机系统。关键词第一人称射击游戏DirectX规划纹理和光照脚本与GUI边界框与边界球DirectinputDirectSound与DirectMusicTitleDesignafirstpersonshootinggamebasedonDirectXAbstractInthiscontemporarysociety,3dtechnologyhasdevelopedconsiderably,leadingcomputerdisplaytechnologyadvancingtoahigherposition.Meanwhile,itisusedindesignofgames.Recently,ahostofgameswhichareprevalentinthegamemarketareappliedmature3dtechnologytoprocess.Itisanindisputablefactthatthiskindofgamecouldgivegamersmorerealsensesandformavirtualworldwhichisquitereal.Somelarge3Dgames,suchascallofduty,havebecomethelegendinthegamesfield.Becauseoftheinterestin3Dgames,IchosetoresearchhowtodesignandproduceaFPSgameviatheDirectXsoftware.Duringtheresearch,someaspectsareextremelyvital.Designthegameplan,includingrolemodelsaswellasmenuinterfaces,etc.Createandusethetextureandlighttoincreasethesupportoflightandthetexturetothehardware.IncreasethescriptandGUIintheprogram.IncreasecollisiondetectioningamesviatheboundaryboxandboundaryballAddinputdetectionfunctionforthegameenginethroughtheDirectinput,detectingtheinputfromthekeyboardandmouse.UseDirectSoundandDirectMusictoplaysoundsandcreatea3Dcamerasystem.KeywordsFPSgamesDirectXplantextureandlightscriptandGUIboundaryboxandboundaryballDirectinputDirectSoundandDirectMusic目录1.前言11.1课题来源11.2国内外现状2游戏引擎2渲染2输入3声音3物理3动画4人工智能〔AI41.2.8DirectX42.技术介绍52.1VC++开发语言52.1.1VisualC++52.1.2DirectXSDK62.23DMAX简介72.33D游戏技术理论72.3.13D图形的基本成像流程7世界坐标系8摄影坐标系92.3.4剪裁和透视投影112.43D游戏技术数学基础132.4.1向量142.4.2矩阵142.4.3坐标变换143.系统架构设计203.1系统简介203.2架构设计与功能分析224.系统引擎设计234.1系统引擎架构模型234.2DIRECTX3D数学库23向量25矩阵26四元组264.2.4射线274.2.5平面274.2.6三角形和多边形274.3DIRECTX3D光照27光源284.3.2反射模型294.3.3在DirectX3D中创建光照与材质模型294.3.4引擎中增加对光照的支持314.4DIRECTX3D纹理32创建使用纹理334.4.2引擎中增加对纹理的支持344.5DIRECTX3D文本和图形用户界面364.5.1DirectX3D文本36创建和显示图形用户界面374.5.3引擎中增加对文本和GUI的支持404.6DIRECTX3D特效41多采样424.6.2雾424.6.3粒子系统434.6.4引擎中增加对特效的支持444.7基本脚本系统45属性脚本系统45命令脚本系统494.7.3令牌流504.7.4引擎中添加对脚本系统的支持524.8碰撞检测524.8.1边界框52边界球544.8.3引擎中添加对碰撞检测的支持564.9输入检测和响应584.9.1DirectInput的实现584.9.2引擎中添加对DirectInput的支持594.10模型加载614.113D摄像机系统625.系统实现655.1系统设计目标655.2组织资源655.3加载和显示最终场景675.4摄像机移动和碰撞检测705.5游戏元素725.6角色设定745.7部署运行786.总结79致谢80参考文献81.1.前言1.1课题来源总得来说,设计开发一款游戏在现在是一个拥有着无限潜力和激情的产业,尤其这十几年来,游戏产业正在飞速发展。开发游戏是一个高难度的工作,极具挑战性,同时,它也能为那些愿意付出汗水与劳动并且喜欢挑战自己的游戏开发人员许多的回报。游戏从设计到出产是个复杂的过程,它需要许多愿意付出汗水的人一起工作。在这部分人中,往往有负责编程的,负责写剧本的,做音乐特效的,设计数学和物理模型的还有其他工作成员。每个成员需要做的事情都不一样,遇到的难度和拥有的奖赏也不一样。游戏这个行业从出现之后,到现在已经完善的十分迅速,现今的游戏产业能够与电影电视这样的传统行业相比肩,并且在娱乐市场中占据很大的比例。与此同时,游戏行业的科技和生产效率也不断在改善,它能够创造上百亿美元的利益。作为游戏行业中的发展迅速的电脑游戏,在这个行业中已经有数十年的历史了。游戏在市场上拥有的用户群体也很广泛,以成年人为主要的消费群体,同时也照顾了小孩子的市场,所以其的利益是个很可观的数字。游戏的从设计到出产的过程,不是像玩游戏的那种总是充满着轻松和刺激的感觉。应用开发交互式软件设计游戏是一项困难并且极富挑战性的工作,任何对其不重视的人都不可能会顺利完成工作。但是,这个过程同样的也充满乐趣,只不过要求工作成员奉献出更多的汗水和努力。有很多人因为喜欢玩游戏而选择开发游戏,但是等他们真正开发游戏的时候,却因为困难太多而放弃了。在这个过程中,最为艰难的东西就是去学会应用设计一款游戏所需要的技术手段。去了解应用一些基本的手段需要花费大量的时间与精力,不过此过程也会为设计人员打下坚牢的基础,再加上对游戏行业充满激情和兴趣,相信开发出精品的产品不是问题。在这篇论文中,我对开发一款第一人称设计游戏进行了研究,利用DirectX软件,从设计一款游戏的总体规划,游戏中的纹理和光照,程序中的脚本和GUI,边界框与边界球技术,Directinput与外界接入设备,DirectSound与DirectMusic这两个和声音的应用并且附加了3D摄像机系统这几个方面对游戏进行了相关的分析。1.2国内外现状游戏引擎引擎是由许多的代码组成的,它能够给开发游戏的成员提供一个良好的平台。现在的引擎往往隐藏了一部分底层实现的具体代码。比如利用Direct3D设计的渲染引擎,它能够对使用它的人隐藏了具体的渲染引擎细节。游戏的引擎有:渲染,物理,声音等等。游戏的引擎其实就是由很多小引擎集合而成的。其包含的东西没有一个准确的意义。拿电脑游戏来说,它的引擎肯定涵盖了渲染和输入,要不然就不能叫做交互式的游戏。引擎的独立开发是个艰难的工作,在游戏的开发中,所需要的一些基本的在DirectX的API基础上开发的引擎有渲染引擎,利用DirectInput的输入引擎,利用DirectSound的声音引擎,包括碰撞运动的物理引擎,动画引擎还有AI引擎。其中引擎的代码涵盖了建立出错日志,执行命令,基本的肩膀能力与图形用户界面〔GUI系统,GUI系统在设计主菜单和装载场景的时候有用。引擎的分析开发在设计游戏中必不可少,因为在开发设计游戏引擎中,它可以操控游戏中各种各样的元素,如,游戏引擎中的语言算法不仅仅能够收到并且分析外界设备对其输入的指令,也可以根据运算对视频音频和特效进行控制,所以无论游戏是什么形式〔2D还是3D,角色扮演,即时策略,冒险解密或者是动作射击,引擎的设计都是必不可少的一部分。开发游戏的最早部分就是构建一个理想的引擎框架,也能这么理解,分析设计引擎是对3D游戏的流水线进行概括的分析。在第一人称视角游戏的引擎设计过程中,可以改变光线的照射和裁剪的顺序来降低工作量或改善运行效率。渲染计算机图形学被广泛应用于许多领域中,大量前沿的渲染手段应用在交互式设备中,原来仅仅局限在离线设备中,这是因为当今的硬件技术能够分析各种各样的图形。并且,渲染科技的发展使其不仅仅使用在CPU上,也可以在GPU上。现在,人们可以使用一种预计算手段把游戏中的图片模型排列得更加繁琐。这个技术现在可以自动高亮出不动的目标,但是对于正在变化位置的目标来说还不够成熟。现在的硬件采用各种各样的上色方法,对目标上色。渲染是一款游戏引擎里最重要的系统。这个系统能够在显示器画出几何图案,浮现文本,渲染GUI,展现硬件的光照系统。与此同时,它还可以把图形附加在场景里面的几何图案表面。输入在开发游戏的过程中,做好检测输入的工作是十分重要的。在这里,应用DirectX中的DirectInputAPI能够检测多种设备的输入,并且不会有错误的发生。对进行输入的设备,就要对其进行输入测试,比如键盘鼠标等等。DirectInput上的接口能够检查出各种各样的输入设备。现在市面上,键盘鼠标和游戏的控制器作为主要的输入设备。游戏的控制器包括像方向盘摇杆这些不是鼠标也不是键盘的设备。完善游戏的输入系统就是要对这些编写代码并且进行检测,要在游戏中能够使用这些设备。1.2.4声音在DirectX软件中,主要应用DirectSound来在游戏的引擎中出来声音。DirectSound为DirectX中的一个API,它的职责是处理所有声音。声音系统实际上是作为一个比较小的系统存在于一个游戏的引擎之中,它利用比较少的代码就能够控制所有的声音。游戏引擎里的声音在游戏的背景音乐与3D音效中使用,根据游戏的需要,可能涵盖了一些战斗的声音和根据不同场景出现的不同声音。声音都是在文件之中装载的,可以进行完整的装载或者是以流进行播放,比如用DirectSound可以处理声音的回放。1.2.5物理物理系统包括了许多的东西,主要是架构3D游戏的现实和分解功能。物理是3D游戏的基础,所以成为了设计人员必备的基础知识。在第一人称设计游戏中,需要涵盖重力与碰撞测试的物理学内容。游戏中的物理学不仅仅是数学,还有工作的状况和运行方式。现在许多游戏都良好的运用物理学在游戏中,比如使命召唤系列,这貌似把游戏产业的入门门槛拉高了。游戏中的物理学给游戏带来了很多东西,比如改变物理性质能够重新设计人与环境交互的情形。可以说一些复杂的物理系统的研发工作非常花费时间和金钱,但是以这个物理系统设计出的游戏,无一不是经典,也就是说可以从物理系统的复杂程度上来简单区别一个游戏的好坏。1.2.6动画计算机图形学在动画的绘制上应用广泛,如人物的模型。绘制人物的动画模型,应用于多种多样的影视作品之中。但是,在电脑3D游戏中,角色的绘制是一个很难解决的事情,因为生成的角色模型必须随着输入设备下达的指令随时变化,同时也要和其余的人物产生互动。这个时候,计算机的绘制科技就显得尤为重要,一些成熟的技术可以应对大型3D游戏的开发,一些多层次的动画绘制技术却变得更加困难。绘制手段通常有:几何图形的设计,动态绘画方法和人物躯干的控制。人工智能〔AIAI系统在游戏中是必不可少的,玩家在进行游戏的过程有,会有很多的敌人,玩家的任务是与其进行争斗直到完成某些特定的任务。如果AI表现的过于疲软,那么这个游戏对玩家的吸引就会降低,所以完善AI可以增加游戏的难度,吸引玩家在游戏上投入更多的时间。在游戏里,AI操控着非玩家单位的行为,AI有很多种类和很多手段去执行,像脚本和硬编码行为等等。1.2.8DirectXDirectX是微软公司生产的一个应用程序接口的软件,在设计研发交互式软件中起了很重要的作用。它在1995年出现,到现在已经是研发多媒体系统软件的金标准,全部的研发成员都在应用这个软件进行开发设计。DirectX不仅仅应用于游戏的研发还能够设计一些软件可以设计游戏中的角色,还可以设计一些关于网络和图形的软件。APIDirectX包括DirectGraphics,DirectInput,DirectPlay,DirectMusic,DirectSound这些部分。每个部分都可以各自独立运行,进行不同功能的运作。它们都可以被硬件加速,也就是说能够直接与硬件进行数据交流,能够给设计人员更好的操作条件。2.技术介绍2.1VC++开发语言如今,在开发3D游戏的过程中需要根据不同的要求来挑选相应的开发语言。例如,在开发小型的3D游戏程序中,主流的软件有:微软公司的VisualC++和DirectXSDK开发包微软公司的C#和XNAVisualC++和OpenGL在现在市面上许许多多的程序开发软件中,有的在语言弹性和执行的效率上有优势,有的倾向处理和运算图形,有的倾向设计大型软件,可以满足设计人员的各种目的,各有各的特点。在这些软件中VisualC++和DirectXSDK这个由微软公司出品的组合,在开发3D游戏中有着重要的作用,现在市面上的游戏几乎都有DirectX的程序,在这次的论文中,我也选择这个组合来进行开发。2.1.1VisualC++VC++是Windows平台上的C++编程环境,在Windows平台上具有强大的优势。在3D图形开发中更因为自己语言的特点具有无可比拟的优势,具体体现在:〔一面向对象面向对象可以说是VC++最重要的特性。VC++语言的设计完全是面向对象的。VC++支持静态和动态风格的代码继承及重用〔二底层调用VC++主要面向Windows系统,可以方便实现一些底层的应用。在VC++中直接调用硬件等底层接口非常方便。在3D图形开发中,直接调用显卡而不是通过复杂的接口可以更高效的显示图形。〔三执行效率高VC++的编译和链接器具有非常高效的执行效率,与同为微软公司出品的C#语言相比,VC++的执行效率比之要高出数倍以上。虽然VC++不像C#一样支持垃圾回收功能大大降低了开发效率,但这在3D游戏图形程序开发中却能使开发人员更好的处理内存与指针,大大提高了执行效率。〔四多线程VC++支持多线程,多线程功能使得在一个程序里可同时执行多个小任务。线程,有时也称小进程,是一个大进程里分出来的小的独立的进程。〔五与DirectXSDK的无缝组合VC++与DirectXSDK均为微软公司出品,且DirectXSDK中的所有源代码均为C++语言编写,在接口调用上它们存在的天然的优势,这也说明了为什么在图形游戏开发中它们一直是雷打不动的组合。2.1.2DirectXSDKDirectX,〔DirecteXtension,简称DX是由微软公司创建的多媒体编程接口。由C++编程语言实现,遵循COM。被广泛使用于MicrosoftWindows、MicrosoftXbox和MicrosoftXbox360电子游戏开发,并且只能支持这些平台。最新版本为DirectX11,普及版本为DirectX9.0c。DirectX是多种应用程序接口〔API的集合,它可以让windows为平台的游戏或多媒体程序获得更高的执行效率。DirectX包含有DirectGraphics<Direct3D+DirectDraw>、DirectInput、DirectPlay、DirectSound、DirectShow、DirectSetup、DirectMediaObjects等多个组件,它提供了一整套的多媒体接口方案。〔一Direct3D为大多数新视频适配器内置的3-D调色功能提供界面。Direct3D是一种低级的3-DAPI,它为软件程序提供一种独立于设备之外的方法以便与加速器硬件进行有效而强大的通信。Direct3D包含专用CPU指令集支持,从而可为新型计算机提供进一步加速支持。〔二DirectSound为程序和音频适配器的混音、声音播放和声音捕获功能之间提供了链接。DirectSound为多媒体软件程序提供低延迟混合、硬件加速以及直接访问声音设备等功能。维护与现有设备驱动程序的兼容性时提供该功能。〔三DirectInput为游戏提供高级输入功能并能处理游戏杆以及包括鼠标、键盘和强力反馈游戏控制器在内的其它相关设备的输入。〔四DirectPlay支持通过调制解调器、Internet或局域网连接游戏。DirectPlay简化了对通信服务的访问,并提供了一种能够使游戏彼此通信的方法而不受协议或联机服务的限制。DirectPlay提供了多种游说服务,可简化多媒体播放器游戏的初始化,同时还支持可靠的通信协议以确保重要游戏数据在网络上不会丢失。〔五DirectShow提供了可在您的计算机与Internet服务器上进行高品质捕获与回放多媒体文件的功能。DirectShow支持各种音频与视频格式,包括"高级流式格式<ASF>"、"音频-视频交错<AVI>"、"数字视频<DV>"、"动画专家组<MPEG>"、"MPEG音频层3<MP3>"、"Windows媒体音频/视频<WMA/WMV>"以及WAV文件。DirectShow还具有视频捕获、DVD回放、视频编辑与混合、硬件加速视频解码以及调谐广播模拟与数字电视信号等功能。2.23DMAX简介3D游戏系统中需要有大量3D模型的存在,对于3D模型的制作,3DMAX当然是首选。3DStudioMax,常简称为3dsMax或MAX,是Autodesk公司开发的基于PC系统的三维动画渲染和制作软件。在应用范围方面,广泛应用于广告、影视、工业设计、建筑设计、多媒体制作、游戏、辅助教学以及工程可视化等领域。拥有强大功能的3DSMAX被广泛地应用于电视及娱乐业中,比如片头动画和视频游戏的制作,深深扎根于玩家心中的劳拉角色形象就是3DSMAX的杰作。在影视特效方面也有一定的应用。而在国内发展的相对比较成熟的建筑效果图和建筑动画制作中,3DSMAX的使用率更是占据了绝对的优势。根据不同行业的应用特点对3DSMAX的掌握程度也有不同的要求,建筑方面的应用相对来说要局限性大一些,它只要求单帧的渲染效果和环境效果,只涉及到比较简单的动画;片头动画和视频游戏应用中动画占的比例很大,特别是视频游戏对角色动画的要求要高一些;影视特效方面的应用则把3DSMAX的功能发挥到了极至。2.33D游戏技术理论2.3.13D图形的基本成像流程传统上3D图形的处理方法是,将待显示的3D物体〔如杯子表面微分为一个个小三角形面〔这些三角形面的数量越多,显示出来图形效果越精致、光滑。每个三角形面就成为构成3D复杂物件的基本图元,它有3个顶点。这样3D物件的绘制就转换为逼近的微小三角形面的绘制,而3D物件的图形方位数据就可用三角形的顶点坐标值来存储。2.3.2世界坐标系3D物体划分为众多的三角形面表示后,物体表面的图形方位就可利用三角形面的顶点来确定。为了从数值上定量3D图形的方位数据,引入一个世界坐标系,这样每一个顶点均可准确地用一个<x,y,z>坐标定位出来,从而实现3D图形的形数转换。一般地,场景中的每个待显示的3D物体都采用某个中心点作为原点来架设坐标系,以给出每个逼近三角表顶点的坐标值。毕竟,场景中的这些3D物体通常是各自先行创建出来的,例如,利用一些3D建模软件取得的网格顶点数据就是基本这样的坐标系。这种坐标系称为局部坐标系。在大多数情形下,局部坐标系的x、y和z轴都与世界坐标系x、y和z轴是相应平行的。在一个预先设定的世界坐标空间中,为每个局部坐标系选定原点位置后,各个局部坐标系的3D物体上的部分三角形的顶点坐标,就可通过简单的平移计算转换为世界坐标系下的坐标。这里,局部坐标系和世界坐标系不可以脱离开来理解,否则这个局部坐标系的点坐标无法准确地用统一的坐标系〔世界坐标系的坐标值来表示。三角形面的顶点<x,y,z>坐标值已成功解决了3D物体表面的位置定位问题,要保存3D物体的颜色值等顶点信息可用VC++语言的结构体来表示。当顶点的颜色值确定以后,三角形面的内部点的颜色值就可以通过某种插值方法计算出来,从而整个3D物体表面上的点的颜色值也就确定下来了。此外,考虑到光照对3D物体表面颜色的影响,通常需要根据具体的三角形面的顶点坐标数据,计算出顶点处的法向量。因为一个顶点往往是多个邻接三角形面的公共交点,因此,顶点处的法向量通常是一个平均法向量。世界坐标系世界坐标系局部坐标系2局部坐标系1图2.1世界坐标系与局部坐标系的关系图2.2顶点的法向量把顶点的法向量和光线的方向向量作某种数学运算,就可修正该顶点光源贡献的实际颜色值。由此,顶点的结构体必须添加一个反映其上法向量的变量域。这一步通常需要将网络化的3D物体从各自的局部坐标系中放入同一个世界坐标系中,并通过相应的数学计算〔平移变换得出3D物体在世界坐标系中的顶点坐标,并按光照模型计算出每个顶点的颜色值。从以上的讨论很自然地引出如下的几个待解决的3D数学问题:1、平移坐标变换的坐标计算问题。已知点在一个坐标系下的坐标值,计算在另一个平移坐标系下的新坐标。2、法向量的计算,如何根据已知的三个点坐标,计算出所在平面的法向量。3、点和向量的统一表示,寻找一种可以统一三维空间中点和向量的表示方法,使得点和向量的坐标计算在形式上能统一起来,并且保证运算上的形式简洁。2.3.3摄影坐标系三维场景的空间范围可以是无限的,计算机屏幕的大小却是有限的。因而不可能,也不需要把三维场景中的物体同时在有限的屏幕上全部显示出来。这就要求对三维场景进行必要的可视范围的选择。显然这是符合人对周围环境观察特性的,不同角度、不同距离看同一景致,会产生不同的视觉图像。于是,就有必要在世界坐标系中引入一个观察者来确定当前哪些场景物体应该被显示出来。这个观察者也可以理解为照相机或摄影机。观察者可由世界坐标系中的一个点和一个指示观察方向的向量来决定。如图2.3所示。观察者及其观察方向观察者及其观察方向图2.3世界坐标系下的观察者位置及观察方向从观察者位置出主,沿着视线的观察方向可构造一个棱锥体的视觉区域,此时,再通过一个远平面和一个近平面进行截割,形成一个去除了锥头的棱台体,这个棱台体就是观察进的可见区域范围。如图2.4所示,其中远平面和近平面又称为远视截图和近视截图。而棱台体又称为视截体。远视截面远视截面近视截面观察者图2.4决定观察可风区域的视截体垂直视角a除了远、近两个视截面限制了可见范围的纵深外,还需要利用视域的垂直视角a来限制在垂直方向上张开的视角区域大小。至于视域的宽度限制则不使用角度来说明,而是采用任一截平面的宽高比率Aspect来指定。为了不使透视投影后的图像在计算机屏幕上显示时产生比例失真,Aspect一般取值为屏幕的宽高比,即Aspect=显示器屏幕宽度/显示器屏幕高度。视截体确定以后,下一步就要对三维物体的哪些三角形面需要显示出来或部分显示出来,哪些三角形面由于位于视截体外而不需要进行显示进行计算分析,这个过程称为三维剪裁。为了方便三维剪裁的处理,首先需要对视截体的6个面〔左侧面、右侧面、顶面、底面、近视截面和远视截面的坐标方程进行简化。为此,在观察者处建立一个所谓的摄影坐标系,并使其z轴方向指向观察方向,如图2.5所示。xxyz图2.5摄影坐标系在摄影坐标系下,左侧面、右侧面、顶面和底面由于都经这坐标原点,因此它们的坐标方程都简化为一个齐次方程〔如ax+by+c=0,而近视和远视截面的方程式更简单,为z=n和z=f的形式,这也是选择z轴指向观察方向的原因。这里,自然也会提出如下4个3D数学问题:1、如何从数学上描述摄影坐标系与世界坐标系的关系。2、已知的世界坐标系下的点的坐标在摄影坐标系下的坐标值应如何计算出来。3、已知在摄影坐标系下的视截体的6个面的方程式,如何逆向计算出这些面在世界坐标系下的方程。4、在摄影坐标系下,如何将6个视截体的面的法向量计算出来。2.3.4剪裁和透视投影三维视截体的剪裁并不是独立进行的,而是结合透视投影来进行的。透视投影就是将三维物体按照透视几何的方法投影到一个平面上,从而实现三维图形到二维图形的转化。例如,在z=1的位置上,可建立一个投影窗口,对于视截体内的任一点P,它的透视投影对应点P’为OP线段与投影窗口的交点,如图6所示。远视截面远视截面近视截面观察者O图2.6投影窗口和透视投影投影窗口z=1xyzPP’从几何特性看,对于同等大小的物体〔如三角形面,透视投影把更远处的物体投影得更小,即具有"近大远小"的特别,完全符合人的视觉感受。显然,透视投影只需要对那些们于视截体内的三角形面的顶点进行投影,这意味着投影前要对顶点是否位于视截体内进行判断,即进行剪裁处理,以减少不必要的计算。只有位于视截体内未被剪裁掉的顶点才进行透视投影。为了简化剪裁的判断处理,实际并不采用图2.6所示的透视投影,而是寻找一个具有透视投影性质,同时又可将视截体转换为立方体的变换,从而使顶点是否在视截体内的判断,变为顶点的坐标分量x、y和z是否分别介于区间[-1,1]、[-1,0]和[0,1]的判断。满足这种性质的变换又称为齐次投影剪裁变换。以二维剪裁为例〔不难推广到三维情形,如图2.7所示,假设剪裁区域由一个正方形来决定,图中有3个三角形,最左侧的三角形3个顶点都位于正方形内,因此这个三角形应该被显示出来。而最右侧的三角形顶点均不在正方形内,因此被剪裁掉不显示。中间的三角形部分位于正方形区域内〔1个顶点在正方形内,2个顶点在外,因此通过求交取得三角形边与正方形右边线段交战,从而确定出新的三角形ABC被显示到屏幕上。AABC图2.7二维剪裁由于上面的剪裁区域为一个规则的矩形,因此点是否落在矩形内是很容易判断的。相反,如果直接以摄影空间中的视截体为剪裁区域,那么必须计算棱台6个面的法向量,然后通过点向量与法向量的点积运算结果〔正数或负数来判断点在棱台内或棱台外。因此,将视截体棱台转制为立方体对于剪裁处理是十分必要的。当便于剪裁处理的透视投影变换选定后,就可以摄影空间中三维物体的各个微分三角形面顶点坐标进行投影变换计算,得到每个顶点的新坐标值,其中。这样集合可表示出顶点在平面上投影情况,而仍可反映出顶点的纵深度。为了更直观地看待这个可将视截体转换为立方体的透视投影的作用,可想象在摄影空间的三维物体的顶点都被投影到一个平面上〔可理解为投影窗口,它的顶点坐标可从上同的获得,而在每个投影顶点都关联着一个表示原来顶点的纵深度的坐标值。2.43D游戏技术数学基础三维物体从取景到投影,需要经过一系列的坐标,才能生成二维的图形数据加以显示。因此,变换后的坐标计算就成了三维图形淡定中的一个基本数学问题。例如,三角形面的顶点的坐标变换计算、三角形面的法向量的变换计算以及视截体的平面方程的计算等。在三维图形开发中,三维的点和向量实际是采用四维向量或来统一处理的,这样,才可以将各种变换的式子用齐次的矩阵形式表示出来。下面除了要介绍向量和矩阵的基本数学运算外,还将具体计算坐标系的平衡、缩放和旋转变换的矩阵。2.4.1向量在物理学的研究中,一些既有大小,又有方向的量,如力、速度等物理量,用一条有方向的线段〔有向线段来表示。这个有向线段就是向量,又称为矢量。虽然向量是一个与坐标系无关的几何量,但是可以引入坐标系来加以研究。如果将方向相同、大小相等的向量定义为相等的向量,那么可将向量的起始点移到原点处,其箭头所在的端点的坐标或三维坐标系下的将与向量一一对应,从而在坐标系下的向量可用一组标量坐标值或给出,实现了向量由形到数的转变。向量的坐标表示对于游戏开发来说是必需的,在世界坐标系下或摄影坐标系下的三角形面的法线、光线的方向和观察者的方向等都是通过向量的坐标形式来准确给出的。甚至还要根据真实空间〔二维或三维的特性,从已知的向量出发计算某一新向量的各个坐标值。2.4.2矩阵在线性方程组的求解上,变元较少的方程组〔如仅有两个未知数和的方程组的解很容易表达出来,但是推广到较为复杂的更多变元的情形,如何推测方程组的解以及如何用的式子表达出来,引发了对行列式的提出和研究。行列式实质上是方阵数据的一种运算,由此自然地想到,可对一般阵列数据定义代数运算,就像对向量定义运算一样。这样是矩阵运算的产生历史。矩阵的出现使得方程组的求解可用矩阵的运算来演绎,求解过程更为简洁。矩阵的另一个常见应用就是用来表示坐标系平移、旋转变换后,点或向量的新旧坐标对应关系。这就是矩阵对3D开发的关键所在,因为开发中往往涉及到世界坐标系、摄影坐标系和投影坐标系之间的坐标变换计算。2.4.3坐标变换坐标变换可以用两种不同观点去理解。以几何点的坐标变换为例,一种观点是保持几何点空间位置不变,在空间中建立新的坐标系〔例如将原来的坐标系平行移动到新的位置,要求计算出该点在新坐标系的坐标。另一种观点是保持坐标系不变,几何点移动到新的位置处,要求计算新位置处几何点的坐标。两种观点在不同的应用场合各有方便之处。在世界坐标系已知的情况下,建立摄影坐标系,以简化视截体的平面方程,又或利用透视投影变换将三维的图形数据转换为二维的图形数据,都是涉及到新、旧两个坐标系的转换,此时采用坐标系变换的第一种观点去理解比较适合;当3D游戏中的精灵在三维场景中移动时,则采用点移动的第二种比较适于思考。下面将结合以上两种观点来介绍平移、缩放和旋转这3个最基本的变换。〔一平移变换考虑某一坐标系下的任意一点,在坐标系中任选一点,建立一个新的坐标系,各坐标轴正向平行于轴。现在需要求出点在新坐标系下的坐标。如图2.8,构造3个向量来推导出点在下的坐标。由空间几何的向量性质得式<2-1>: <2-1>图2.8平移坐标变换图2.8平移坐标变换O’Oxx’yy’zz’P从而,展开向量的坐标分量取得如下的方程组<2-2>: <2-2>于是,,。由此可以看到,坐标系可看成是坐标系平行移动而来的,其中轴方向平移单位,轴方向平移单位,轴方向平移单位。在这种坐标系的平移变换下,点的坐标变换关系工是将相应的、和坐标值减少对应的平移单位大小。再考虑在中选定一点,建立另一个平移坐标系,那么点在这个下的坐标满足式<2-3>: <2-3>这里,,。显然,以上变换式子还需要进一步转换为关于和的齐次等式来表示,才可以简化连续多个变换〔包括将要介绍的旋转变换下的坐标关系式。可以利用矩阵将此等式构造出来。为此,先将点与一个四维向量一一对应起来,然后,可根据等式建立如下等价的齐次关系等式<2-4>。 <2-4>等式右边的矩阵称为平移变换矩阵,它由坐标系平移到点的坐标值来决定,可简单表示为,如式<2-5>。 <2-5>三维向量和三维的点都可以用四维向量统一表示出来。四维向量的第4个分量又称为齐次坐标,四维向量的空间则称为齐次空间。以上平移坐标变换,是计算原有坐标系中的点和向量在新坐标系中的坐标。如果采用同一个坐标系下,点或向量的平行移动观点去理解平移变换,即一个点或向量〔随着坐标轴平行移动到一个新的位置,要求计算该点或向量的新坐标值,那么相当于求出在原坐标系中的坐标。因此,平移后的点或向量的坐标值将使用如下的矩阵来计算〔相差一个负号。如式<2-6>。 <2-6>上面的矩阵就是DirectX平移变换所使用的矩阵。通常三维物体已在它的局部坐标系中建立了各个顶点的坐标,绘制该三维物体时,需要先移入世界坐标系中。此时,可想象该三维物体的局部坐标系的原点与世界坐标系的原点重合,然后通过平等移动,将三维物体移入世界坐标系。这样就可应用上面的矩阵,计算三维物体网络中的顶点在世界坐标系的新坐标。〔二放大缩小变换计算机屏幕上的视口坐标系与世界坐标系等三维空间的坐标系的度量是不同的,最终把三维图形显示在计算机屏幕上,需要进行坐标放大缩小。所谓的坐标系放大缩小变换就是指保持坐标系的原有位置不变,仅改变坐标轴的单位长度的大小来建立新的坐标系。坐标系中一点,当坐标系的单位长度调整以后,点在的坐标显然也会发生改变。当然还可采用保持坐标系不变的观点去理解缩放变换,即同一个坐标系中的点、和坐标值分别缩放一个比例数值、和,以产生一个新的点,该点的坐标可通过如下的变换矩阵计算出来,这个矩阵就是DirectX使用的缩放矩阵。如式<2-7>。 <2-7>〔三旋转变换最后一个基本的坐标变换为坐标轴的旋转变换。如图2.9所示的旋转可看作是平面绕轴旋转一个角,然后将平面绕轴旋转一个角,最后将平面绕轴旋转一个角。也就是说,任意一个旋转变换的矩阵等于这3个绕、和轴旋转变换矩阵的乘积。xxx’yy’zz’图2.9坐标系的旋转下面给出绕、和轴旋转的变换矩阵、和。〔推导略绕轴变换矩阵为 <2-8>绕轴变换矩阵为 <2-9>绕轴变换矩阵为 <2-10>〔四平面将三维物体表面剖分为一系列的三角形面,物体的光照亮度处理就转化为对这些平面三角形的照明处理,从而可简单地通过平面三角形面的法向量与光的入射方向的夹角,来确定各种入射光对平面上每一点所贡献的亮度值。此外,随着程序的运行,观察角度不断发生改变,这就需要重新判断三维场景中哪些物体处于视截体之内,要对视截体的6个侧面的法向量进行计算,以此通过点与法向量的点积运算决定点在平面的哪一侧。由于三维游戏通常需要对平面方程式及平面上的法向量进行计算,因此DirectX提供了相应的结构体和函数来支持与平面有关的计算。3.系统架构设计3.1系统简介本系统是一个第一人称射击游戏的程序,是为了在学习的基础上设计一个拥有一些基本功能的游戏场景,同时让玩家可如身临其境般操作游戏内的人物进行各种动作,也为我自己今后在这方面的学习打下基础。本系统完成后的截图如下:图3.1场景截图1图3.2场景截图2图3.3场景截图3本系统要实现的功能模块主要有:一、Win32程序的执行二、光照处理三、纹理处理四、文本和图形处理五、特效处理六、系统脚本的处理七、系统内物体间的碰撞检测八、输入检测与响应九、3D模型的加载与场景管理十、系统进行的目标实现3.2架构设计与功能分析为了充分实现代码的重复利用,拟将本游戏分为两部分设计,游戏的主程序部分与游戏引擎部分。引擎部分提供实现第一人称射击游戏的各种接口供游戏主程序部分调用,同时先可以发布生成.lib文件供其它程序调用;游戏主程序部分实现系统的主界面部分,同时调用引擎接口实现游戏的各种设置与特效。双方的关系如图3.4。图3.4系统关系图4.系统引擎设计4.1系统引擎架构模型游戏引擎主要实现整个游戏中光照、纹理、文本和图形、特效、系统脚本、碰撞检测、输入检测与响应及3D模型的加载与场景管理等模块的功能,同时,为了实现上述的功能,必须首先实现一个3D数学库,提供对向量、矩阵四元组等的支持。具体的功能关系见图4.1:图4.1系统引擎各部分关系图4.2DirectX3D数学库3D游戏的核心就是数学,数学可用于计算渲染的场景,移动游戏角色和物体,实现物理学的真实仿真,控制人工智能及大量人们认为理所当然的东西。正如上一章所介绍的数学知识,矢量、矩阵、四元组、射线、平面、多边形和简单的物理学,都是需要关注的东西。本节的目标是建立一个可供程序调用的数学库,来进行各式各样的3D运算。各部分具体的关系如图4.2:图4.23D数学库内部关系图首先要介绍的是MathDefines.h头文件,该文件保存了所有的define语句,这些语句是数学库、引擎及程序都要用到的内容。这些define语句包含了π<圆周率,圆的周长与直径的比值>的定义、平面结果和将度转换成弧度的宏。程序代码如下:#ifndef_UGP_MATH_DEF_H_#define_UGP_MATH_DEF_H_#defineUGP_FRONT0#defineUGP_BACK1#defineUGP_ON_PLANE2#defineUGP_CLIPPED3#defineUGP_CULLED4#defineUGP_VISIBLE5#ifndefPI#endif//将度转换成弧度#defineGET_RADIANS<degree><float><degree/180.0f*PI>#endif接下来是MathLibrary.h头文件,该头文件保存所有与数学相关的include语句。包括对矢量、矩阵、面、多边形等实现文件的引用。程序代码如下:#ifndef_UGP_MATH_LIBRARY_H_#define_UGP_MATH_LIBRARY_H_#include"Vector.h"//向量<即矢量>相关#include"Matrix.h"//矩阵相关#include"Quaternion.h"//四元组相关#include"Physics.h"//物理学相关classCRay;//射线类classCPlane;//平面类classCPolygon;//多边形类#include"Ray.h"#include"Plane.h"#include"Polygon.h"#include"MathDefines.h"#endif向量如前所述,向量是3D游戏开发中涉及的最基本对象。3D向量保存在3D空间中指定位置的3个轴上。这些轴分别是x轴、y轴和z轴,分别代表空间中的宽度、高度和深度。这些值可对3D环境中的任意物体定位。3D向量是一个包含三个浮点数的结构。3D数学库中有关向量的部分在引擎GameEngine项目中文件Vector.h与Vector.cpp中定义和实现。在这两个文件中除了定义了向量在VC++中结构体的表示方法外,还包括向量长度、点积、叉积、向量归一化的计算,以及Direct3D向量的定义和各种数学运算。为其它部分调用向量计算提供基础。矩阵在计算机图形学中,诸如矩阵这样的对象可以控制物体的位置和旋转。矩阵是浮点数的2D数组,可以对矢量进行平移、旋转、缩放和变换。从根本上讲,矩阵是由行和列构成的表。矩阵有多种形式,如3×3、3×4和4×4。这里矩阵的数分别代表2D数组包含的行数和列数。例如,4×4矩阵由16个元素组成,因为4×4矩阵有4行,4列<4×4=16>。3D数学库中有关矩阵的部分在引擎GameEngine项目中文件Matrix.h与Matrix.cpp中定义和实现。在这两个文件中除了定义了矩阵的在VC++中的表示方法外,还包括4×4矩阵的乘法、转置和旋转计算,以及Direct3D矩阵内置对象和函数的初始化。四元组旋转是3D编程中最常用的操作之一。旋转用于改变物体方向,或是绕着场景中某个轴或具体的点转动,并且可以移动骨骼动画中要用到的骨架点。正因为旋转如此重要,所以提高它们的精确度、速度和效率具有很重要的意义。例如,就骨骼动画而言,存储效率和速度对系统也许是最重要的两个要素,这是由系统的复杂性和存储旋转数据所需的内存就决定的。曾有一段时间使用矩阵实现旋转,出现过问题。这主要是因为使用矩阵会消耗大量内存和运算时间,甚至在某些时候会产生Gimblelock问题而无法准确计算旋转结果。而四元组是4D数学对象,并不是4D矢量,但能当作4D矢量对待。它充分解决了使用矩阵转换的缺点。用四元组计算会得到更平滑的计算结果,更准确的旋转,而不会受到Gimblelock的影响。3D数学库中有关四元组的部分在引擎GameEngine项目中文件Quaternion.h与Quaternion.cpp中定义和实现。在这两个文件中除了定义了四元组在VC++中结构体的表示方法外,还包括四元组点积、长度、乘法等的计算。4.2.4射线射线是包含原点<位置>和方向的结构。射线主要在查看两个平面是否发生碰撞,或相互之间可能会出现碰撞时做碰撞检测使用。同样,可以通过鼠标使用射线来选择对象。计算机图形学中射线的另一种用途是实现一种名为射线跟踪的渲染技术。简单地讲,射线跟踪是在场景中发射射线,并确定哪一根射线击中了哪一个物体。3D数学库中有关射线的部分在引擎GameEngine项目中文件Ray.h与Ray.cpp中定义和实现。在这两个文件中定义了射线在VC++中结构体的表示方法。4.2.5平面平面是一个无限扩展的区域。是3D场景中的核心部分,如果没有平面,将无法进行诸如几何图形选择和碰撞检测等操作。3D数学库中有关平面的部分在引擎GameEngine项目中文件Plane.h与Plane.cpp中定义和实现。在这两个文件中定义了平面在VC++中结构体的表示方法以及计算三角形法线,判断平面与平面、平面与射线间是否相交,点与平面的关系,点与平面的距离等计算的实现。同时,它们也实现了Direct3D平面的初始化操作。4.2.6三角形和多边形Direct3D应用程序中的一些图元由诸如多边形这样的对象构成。多边形是封闭的平面图形,边界由一些线段组成。多边形是一个面,由三个或更多的相连成形的点构成。读者可以见到,最常用的一类多边形是三角形。三角形由三个互连在一起组成像2D金字塔形状的不同点构成。3D数学库中有关三角形和多边形的部分在引擎GameEngine项目中文件Polygon.h与Polygon.h.cpp中定义和实现。在这两个文件中定义了三角形和多边形在VC++中结构体的表示方法。4.3DirectX3D光照光照是一门为3D场景增加真实感的技术,它以某种方式通过对物体分布不同的亮光和黑暗形成阴影而实现真实感。如同在现在许多游戏中见到的一样,光照可以将场景带入到一个全新的真实感层次。为场景增加光照会对已渲染的场景产生巨大的影响。图4.3给出了相同场景的三个不同光照的版本。左边的场景没有光照和阴影,中间的场景有光照而没有阴影,右边的场景两者都有。图4.3相同场景的三个不同光照版本光源光源是3D场景中发光的物体。这种所谓的光会导致阴影发生不同的变化,因而产生更具有真实感和更令人感兴趣的场景。通过在场景中基于"光"信息让物体从亮到黑逐渐发生变化,可以在图形程序中创建非常真实的光照模拟。然后增加阴影,只是在看不见光源的表面上出现亮度变化,如黑色或是黑灰色。换句话说,有另一个表面介于光源和要增加阴影的表面之间。通常在计算机图形学中有三类光源需要考虑,分别是点光源、聚光光源和方向性光源。〔一点光源点光源是一种在某个距离上向所有方向发光的光源。随着光传播一定的距离,它会损失一定的能量而且亮度也会逐渐降低。〔二聚光光源聚光光源在一定距离上散法能量<类似于点光源>。与点光源的差别在于聚光光源是通过一个圆锥将光发射到3D场景中,而不是在各个方向都发光。〔三方向性光源在计算机图形学中,第三种光被称为方向光。这些光像是从某个方向发生出来的,而没有特定的光源<整理者:类似于太阳光>。现实生活中,所有的光源都有一个产生光的源点,但在计算机图形学中产生一种没有发光源点的光源也是可能的。在光照计算机过程中,通过几个数学计算就可以实现该光源。这些光源看上去不是很真实,但它们在渲染简单的场景和简单形状的演示程序时,却足以满足要求。4.3.2反射模型反射模型描述了光照射到某个表面时,入射光在物体表面上的作用方式。当一些光被反射回场景中时,一部分光能被存储。这些表面也就是所谓的材料。材料只是一些属性,描述了材料被照射时做出的满应方式。更改这些属性将得到不同的效果。计算机图形学中有许多不同的反射模型,但最常用的模型分别是环境光反射模型、漫反射模型和镜面反射模型。反射模型和光属性一起确定了3D场景中物体的外观。〔一环境光反射环境光反射描述的是场景中没有方向的光,但是可以从各个地方都可以看到。因为从每个表面将光反射回来,这样就很难辨认光的原始位置。环境光试着模拟全局照明,这是场景中光从场景表面反射回来多次之后形成的光总量。当光从表面上反射离开的时候,它沿着一定的方向反射。这些光线中的一部分进入到观察者的眼睛中,这样就可以看到周围的环境。〔二漫反射漫反射模型描述了光线从表面上在各个方向做相同反射的方式。这意味着如果看一个只由漫反射光照的物体,那么从各个角度看上去该物体都是相同的。漫反射是视觉独立的,只有物体移动或是光移动时,才会发生变化。当光线照射在散射表面时,它会在多个方向反射。物体越光滑,反射光线散射得越光滑。除了物体的阴影区域外,物体从各个角度看上去都一样。〔三镜面反射镜面反射模型模拟了从光滑发光表面如镜子、一块金属或一块发光塑料等发射光线的情况。表面的镜面属性就是在光线中看到的大部分物体上发亮的光。如果移动一个发光物体,就会注意到镜面亮光区所发生的变化。这意味着镜面反射取决于观察物体的角度。所以漫反射光与视觉无关,而镜面反射光与视觉相关。4.3.3在DirectX3D中创建光照与材质模型为了在Direct3D中创建光源,必须创建一个D3DLIGHT对象。为了方便起见,下面程序设置了光照结构。不必设置所有的属性值,而属性值的设置取决于创建的光源类型。typedefstruct_D3DLIGHT9{D3DLIGHTTYPEType;//定义了所要创建的光源类型D3DCOLORVALUEDiffuse;//该光源所发出的漫射光的颜色D3DCOLORVALUESpecular;//该光源所发出的镜面光的颜色D3DCOLORVALUEAmbient;//该光源所发出的环境光的颜色D3DVECTORPosition;//用于描述光源在世界坐标系中位置的向量。D3DVECTORDirection;//一个描述光在世界坐标系中传播方向的向量。floatRange;//光线"消亡"前,所能达到的最大光程。floatFalloff;//仅用于聚光灯。定义了光强从内锥形到外锥形的衰减方式floatAttenuation0;//该衰减变量定义了光强随距离衰减的方式。仅用于点光源和聚光灯floatAttenuation1;//同Attenuation0floatAttenuation2;//同Attenuation0floatTheta;//仅用于聚光灯。指定了内部锥形的圆锥角,单位为弧度floatPhi;//仅用于聚光灯。指定了外部锥形的圆锥
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年全球及中国铀燃料芯块行业头部企业市场占有率及排名调研报告
- 2025年度金融咨询服务合同(2025版)5篇
- 二零二五年度涵洞工程劳务合作与进度管理合同3篇
- 2025年式租房协议文本2篇
- 二零二五版企业债券发行借款合同组成要素全面剖析3篇
- 二零二五年度金融行业软件开发框架定制合同2篇
- 二零二五年酒店客房升级改造场地租赁及施工协议2篇
- 2025年度知识产权转让合同转让价格及支付方式2篇
- 二零二五年度许可合同:医疗器械生产许可证授权协议3篇
- 二零二五年股权委托代持协议-绿色环保产业投资合作协议3篇
- 课题申报书:大中小学铸牢中华民族共同体意识教育一体化研究
- 岩土工程勘察课件0岩土工程勘察
- 《肾上腺肿瘤》课件
- 2024-2030年中国典当行业发展前景预测及融资策略分析报告
- 《乘用车越野性能主观评价方法》
- 幼师个人成长发展规划
- 2024-2025学年北师大版高二上学期期末英语试题及解答参考
- 批发面包采购合同范本
- 乘风化麟 蛇我其谁 2025XX集团年终总结暨颁奖盛典
- 2024年大数据分析公司与中国政府合作协议
- 一年级数学(上)计算题专项练习汇编
评论
0/150
提交评论