光线跟踪程序(Ray Tracer)
简介
Ray Tracing的目标是生成一张包含场景内物体,具有真实感的图像,因此实现一个简单的Ray Tracing算法并不需要显式地构建一个可视的三维场景,只需要隐式地构建三维空间就可以了。
Ray Tracing能够实现一些使得画面更具真实感的效果,包括阴影、折射和反射,这些效果的本质是这张图片中颜色的变化,本程序即实现了这些效果,也就是量化这些颜色的变化。为了这些效果,也要对object的性质量化:表面颜色,反射性质,透射性质,然后利用公式计算得到每一个像素点的颜色。
本程序目前已实现的功能:
- 可以显示基本的几何图形,包括球体、无限平面、三角形、矩形、任意多边形、长方体、组合几何图形等;
- 可以显示镜面反射、漫反射、折射等效果;
- 可以读取obj模型文件并显示,包括纹理显示;
- 可以生成动画,包括相机运动、场景中物体运动等;
- 对渲染速度进行了一定程度的优化。
程序结构
Matrix.h
和Matrix.cpp
文件:定义了二维、三维点或向量类和4阶矩阵等,还有一些计算函数;Ray
类:光线,包括原点及方向属性,以及计算中途任意一点的坐标的方法;Geometry
类:所有几何图形的虚拟父类,提供表面颜色、发光颜色、透明度、反射系数等属性,以及用于和光线求交的intersect()方法;Sphere
类:球体,是几何图形子类,包括球心和半径等属性,可用作光源;Plane
类:平面(无边界),是几何图形子类,包括平面的显示方程中的点和法向量;Triangle
类:三角形,是几何图形子类,包括3个顶点坐标;Polygon
类:多边形,是几何图形子类,包括各个顶点坐标;Box
类:长方体,是几何图形子类,包括原点坐标和大小;GeometryUnion
类:组合几何图形,是几何图形子类,由多个(可以是不同类型的)几何图形组合成的新的几何图形;Mesh
类:三角网格复杂几何图形,是组合几何图形子类,可以读取obj模型,包括纹理贴图信息等;Scene
类:场景,包含场景的背景光颜色属性,和1个Geometry容器,可向场景中添加Geometry的任何子类;Camera
类:相机,包含各种相机参数、图像尺寸,和1个cv::Mat图像保存渲染后的图像,以及用于渲染场景的render()方法和用于递归跟踪光线的trace()函数(为了提高效率,trace()函数为单独函数,不属于Camera类);MathConstant.h
文件:包含程序中用到的所有数学相关的常量;shared_ptr.h
文件:包装std::tr1::shared_ptr
的头文件;TexturePool
类:纹理图像池,用于预先读取所有纹理图像,加快纹理计算速度;main
函数:主程序,设计了一个旋转动画,向场景中添加了固定的几个几何图形,不停移动相机位置及相机指向并渲染显示每一帧,达到动画效果,并录制成视频文件。