计算机图形学——光线追踪
参考资料 :用JavaScript玩转计算机图形学实验内容: 使用光线追踪进行场景渲染。实验效果:
1、简介
光线跟踪(ray tracing)是一个在二维(2D)屏幕上呈现三维(3D)图像的方法。
从摄影机的位置,通过影像平面上的像素位置(比较正确的说法是取样(sampling)位置),发射一束光线到场景,求光线和几何图形间最近的交点,再求该交点的著色。如果该交点的材质是反射性的,可以在该交点向反射方向继续追踪。光线追踪除了容易支持一些全局光照效果外,亦不局限于三角形作为几何图形的单位。任何几何图形,能与一束光线计算交点(intersection point),就能支持。
要计算一点是否在阴影之内,也只须发射一束光线到光源,检测中间有没有障碍物而已。不过光源和阴影留待下回分解,如下图:
2、光线
所谓光线(ray),从一点向某方向发射也。数学上可用参数函数(parametric function)表示:
当中,o即发谢起点(origin),d为方向。
在C++中定义光线struct
#ifndef _Ray3_h_
#define _Ray3_h_
#include "Vector3.h"
struct Ray3 {
Vector3 origin;
Vector3 direction;
inline Ray3(const Ray3& r):origin(r.origin),direction(r.direction){}
inline Ray3(const Vector3& _origin,const Vector3& _direction):origin(_origin),direction(_direction){}
inline Vector3 getPoint(float t)const{ return origin.add(direction.multiply(t)); }
};
#endif
3、球体
球体(sphere)是其中一个最简单的立体几何图形。这里只考虑球体的表面(surface),中心点为c、半径为r的球体表面可用等式(equation)表示:
如前文所述,需要计算光线和球体的最近交点。只要把光线x = r(t)代入球体等式,把该等式求解就是交点。为简化方程,设v=o - c,则:
因为d为