关闭

【Ray Tracing from Ground Up】Ray-Object Interserctions

287人阅读 评论(0) 收藏 举报
分类:

1.Bounding Boxes

    如下,没有和box 相交的线在 的 interval 和的interval 没有交集。相反,有相交的线的 两个interval 之间是交集的


bool 	 
Box::hit(const Ray& ray, double& tmin, ShadeRec& sr) const {

	double ox = ray.o.x; double oy = ray.o.y; double oz = ray.o.z;
	double dx = ray.d.x; double dy = ray.d.y; double dz = ray.d.z;

	double tx_min, ty_min, tz_min;
	double tx_max, ty_max, tz_max;

	double a = 1.0 / dx;
	if (a >= 0) {
		tx_min = (x0 - ox) * a;
		tx_max = (x1 - ox) * a;
	}
	else {
		tx_min = (x1 - ox) * a;
		tx_max = (x0 - ox) * a;
	}

	double b = 1.0 / dy;
	if (b >= 0) {
		ty_min = (y0 - oy) * b;
		ty_max = (y1 - oy) * b;
	}
	else {
		ty_min = (y1 - oy) * b;
		ty_max = (y0 - oy) * b;
	}

	double c = 1.0 / dz;
	if (c >= 0) {
		tz_min = (z0 - oz) * c;
		tz_max = (z1 - oz) * c;
	}
	else {
		tz_min = (z1 - oz) * c;
		tz_max = (z0 - oz) * c;
	}

	double t0, t1;

	int face_in, face_out;

	// find largest entering t value

	if (tx_min > ty_min) {
		t0 = tx_min;
		face_in = (a >= 0.0) ? 0 : 3;
	}
	else {
		t0 = ty_min;
		face_in = (b >= 0.0) ? 1 : 4;
	}

	if (tz_min > t0) {
		t0 = tz_min;
		face_in = (c >= 0.0) ? 2 : 5;
	}

	// find smallest exiting t value

	if (tx_max < ty_max) {
		t1 = tx_max;
		face_out = (a >= 0.0) ? 3 : 0;
	}
	else {
		t1 = ty_max;
		face_out = (b >= 0.0) ? 4 : 1;
	}

	if (tz_max < t1) {
		t1 = tz_max;
		face_out = (c >= 0.0) ? 5 : 2;
	}

	if (t0 < t1 && t1 > kEpsilon) {  // condition for a hit
		if (t0 > kEpsilon) {
			tmin = t0;  			// ray hits outside surface
			sr.normal = get_normal(face_in);
		}
		else {
			tmin = t1;				// ray hits inside surface
			sr.normal = get_normal(face_out);
		}

		sr.local_hit_point = ray.o + tmin * ray.d;
		return (true);
	}
	else
		return (false);	
}


2. Triangles

三角形的定义



三角形的光线碰撞检测,分为两步:①光线是否hit 三角形所在的平面 ② hit point 是否在三角形以内。三角形所在平面任意一点p 可以表示为,带入,最后整理得到。 由此,

   ==> ,  根据 克莱姆 法则,可解得


bool 
Triangle::hit(const Ray& ray, double& tmin, ShadeRec& sr) const {	
	double a = v0.x - v1.x, b = v0.x - v2.x, c = ray.d.x, d = v0.x - ray.o.x; 
	double e = v0.y - v1.y, f = v0.y - v2.y, g = ray.d.y, h = v0.y - ray.o.y;
	double i = v0.z - v1.z, j = v0.z - v2.z, k = ray.d.z, l = v0.z - ray.o.z;
		
	double m = f * k - g * j, n = h * k - g * l, p = f * l - h * j;
	double q = g * i - e * k, s = e * j - f * i;
	
	double inv_denom  = 1.0 / (a * m + b * q + c * s);
	
	double e1 = d * m - b * n - c * p;
	double beta = e1 * inv_denom;
	
	if (beta < 0.0)
	 	return (false);
	
	double r = r = e * l - h * i;
	double e2 = a * n + d * q + c * r;
	double gamma = e2 * inv_denom;
	
	if (gamma < 0.0 )
	 	return (false);
	
	if (beta + gamma > 1.0)
		return (false);
			
	double e3 = a * p - b * r + d * s;
	double t = e3 * inv_denom;
	
	if (t < kEpsilon) 
		return (false);
					
	tmin 				= t;
	sr.normal 			= normal;  	
	sr.local_hit_point 	= ray.o + t * ray.d;	
	
	return (true);	
}  		



