第七课 光线跟踪技术

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

场景产生
Void Scene::create_scene() { Box *_pBox; Sphere *_pSphere; _pBox=new Box(); _pBox->_center.set(100,20,30); _pBox->_length.set(10,10,10); _pBox->_pMat=&(_mat_list[0]); _objlist[0]=_pBox; _pBox=new Box(); _pBox->_center.set(20,30,40); _pBox->_length.set(20,10,10); _pBox->_pMat=&(_mat_list[2]); _objlist[1]=_pBox; _pSphere=new Sphere(); _pBox->_center.set(30,20,60); _pBox->_radius=10; _pBox->_pMat=&(_mat_list[1]); _objlist[2]=_pShpere; }
– 首先产生阴影测试光线-连接交点与光源 – 若交点处的场景为反射表面,则产生反射光线, 将此光线继续与场景求交 – 若交点处的场景具有透明性,则产生透射光线, 将此光线继续与场景求交
• 将交点处的颜色填入相应象素中。
光线跟踪算法
对每个象素发出一光线V,与场景求得交点P。 计算P点处沿V的直接光照分量Ic。(Phong) 求V的反射方向r,与场景中其他物体求交点Pr. 求交点处沿r方向的反射光强Is. 求V的折射方向t,与场景中其他物 体求交点Pt, • 求交点处沿t方向的反射光强It. • 计算P点处的总光强: Pr I=Ic+ksIs+ktIt • • • • •
场景组织形式2
• 所有物体以三角形表示。
程序框架
阴影 shadow

