Ray Tracing程序.docx

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Ray Tracing程序

Ray Tracer---光线跟踪 一、经典光线跟踪算法原理简介:对图像中的每一个像素 { 创建从视点通过该像素的光线 初始化 最近T 为 无限大,最近物体 为 空值 对场景中的每一个物体 { 如果光线与物体相交 { 如果交点处的 t 比 最近T 小 { 设置 最近T 为焦点的 t 值 设置 最近物体 为该物体 } } } 如果 最近物体 为 空值{ 用背景色填充该像素 } 否则 { 对每个光源射出一条光线来检测是否处在阴影中 如果表面是反射面,生成反射光;递归 如果表面透明,生成折射光;递归 使用 最近物体 和 最近T 来计算着色函数 以着色函数的结果填充该像素 }}由以上经典的光线追踪算法可以发现,在此算法中,环境中的物体等模型,并不是一次性的画好的,而是对整个场景一个像素一个像素的画上去的,光线跟踪算法中的每一根光线要与场景中的每一个物体所含的每一个面求交。光线跟踪算法实现计算观察光线首先需要确定光线的数学表达式。一条光线实际上只是一个起点和一个传播方向,假设起点为O(x1,y1,z1),屏幕上一点为D(x2,y2,z2),则光线的方向dir(x3,y3,z3)为:dir=O – D;即x3 = x1 – x2; y3 = y1 – y2 ; z3 = z1 – z2;在程序中,光线的起点定义为:vector3 o( 0, 0, -5 );方向为:vector3 dir = vector3( m_SX, m_SY, 0 ) - o;由此可以确定一条光线Ray r( o, dir );然后就需要求出与该光线相交的物体中的最近的交点光线与球体相交球体由方程(x-a)2+(y-b)2+(z-c)2=r2确定,求光线是否与方程相交,只需计算方程组(x-x1)2+(y-y1)2+(z-z1)2=R2e+ d t = 0有无实数解即可。若令c(x1,y1,z1)为圆心,将二式带入一式整理可得,(d﹒d)t2 + 2d﹒(e - c)t + (e - c)﹒(e - c) - R2=0这里,除了参数t外所有的都是已知的,所以也就是标准的一元二次方程,即At2 + Bt + C=0二次解下中根号下的项B2-4AC为判别式,它可以说明有多少实数解。如果判别式为负,球和直线没有交点。如果判别式为正,则有两个解;一个解是光线进入球的位置,另一个是离开的位置。如果判别式为零,光线与球相切并只有一个交点。代入球的方程中,并消除公共因子得在实际实现中,在计算其他项之前应该首先检查判别式的值。在程序中的具体实现如下:int Sphere::Intersect( Ray a_Ray, float a_Dist ){vector3 v = a_Ray.GetOrigin() - m_Centre;float b = -DOT( v, a_Ray.GetDirection() );float det = (b * b) - DOT( v, v ) + m_SqRadius;int retval = MISS;if (det 0){det = sqrtf( det );float i1 = b - det;float i2 = b + det;if (i2 0){if (i1 0) {if (i2 a_Dist) {a_Dist = i2;retval = INPRIM;}}else{if (i1 a_Dist){a_Dist = i1;retval = HIT;}}}}return retval;}与平面相交假设平面方程为Ax + By + Cz +d=0 ,同理,将平面的法向量与直线的方向向量做差乘运算,若结果为零,则说明光线平行于平面没有交点。在程序中的实现如下:int PlanePrim::Intersect( Ray a_Ray, float a_Dist ){float d = DOT( m_Plane.N, a_Ray.GetDirection() );if (d != 0){float dist = -(DOT( m_Plane.N, a_Ray.GetOrigin() ) + m_Plane.D) / d;if (dist 0){if (dist a_Dist) {a_Dist = dist;return HIT;}}}return MISS;}颜色的确定一旦我们知道了光线在传播的过程中与哪些物体相交了,我们就可以这一点的颜色,而单纯的使用物体颜色,会使图像看起来很不自然,所以我们将会计算由两个光源产生的散射的阴影效果,两个光源都会对物体的颜色起作用下面这段代码还计算了从交点 (pi) 到光源(L)的向量, 并且通过计算这个向量和物体表面的法向量的点乘积来确定该点的光照强度。这样的计算会产生这样的效果:那些面对光源的点要比其他

文档评论(0)

80219pm + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档