/RayTracer

研一《计算机图形学》大作业:光线追踪程序

Primary LanguageC++

光线跟踪程序(Ray Tracer)

简介


参考:光线追踪算法综述 - 简书

Ray Tracing的目标是生成一张包含场景内物体,具有真实感的图像,因此实现一个简单的Ray Tracing算法并不需要显式地构建一个可视的三维场景,只需要隐式地构建三维空间就可以了。

Ray Tracing能够实现一些使得画面更具真实感的效果,包括阴影、折射和反射,这些效果的本质是这张图片中颜色的变化,本程序即实现了这些效果,也就是量化这些颜色的变化。为了这些效果,也要对object的性质量化:表面颜色,反射性质,透射性质,然后利用公式计算得到每一个像素点的颜色。

本程序目前已实现的功能:

  1. 可以显示基本的几何图形,包括球体、无限平面、三角形、矩形、任意多边形、长方体、组合几何图形等;
  2. 可以显示镜面反射、漫反射、折射等效果;
  3. 可以读取obj模型文件并显示,包括纹理显示;
  4. 可以生成动画,包括相机运动、场景中物体运动等;
  5. 对渲染速度进行了一定程度的优化。

程序结构


  1. Matrix.hMatrix.cpp文件:定义了二维、三维点或向量类和4阶矩阵等,还有一些计算函数;
  2. Ray类:光线,包括原点及方向属性,以及计算中途任意一点的坐标的方法;
  3. Geometry类:所有几何图形的虚拟父类,提供表面颜色、发光颜色、透明度、反射系数等属性,以及用于和光线求交的intersect()方法;
  4. Sphere类:球体,是几何图形子类,包括球心和半径等属性,可用作光源;
  5. Plane类:平面(无边界),是几何图形子类,包括平面的显示方程中的点和法向量;
  6. Triangle类:三角形,是几何图形子类,包括3个顶点坐标;
  7. Polygon类:多边形,是几何图形子类,包括各个顶点坐标;
  8. Box类:长方体,是几何图形子类,包括原点坐标和大小;
  9. GeometryUnion类:组合几何图形,是几何图形子类,由多个(可以是不同类型的)几何图形组合成的新的几何图形;
  10. Mesh类:三角网格复杂几何图形,是组合几何图形子类,可以读取obj模型,包括纹理贴图信息等;
  11. Scene类:场景,包含场景的背景光颜色属性,和1个Geometry容器,可向场景中添加Geometry的任何子类;
  12. Camera类:相机,包含各种相机参数、图像尺寸,和1个cv::Mat图像保存渲染后的图像,以及用于渲染场景的render()方法和用于递归跟踪光线的trace()函数(为了提高效率,trace()函数为单独函数,不属于Camera类);
  13. MathConstant.h文件:包含程序中用到的所有数学相关的常量;
  14. shared_ptr.h文件:包装std::tr1::shared_ptr的头文件;
  15. TexturePool类:纹理图像池,用于预先读取所有纹理图像,加快纹理计算速度;
  16. main函数:主程序,设计了一个旋转动画,向场景中添加了固定的几个几何图形,不停移动相机位置及相机指向并渲染显示每一帧,达到动画效果,并录制成视频文件。