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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

本文(光线跟踪讲解及源代码文档格式.docx)为本站会员(b****2)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

光线跟踪讲解及源代码文档格式.docx

1、MFC是微软公司提供的一个类库,以C+类的形式封装了Windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。MFC在处理Windows窗口应用程序方面具有很大的优势,因此,本文使用MFC在VC6.0里实现Ray Tracing算法,并给出了该算法的详细讲解。【关键词】Ray tracing 光线跟踪 递归 像素 光强 MFC C+1.Ray Tracing算法概述1.1Ray Tracing算法简介光线跟踪(Ray tracing),又称为光迹追踪或光线追迹,它是来自于几何光学的

2、一项通用技术,它通过跟踪与光学表面发生交互作用的光线从而得到光线经过路径的模型。它用于光学系统设计,如照相机镜头、显微镜、望远镜以及双目镜等。这个术语也用于表示三维计算机图形学中的特殊渲染算法,跟踪从眼睛发出的光线而不是光源发出的光线,通过这样一项技术将具有一定数学模型的场景显现出来。这样得到的结果类似于光线投射与扫描线渲染方法的结果,但是这种方法有更好的光学效果,例如对于反射与折射有更准确的模拟效果,并且效率非常高,所以在追求高质量结果时我们经常使用这种方法。在光线跟踪的过程中,我们要考虑许多因素。要跟踪的光线包括反射光线、散射光线和镜面反射光线,利用递归方法并且设定一定的阀值来跟踪;在计算

3、光强度时,我们要考虑场景中物体的反射系数、漫反射系数和镜面反射系数,还有交点处的法向量,出射光线的方向向量;在求视线以及反射光线和场景中物体的交点时,要计算出离眼睛以及出射点最近的交点作为击中点,得到击中点之后,我们就可以计算出击中点的坐标。最终,通过三个公式计算出每一个像素点处三种光线的光强值,再将三个光强值相加,就得到了该像素点出的总光强值,最后将颜色缓冲器中的三种颜色值输出到屏幕上,就得到了我们需要的光线跟踪图像。1.2Ray Tracing算法的实现原理(1)对图像中的每一个像素,创建从视点射向该像素的光线;(2)初始化最近时间T为一个很大的值,离视点最近的物体指针设为空值;(3)对场

4、景中的每一个物体,如果从视点出发的光线和物体相交,且交点处的时间t比最近时间T小,则将t的值赋给最近时间T,并设置该物体为最近物体,将物体指针指向该物体;(4)经过第三步的计算后,如果最近物体指针指向空值NULL,则用背景色填充该像素。如果该指针指向光源,则用光源的颜色填充该像素;(5)如果最近物体指针指向的既不是NULL也不是光源,则从交点向光源发出一条光线,并判断该光线在射向光源的过程中是否被遮挡,如果被遮挡,则该交点对光源不可见;(6)若第五步中的光线在射向光源的过程中没有被遮挡,则该交点对光源可见。那么从交点到光源做出一条入射光线,并将入射光线单位化。求出物体表面该交点处的法向量之后,

5、我们就可以利用公式计算出该点的散射光强值、镜面反射光强值,并将它们加到总光强值上;(7)对于反射光线,我们先利用视线和交点处的法向向量求出视线的反射光线,并将其单位化。然后以交点为视点,以交点处的反射光线为视线递归地进行跟踪,直至达到最大递归深度,我们就得到了加上递归反射光强的总光强值;(8)最后,我们逐行逐个像素的将三种颜色值输出到屏幕上。至此,通过光线跟踪就得到了一幅质量很高的图像。2.Ray Tracing算法的具体实现2.1算法的实现环境(1)编程环境:Microsoft Visual C+6.0;(2)图形类类库:MFC;(3)编程语言:C+;(4)显示设备:电脑显示器。2.2实现算

6、法的C+程序简介 该程序由C+编写而成,主要分为以下几个部分:(1)点和向量的定义及运算;(2)光线类的定义及操作;(3)场景中各种物体的材质特征定义和求交计算;(4)光线跟踪过程及图像绘制;2.3算法的具体实现过程(1)点和向量的定义及运算 CVector类用来存储向量的坐标值,设置向量的三个坐标值,对向量进行求和、求差、点积、叉积运算,这些运算通过运算符重载来完成。使用typedef将CVector类重定义为CColor类和CPoint类,从而实现对像素点颜色和点的设置和运算。CVector类公用成员函数的声明不再详述。(2)光线类的定义及操作 光线包含两个特征参数,即光线的起点和方向。以

7、上程序段能实现对光线的起点和方向的设置和获取,由起点和方向能唯一地确定出一条光线,并能结合“时间”t写出该光线的方程,以用来进行求交计算。(3)场景中各种物体的材质特征定义和求交计算 通过上面的程序段我们能设置和获取场景中各物体的散射系数、镜面反射系数和反射系数,以用来计算各像素点处的光强值。 通过上面的程序可以具体设置场景中每个物体的位置参数、散射系数、镜面反射系数和反射系数。对球体和光源来说,我们设置它的球心坐标和半径;对地面和多边形来说,我们设置它的单位法向量和距坐标原点的距离,这样以来,它们的位置就能够确定出来。 上面的程序用来获得球体的球心和半径坐标,以及球面上position位置处