发射阴影光线(shadow ray)
阴影
function raycolor(ray e+td, real t0, real t1) hit_record rec, srec; if(scene->hit(e+td, t0, t1, rec)) then p = e + rec.t d; color c = rec.cr rec.ca; if( not scene->hit( p + sl,ε,∞, srec ) ) then vector3 h = normalize(normalize(l)+normalize(-d)); c = c + rec.cr cl max(0, rec.n· + cl rec.cp(h· l) rec.n)rec.p return c else return background_color;
物体类定义
class Sphere :public Object3D{ virtual Bool intersect( Ray,Hit, float); Vec3f _center; float _radius. } class Triangle :public Object3D{ virtual Bool intersect( Ray,Hit, float); Vec3f _vertex[3]; } Class Box::public Object3D{ virtual Bool intersect(Ray,Hit,float); Vec3f _center,_length; }
Class Ray
Class Hit
存储了交点及其他信息:
class Hit{
float _t; Vec3f _color; Material *_material; Vec3f _normal;
}
Class Scene
Class Scene{ int _nObject; Object3D *_objlist[1000]; Material *_matlist[100]; bool load_scene(char*); Void create_scene(); };
Witted整体光照明模型
• 由Turner Whitted于1980年提出 • 第一个整体光照明模型-物体表面的颜色由 光源和其他物体决定 • 第一个模拟镜面反射和折射效果的光照明 模型
光线跟踪算法
• 确定眼睛的位置和视线方向。 • 确定从眼睛出发通过每个象素中心的光线 方程。 • 求光线与场景的最近交点。
光线跟踪程序
for each pixel do compute viewing ray if( ray hit an object with t [0, )) then Compute n Evaluate lighting equation and set pixel to that color else set pixel color to background color hit = false for each object o do if (object is hit at ray parameter t and t [t0 , t1 ) ) then hit = true; hitobject = o; t1= t; return hit
光线和球求交在光线跟踪中应用很普遍
光线与三角形相交
• 如果三角形的三个顶点为a,b,c,则 满足下列条件时光线和三角形所在 平面相交: e + td = a + β(b-a)+γ(c-a) • 为了求出t,β,γ,将上式展开成三 个坐标的三个方程:
xe txd xa ( xb xa ) ( xc xa )
光线跟踪算法
物体颜色的产生
• 从光源发出的光与物体发生反射、折射等 后进入眼睛。 • 进入眼睛的光的颜色与光源颜色和物体的 材质有关。
局部光照明模型
• 只关心直接由光源照射进入眼睛的光。
– 是光照、视点和材质属性的函数。
• 光照强度分成RGB三个分量。对三个分量 分别计算。 • 只计算反射光强。
把光线 p(t) = e + t d 代入上述方程,得到 (e + t d - c)· + t d - c) - R2=0 (e 上式是关于t的一元二次方程,求解,得到
d (e c) (d (e c))2 (d d )((e c) (e c) R 2 t (d d )
局部光照明模型
• 三种光照分量:
– 漫反射分量 – 镜面反射分量 – 环境光分量
多光源
单个光源:
I I L (kd (n L) ks (r v)n ) I a ka
多个光源:
I I L,i (kd (n Li ) ks (ri v) n ) I a ka
d b sin n cos
d n cos b sin
n(d n cos ) t n cos nt n(d n(d n)) n 2 (1 (d n) 2 n 1 2 nt nt
递归结束条件
• 递归深度-预先设定一个递归深度值 • 光亮度值-如果反射或折射光线的光亮度贡 献太小,可以忽略不计,则停止递归
i 0.5 u s l (r l ) nx
j 0.5 vs b (t b) ny
s = e + usu + vsv + wsw
光线与物体相交
• 光线与球相交
球体的隐式方程:( x xc )2 ( y yc )2 ( z zc )2 R2 0 (p - c)· - c) - R2 = 0 (p
面向对象的光线跟踪程序设计
• 定义含有通用接口的基类:
class Object3D; virtual bool hit( Ray, Hit, tmin ); virtual bool bounding_box();
场景组织形式1
• 场景中包含了各种形状物体,立方体,球, 圆柱,. . . . • 利用面向对象的程序设计思想,可以容易地 在场景中添加新的物体
i 1
m
漫反射
镜面反射
环境光
环境光:对非直接光照的简单近似。
基本光线跟踪算法
•生成与用z缓冲器和BSP树相类似的图像。 •本质上这些方法保证从每一个像素都能够“看到”正确的物 体,并根据物体的材质特性、表面法向和光学几何确定像素的 颜色。
光线跟踪的观察坐标系
图像生成
图像生成
图像生成
确定与观察平面上的像素对应的光线
主程序
main() { Hit hit_to_scene; float t; Scene _scene; //读入场景 _scene.load_scene(“×××”); //或者产生一个场景_scene.create_scene(); for(i=0;i<nPixel;i++){ 产生过象素i的光线方程ray。 mint=10000000; for(j=0;j<_nObject;j++){ if(_objlist[j]->intersect(ray,hit,t)){ if((t>=0)&&(mint>t)) {mint=t; hit_to_scene=hit;} } } 计算hit_to_scene处的颜色,并写入象素i中。 } }
• • • • 确定眼睛的位置和视线方向。 计算从眼睛出发通过每个象素中心的光线方程。 求光线与场景的最近交点及源自文库法向。 将交点处的颜色填入相应象素中。
基本光线跟踪算法
计算观察光线
• 确定光线的数学表达形式: p(t) = e + t (s-e) • 计算e和s:
i 0.5 nx
u s l (r l )
物体类定义
class Object3D{ virtual Bool intersect( Ray,Hit, tmin); Material _pMat; }
class Plane:public Object3D{ virtual Bool intersect( Ray,Hit, tmin); Vec3f normal; Vec3f origin. }
ye tyd ya ( yb ya ) ( yc ya ) ze tzd za ( zb za ) ( zc za )
光线与三角形相交的函数
boolean raytri(ray r, vector3 a, vector3 b, vector3 c, interval[t0,t1]) compute t; if(t < t0 or t > t1) then return false; compute γ; if(γ<0 or γ>1) then return false; compute β; if(β <0 or β >1) then return false; return true;
光线与场景中的物体求交
基本光线跟踪算法
Compute u,v,w basis vectors for each pixel do compute viewing ray find first object hit by ray and its surface normal n set pixel color to value based on material, light and n
整体光照明模型
• 对光源的直接反射(1) • 对其他物体的反射光的反射(2) • 透射光(3)
环 境 光 照
I I c k s I s kt I t I L (kd (n L) k s (r v) n ) ks I s kt I t
镜面方向
2 折射方向 1 Phong 3
r
t
Pt
V
P
镜面反射光线
镜面反射光线:r = d + 2(d· n)n 在函数raycolor中添加一个递归调用: color c = c + cs raycolor(p + sr, ε,∞)
光的折射
• 折射角度遵循Snell折射定理
n sin nt sin
折射
t b sin n cos
相关文档
最新文档