3.Other Objects

  圆形由中心c,半径r,法线n确定 ,同理首先是判断是不是在圆形所在的平面,然后判断和圆心的距离,既可以看出是否和圆形有相交。 因为开方运算耗时,所以直接判断平方的大小



0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

问题六十八: 着色模型(shading model)(0)——《Ray Tracing from the Ground Up》代码的移植

用ray tracing的方式来生成图形,主要是分两步: 1,几何建模。即为“光线撞击物体”,求得撞击点。 2,给撞击点着色。我们之前的做法是:根据被撞击物体的材质(材质的颜色、材质对光线的反射和...
  • libing_zeng
  • libing_zeng
  • 2017-02-17 13:04
  • 697

问题三十:《Ray Tracing In One Weekend》封面图形生成

30.1 封面图片 先完成封面图片。 Code如下: ----------------------------------------------main.cpp----------------...
  • libing_zeng
  • libing_zeng
  • 2017-01-15 12:32
  • 772

【Ray Tracing in One Weekend】(ch4)场景中第一个物体,球体

Chapter 4: Adding a sphere
  • FancyVin
  • FancyVin
  • 2017-11-29 09:15
  • 61

Shader特效——“Simple RayTrace”的实现 【GLSL】

判断 “直线和圆是否相交” 的理论推导。 延伸阅读:“直线和平面是否相交” 的理论推导。 效果图: GLSL代码: vec2 iResolution = vec2(512., 512....
  • panda1234lee
  • panda1234lee
  • 2016-08-27 21:36
  • 737

第一章 导言 Optix 光线跟踪编程指南

1.1 Optix 总览 光线跟踪很适合并行计算的方式实现,GPU在开发并行计算程序时有很大的优势。然而光线跟踪GPU并行算法极不规则,非专业人员不能为之,或为之不能极大发挥GPU的并行计算能力。英...
  • oXingShuJun
  • oXingShuJun
  • 2016-08-18 10:50
  • 493

问题十二:怎么用ray tracing画第一张图

ray 类:(位于ray.h中。ray.cpp为空) #ifndef RAY_H #define RAY_H #include "vec3.h" class ray { public: ...
  • libing_zeng
  • libing_zeng
  • 2017-01-13 23:49
  • 458

【Ray Trace from Groud Up】光线追踪代码实现解析

代码资源下载 ================================================================================== 总体结构框架: ...
  • himilong
  • himilong
  • 2015-10-06 21:03
  • 1351

射线追踪(ray tracing)

射线追踪(ray tracing) 你未看此花时,此花与汝心同归于寂。你来看此花时,则此花颜色一时明白起来  王阳明的这个思想深刻的揭露了射线追踪的本质,在图形学的发展进程中,一直在追求接近真...
  • u010345749
  • u010345749
  • 2017-07-02 22:21
  • 228

Unity CG 写一个超酷的 ray-marching(shader纯代码写3D)

Unity CG 写一个超酷的 ray-marching(shader纯代码写3D)1.其实自从看了http://www.shadertoy.com(inigo quilez为其主创始人)上的shad...
  • baidu_26153715
  • baidu_26153715
  • 2015-06-16 00:47
  • 4555

Ray Tracing 的c++简单实现

计算机图形学实验,实现ray tracing算法并与opengl渲染效果对比。原文及code参见:我的GithubRay TracingIn this assignment,I implemented...
  • qq_27914913
  • qq_27914913
  • 2017-06-03 13:14
  • 371
    个人资料
    • 访问:48930次
    • 积分:1443
    • 等级:
    • 排名:千里之外
    • 原创:89篇
    • 转载:1篇
    • 译文:3篇
    • 评论:2条
    最新评论