8、的单位法向量。得到这三个值之后,我们就可以对球体进行求交计算。 上面程序的功能是针对某条射线对球体进行求交计算,返回的结果是“击中”或者“丢失”或者“光线起点在内部”。当delta大于0时,该光线和球体表面必有两个交点,击中时间分别为t1和t2,且t1t2,当t1和t2均大于0时,光线起点必在球体外部,此时的击中时间为t1,返回值为“1”。当t10时,光线起点在球体内部,此时的返回值为“-1”。当delta小于或者等于0时,我们认为光线与球体无交点,此时返回值为“0”。 上面的程序实现了光线对地平面(无限大平面)的求交计算,当单位法向量和视线垂直时,dot=0,此时视线与平面平行,函数返回值为

9、MISS=0。当单位法向量和视线不垂直时,视线和平面必有交点,可以通过公式计算出击中时间t0,当t0大于0且t0不是无穷大时,则把最近击中时间设置为t0,函数返回值为HIT=1。 上面的程序通过视线与无限大平面求交的方法来实现四边形的绘制,当求出击中时间t后,将t代入光线方程即可求出击中点的三维坐标值。以上面程序中多面体的后面为例,其单位法向量与z轴平行,所以我们只需要将击中点的x坐标值和y坐标值分别与四边形的范围进行比较,x值和y值中任何一个超出范围,就将该点抛弃;只有x值和y值均在四边形范围内时,我们才将该点的返回值设为HIT=0。通过这种方法我们能绘制出一个四边形。左面和底面的绘制原理与

10、后面类似,在此不再赘述。(4)光线跟踪过程及图像绘制 Raytrace函数共有5个参数,分别为视线、交点处的总光强、递归深度、反射索引和最近击中时间t。当递归深度大于最大递归深度时函数停止运行。初始化物体指针使其指向NULL,然后通过一个循环遍历场景中的所有物体,依次对物体求交,则t的值会不断的变化,最终变成一个所有物体击中时间中的最小值。最后得到的物体指针指向最小t对应的物体,result为最小t对应的返回结果。如果物体指针指向空NULL,则该光线和场景中的任何物体都没有交点;如果物体指针指向光源,则将光源的颜色值赋给总光强。先利用上面求出的最近击中时间t求出交点坐标。然后从交点向光源中心发

11、出一条光线,求出该光线的时间方程,然后判断该光线是否与场景中的除光源外的物体相交,若相交,则该光线在射向光源的途中被遮挡,则该交点对光源不可见。 若该交点对光源可见,则从交点向光源发出一条光线当作入射线,然后求出交点处的单位法向量,然后通过函数调用分别得到该物体的散射系数和镜面反射系数,再通过两个公式分别计算出该交点处的散射光光强和镜面反射光光强,并把这两个光强值加到总光强上。反射光的光强通过递归的方法实现,先求出物体的反射系数,计算出交点处的单位法向量。然后计算出从视点射向交点的光线的反射光线。然后以该反射光线为视线,以反射光强为总光强继续进行光线跟踪,且达到递归深度后停止递归,将得到的总光

12、强(即反射光光强)加到原来的总光强上。至此,该像素点处的总光强已求出,接下来就可以进行该像素点的绘制。上面的程序的功能是逐行逐像素的绘制图像。direction为从视点出发射向场景的光线的向量,然后将其单位化,求出方向向量之后,就得到了定义好的视线r。针对每一条视线调用光线跟踪程序得到交点处的总光强,通过总光强可求出交点处红、绿、蓝三种颜色的强度值,然后利用颜色缓冲器将这三种颜色值输出到屏幕上显示出来。至此,利用光线跟踪算法绘制图像已完成。2.4 程序运行结果3.总结3.1 通过该算法学到的东西 通过Ray Tracing算法的实现,我学会了在C+程序中如何对向量进行运算,因为本程序所有的运算

13、都是基于向量的;对递归思想有了更深入的理解;使我的面向对象编程技术有了很大的提升,懂得了如何用C+做出一个大项目,这其中涉及到头文件的编写、源文件的编写、头文件的组织以及整个程序文件的组织,使大量的C+文件有条不紊的运行;还学习到了MFC绘图的相关知识。总之,这次作业的完成使我获益匪浅。3.2本程序未完成的任务 本程序只实现了球体和立方体的三个面,没有完整的做出立方体,因为在画立方体别的面时,该面将其他的物体遮挡,改变该面的法向量之后还不能解决,原因有可能是光线跟踪程序中的跟踪过程只适用于球体,即有限空间的物体。而立方体的面是由无限大的平面限制范围而求得,所以跟踪过程中出现遮挡问题。若定义立方体的面时定义为有限空间,而不是通过限制无限平面空间来求得,可能会得出正确结果,限于时间原因,还没有对其进行验证。4.参考文献1Francis S Hill, Jr. Stephen M Kelley计算机图形学北京:清华大学出版社,20092Stanley B.Lippman Barbara E .Moo等C+Primer中文版北京:人民邮电出版社,20063谭浩强C+程序设计北京:清华大学出版社,20044

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1