RayTracer

根据 教程(Ray Tracing in a Weekend.pdf) 所给的代码和内容,写的RayTracer的初级版

下面是实验报告截取内容。详细内容见教程

摄像机

  1. 位置

    1. 和一般摄像机一样
      1. w向量: eye - target
      2. u向量:向量UP与向量w的叉乘
      3. v向量:向量w与向量u的叉乘
    2. 景深:人眼看到的不是一个点而是一个圆,半径为光圈/2
    3. 焦距:焦点到面镜中心点之间的距离。相当于缩放
  2. 模糊

    光线增加了一个随机偏移

光线

由三维直线公式L=A+t*B,其中A为起点,B为方向

碰撞

  1. 检测
    1. 通过线和球的联立,获得:$ttdot( B , B ) + 2tdot( B,A - C ) + dot( A-C,A - C ) - R*R = 0$
    2. 计算$\Delta$
  2. 获得碰撞点
    1. 通过上式求根
    2. 判断根是否在范围内
  3. 获得碰撞记录
    1. t为上式的根
    2. 碰撞点为射线上t为上式根的点
    3. 法向量为(碰撞点-中心点)/半径
    4. 材质为设定
  4. 获得最近的碰撞点
    1. 不断重复获取碰撞点,并将新一次获得碰撞的上限设为上一次获得的碰撞点

材质

  1. 散射材质
    1. 反射的方向向量:单位球内随机获取方向向量,再加上球心
    2. 反射的光线:以碰撞点为发射点,反射方向向量为方向的光线
  2. 金属材质
    1. 反射方向:由入射角=出射角可得
    2. 反射光线:以碰撞点为发射点,反射方向向量为方向的光线
    3. 模糊:再反射方向上增加随机方向。
  3. 玻璃材质
    1. 由于同时存在折射和反射,随机选择折射或者反射
    2. 判断来自于内部还是外部
    3. 菲涅尔现象:垂直观察时,任何物体或者材质表面都有一个基础反射率,以一定角度看时,所有反光都会明显起来。

抗锯齿

发射多条光线计算同一个像素点的值

光线追踪

通过递归每一光线,即当光线和物体碰撞经过一系列折射反射等后,获得出射光线再追踪这条光线,直到光线到达边界或者递归层数大于50