光线跟踪讲解及源代码.docx

上传人:wj 文档编号:1234966 上传时间:2023-04-30 格式:DOCX 页数:15 大小:390.78KB
下载 相关 举报
光线跟踪讲解及源代码.docx_第1页
第1页 / 共15页
光线跟踪讲解及源代码.docx_第2页
第2页 / 共15页
光线跟踪讲解及源代码.docx_第3页
第3页 / 共15页
光线跟踪讲解及源代码.docx_第4页
第4页 / 共15页
光线跟踪讲解及源代码.docx_第5页
第5页 / 共15页
光线跟踪讲解及源代码.docx_第6页
第6页 / 共15页
光线跟踪讲解及源代码.docx_第7页
第7页 / 共15页
光线跟踪讲解及源代码.docx_第8页
第8页 / 共15页
光线跟踪讲解及源代码.docx_第9页
第9页 / 共15页
光线跟踪讲解及源代码.docx_第10页
第10页 / 共15页
光线跟踪讲解及源代码.docx_第11页
第11页 / 共15页
光线跟踪讲解及源代码.docx_第12页
第12页 / 共15页
光线跟踪讲解及源代码.docx_第13页
第13页 / 共15页
光线跟踪讲解及源代码.docx_第14页
第14页 / 共15页
光线跟踪讲解及源代码.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

光线跟踪讲解及源代码.docx

《光线跟踪讲解及源代码.docx》由会员分享,可在线阅读,更多相关《光线跟踪讲解及源代码.docx(15页珍藏版)》请在冰点文库上搜索。

光线跟踪讲解及源代码.docx

计算机图形学期末作业

作业题目:

RayTracing算法的实现

姓名:

李海广

学号:

S130201036

任课教师:

秦红星

摘要

RayTracing算法又叫光线跟踪算法,它能通过递归方法逐个计算每个像素点的光强,然后就可以绘制出高度真实感的图像,因此该方法在图形学领域得到了广泛的应用。

RayTracing算法的思想还能应用到移动通信终端定位领域,该领域里的射线跟踪法与此算法思想类似。

MFC是微软公司提供的一个类库,以C++类的形式封装了Windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。

其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。

MFC在处理Windows窗口应用程序方面具有很大的优势,因此,本文使用MFC在VC6.0里实现RayTracing算法,并给出了该算法的详细讲解。

【关键词】Raytracing光线跟踪递归像素光强MFCC++

目录

1.RayTracing算法概述 1

1.1RayTracing算法简介 1

1.2RayTracing算法的实现原理 1

2.RayTracing算法的具体实现 2

2.1算法的实现环境 2

2.2实现算法的C++程序简介 2

2.3算法的具体实现过程 3

2.4程序运行结果 11

3.总结 11

3.1通过该算法学到的东西 11

3.2本程序未完成的任务 12

4.参考文献 12

II

1.RayTracing算法概述

1.1RayTracing算法简介

光线跟踪(Raytracing),又称为光迹追踪或光线追迹,它是来自于几何光学的一项通用技术,它通过跟踪与光学表面发生交互作用的光线从而得到光线经过路径的模型。

它用于光学系统设计,如照相机镜头、显微镜、望远镜以及双目镜等。

这个术语也用于表示三维计算机图形学中的特殊渲染算法,跟踪从眼睛发出的光线而不是光源发出的光线,通过这样一项技术将具有一定数学模型的场景显现出来。

这样得到的结果类似于光线投射与扫描线渲染方法的结果,但是这种方法有更好的光学效果,例如对于反射与折射有更准确的模拟效果,并且效率非常高,所以在追求高质量结果时我们经常使用这种方法。

在光线跟踪的过程中,我们要考虑许多因素。

