光线跟踪讲解及源代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机图形学期末作业
作业题目:Ray Tracing算法的实现
******
学号:S*********
********
摘要
Ray Tracing算法又叫光线跟踪算法,它能通过递归方法逐个计算每个像素点的光强,然后就可以绘制出高度真实感的图像,因此该方法在图形学领域得到了广泛的应用。Ray Tracing算法的思想还能应用到移动通信终端定位领域,该领域里的射线跟踪法与此算法思想类似。MFC是微软公司提供的一个类库,以C++类的形式封装了Windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。MFC在处理Windows窗口应用程序方面具有很大的优势,因此,本文使用MFC在VC6.0里实现Ray Tracing算法,并给出了该算法的详细讲解。
【关键词】Ray tracing 光线跟踪递归像素光强 MFC C++
目录
1.Ray Tracing算法概述 (1)
1.1Ray Tracing算法简介 (1)
1.2Ray Tracing算法的实现原理 (1)
2.Ray Tracing算法的具体实现 (2)
2.1算法的实现环境 (2)
2.2实现算法的C++程序简介 (2)
2.3算法的具体实现过程 (3)
2.4 程序运行结果 (11)
3.总结 (11)
3.1 通过该算法学到的东西 (11)
3.2本程序未完成的任务 (12)
4.参考文献 (12)
1.Ray Tracing算法概述
1.1Ray Tracing算法简介
光线跟踪(Ray tracing),又称为光迹追踪或光线追迹,它是来自于几何光学的一项通用技术,它通过跟踪与光学表面发生交互作用的光线从而得到光线经过路径的模型。它用于光学系统设计,如照相机镜头、显微镜、望远镜以及双目镜等。这个术语也用于表示三维计算机图形学中的特殊渲染算法,跟踪从眼睛发出的光线而不是光源发出的光线,通过这样一项技术将具有一定数学模型的场景显现出来。这样得到的结果类似于光线投射与扫描线渲染方法的结果,但是这种方法有更好的光学效果,例如对于反射与折射有更准确的模拟效果,并且效率非常高,所以在追求高质量结果时我们经常使用这种方法。
在光线跟踪的过程中,我们要考虑许多因素。要跟踪的光线包括反射光线、散射光线和镜面反射光线,利用递归方法并且设定一定的阀值来跟踪;在计算光强度时,我们要考虑场景中物体的反射系数、漫反射系数和镜面反射系数,还有交点处的法向量,出射光线的方向向量;在求视线以及反射光线和场景中物体的交点时,要计算出离眼睛以及出射点最近的交点作为击中点,得到击中点之后,我们就可以计算出击中点的坐标。最终,通过三个公式计算出每一个像素点处三种光线的光强值,再将三个光强值相加,就得到了该像素点出的总光强值,最后将颜色缓冲器中的三种颜色值输出到屏幕上,就得到了我们需要的光线跟踪图像。
1.2Ray Tracing算法的实现原理
(1)对图像中的每一个像素,创建从视点射向该像素的光线;
(2)初始化最近时间T为一个很大的值,离视点最近的物体指针设为空值;
(3)对场景中的每一个物体,如果从视点出发的光线和物体相交,且交点处的时间t比最近时间T小,则将t的值赋给最近时间T,并设置该物体为最近物体,将物体指针指向该物体;
(4)经过第三步的计算后,如果最近物体指针指向空值NULL,则用背景色填充该像素。如果该指针指向光源,则用光源的颜色填充该像素;
(5)如果最近物体指针指向的既不是NULL也不是光源,则从交点向光源发出一条光线,并判断该光线在射向光源的过程中是否被遮挡,如果被遮挡,则该交点对光源不可见;
(6)若第五步中的光线在射向光源的过程中没有被遮挡,则该交点对光源可见。那么从交点到光源做出一条入射光线,并将入射光线单位化。求出物体表面该交点处的法向量之后,我们就可以利用公式计算出该点的散射光强值、镜面反射光强值,并将它们加到总光强值上;
(7)对于反射光线,我们先利用视线和交点处的法向向量求出视线的反射光线,并将其单位化。然后以交点为视点,以交点处的反射光线为视线递归地进行跟踪,直至达到最大递归深度,我们就得到了加上递归反射光强的总光强值;
(8)最后,我们逐行逐个像素的将三种颜色值输出到屏幕上。至此,通过光线跟踪就得到了一幅质量很高的图像。
2.Ray Tracing算法的具体实现
2.1算法的实现环境
(1)编程环境:Microsoft Visual C++6.0;
(2)图形类类库:MFC;
(3)编程语言:C++;
(4)显示设备:电脑显示器。
2.2实现算法的C++程序简介
该程序由C++编写而成,主要分为以下几个部分:
(1)点和向量的定义及运算;
(2)光线类的定义及操作;
(3)场景中各种物体的材质特征定义和求交计算;
(4)光线跟踪过程及图像绘制;
2.3算法的具体实现过程
(1)点和向量的定义及运算
CVector类用来存储向量的坐标值,设置向量的三个坐标值,对向量进行求和、求差、点积、叉积运算,这些运算通过运算符重载来完成。使用typedef将CVector类重定义为CColor类和CPoint类,从而实现对像素点颜色和点的设置和运算。CVector类公用成员函数的声明不再详述。
(2)光线类的定义及操作
光线包含两个特征参数,即光线的起点和方向。以上程序段能实现对光线的起点和方向的设置和获取,由起点和方向能唯一地确定出一条光线,并能结合“时间”t写出该光线的方程,以用来进行求交计算。
(3)场景中各种物体的材质特征定义和求交计算