要跟踪的光线包括反射光线、散射光线和镜面反射光线,利用递归方法并且设定一定的阀值来跟踪;在计算光强度时,我们要考虑场景中物体的反射系数、漫反射系数和镜面反射系数,还有交点处的法向量,出射光线的方向向量;在求视线以及反射光线和场景中物体的交点时,要计算出离眼睛以及出射点最近的交点作为击中点,得到击中点之后,我们就可以计算出击中点的坐标。

最终,通过三个公式计算出每一个像素点处三种光线的光强值,再将三个光强值相加,就得到了该像素点出的总光强值,最后将颜色缓冲器中的三种颜色值输出到屏幕上,就得到了我们需要的光线跟踪图像。

1.2RayTracing算法的实现原理

(1)对图像中的每一个像素,创建从视点射向该像素的光线;

(2)初始化最近时间T为一个很大的值,离视点最近的物体指针设为空值;

(3)对场景中的每一个物体,如果从视点出发的光线和物体相交,且交点处的时间t比最近时间T小,则将t的值赋给最近时间T,并设置该物体为最近物体,将物体指针指向该物体;

(4)经过第三步的计算后,如果最近物体指针指向空值NULL,则用背景色填充该像素。

如果该指针指向光源,则用光源的颜色填充该像素;

(5)如果最近物体指针指向的既不是NULL也不是光源,则从交点向光源发出一条光线,并判断该光线在射向光源的过程中是否被遮挡,如果被遮挡,则该交点对光源不可见;

(6)若第五步中的光线在射向光源的过程中没有被遮挡,则该交点对光源可见。

那么从交点到光源做出一条入射光线,并将入射光线单位化。

求出物体表面该交点处的法向量之后,我们就可以利用公式计算出该点的散射光强值、镜面反射光强值,并将它们加到总光强值上;

(7)对于反射光线,我们先利用视线和交点处的法向向量求出视线的反射光线,并将其单位化。

然后以交点为视点,以交点处的反射光线为视线递归地进行跟踪,直至达到最大递归深度,我们就得到了加上递归反射光强的总光强值;

(8)最后,我们逐行逐个像素的将三种颜色值输出到屏幕上。

至此,通过光线跟踪就得到了一幅质量很高的图像。

2.RayTracing算法的具体实现

2.1算法的实现环境

(1)编程环境:

MicrosoftVisualC++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)场景中各种物体的材质特征定义和求交计算

通过上面的程序段我们能设置和获取场景中各物体的散射系数、镜面反射系数和反射系数,以用来计算各像素点处的光强值。

通过上面的程序可以具体设置场景中每个物体的位置参数、散射系数、镜面反射系数和反射系数。

对球体和光源来说,我们设置它的球心坐标和半径;对地面和多边形来说,我们设置它的单位法向量和距坐标原点的距离,这样以来,它们的位置就能够确定出来。

上面的程序用来获得球体的球心和半径坐标,以及球面上position位置处的单位法向量。

得到这三个值之后,我们就可以对球体进行求交计算。

上面程序的功能是针对某条射线对球体进行求交计算,返回的结果是“击中”或者“丢失”或者“光线起点在内部”。

当delta大于0时,该光线和球体表面必有两个交点,击中时间分别为t1和t2,且t1

当t1<0且t2>0时,光线起点在球体内部,此时的返回值为“-1”。

当delta小于或者等于0时,我们认为光线与球体无交点,此时返回值为“0”。

上面的程序实现了光线对地平面(无限大平面)的求交计算,当单位法向量和视线垂直时,dot=0,此时视线与平面平行,函数返回值为MISS=0。

当单位法向量和视线不垂直时,视线和平面必有交点,可以通过公式计算出击中时间t0,当t0大于0且t0不是无穷大时,则把最近击中时间设置为t0,函数返回值为HIT=1。

上面的程序通过视线与无限大平面求交的方法来实现四边形的绘制,当求出击中时间t后,将t代入光线方程即可求出击中点的三维坐标值。

以上面程序中多面体的后面为例,其单位法向量与z轴平行,所以我们只需要将击中点的x坐标值和y坐标值分别与四边形的范围进行比较,x值和y值中任何一个超出范围,就将该点抛弃;只有x值和y值均在四边形范围内时,我们才将该点的返回值设为HIT=0。

通过这种方法我们能绘制出一个四边形。

左面和底面的绘制原理与后面类似,在此不再赘述。

(4)光线跟踪过程及图像绘制

Raytrace函数共有5个参数,分别为视线、交点处的总光强、递归深度、反射索引和最近击中时间t。

当递归深度大于最大递归深度时函数停止运行。

初始化物体指针使其指向NULL,然后通过一个循环遍历场景中的所有物体,依次对物体求交,则t的值会不断的变化,最终变成一个所有物体击中时间中的最小值。

最后得到的物体指针指向最小t对应的物体,result为最小t对应的返回结果。

如果物体指针指向空NULL,则该光线和场景中的任何物体都没有交点;如果物体指针指向光源,则将光源的颜色值赋给总光强。

先利用上面求出的最近击中时间t求出交点坐标。

然后从交点向光源中心发出一条光线,求出该光线的时间方程,然后判断该光线是否与场景中的除光源外的物体相交,若相交,则该光线在射向光源的途中被遮挡,则该交点对光源不可见。

若该交点对光源可见,则从交点向光源发出一条光线当作入射线,然后求出交点处的单位法向量,然后通过函数调用分别得到该物体的散射系数和镜面反射系数,再通过两个公式分别计算出该交点处的散射光光强和镜面反射光光强,并把这两个光强值加到总光强上。

反射光的光强通过递归的方法实现,先求出物体的反射系数,计算出交点处的单位法向量。

然后计算出从视点射向交点的光线的反射光线。

然后以该反射光线为视线,以反射光强为总光强继续进行光线跟踪,且达到递归深度后停止递归,将得到的总光强(即反射光光强)加到原来的总光强上。

至此,该像素点处的总光强已求出,接下来就可以进行该像素点的绘制。

上面的程序的功能是逐行逐像素的绘制图像。

direction为从视点出发射向场景的光线的向量,然后将其单位化,求出方向向量之后,就得到了定义好的视线r。

针对每一条视线调用光线跟踪程序得到交点处的总光强,通过总光强可求出交点处红、绿、蓝三种颜色的强度值,然后利用颜色缓冲器将这三种颜色值输出到屏幕上显示出来。

至此,利用光线跟踪算法绘制图像已完成。

2.4程序运行结果

3.总结

3.1通过该算法学到的东西

通过RayTracing算法的实现,我学会了在C++程序中如何对向量进行运算,因为本程序所有的运算都是基于向量的;对递归思想有了更深入的理解;使我的面向对象编程技术有了很大的提升,懂得了如何用C++做出一个大项目,这其中涉及到头文件的编写、源文件的编写、头文件的组织以及整个程序文件的组织,使大量的C++文件有条不紊的运行;还学习到了MFC绘图的相关知识。

总之,这次作业的完成使我获益匪浅。

3.2本程序未完成的任务

本程序只实现了球体和立方体的三个面,没有完整的做出立方体,因为在画立方体别的面时,该面将其他的物体遮挡,改变该面的法向量之后还不能解决,原因有可能是光线跟踪程序中的跟踪过程只适用于球体,即有限空间的物体。

而立方体的面是由无限大的平面限制范围而求得,所以跟踪过程中出现遮挡问题。

若定义立方体的面时定义为有限空间,而不是通过限制无限平面空间来求得,可能会得出正确结果,限于时间原因,还没有对其进行验证。

4.参考文献

[1]FrancisSHill,Jr.StephenMKelley.计算机图形学.北京:

清华大学出版社,2009.

[2]StanleyB.LippmanBarbaraE.Moo等.C++Primer中文版.北京:

人民邮电出版社,2006.

[3]谭浩强.C++程序设计.北京:

清华大学出版社,2004.

[4].

12

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2