光反射与折射向量方向计算详解(基于Ray Tracing in One Weekend这本书)

最近在学习光线追踪,其中光线反射,折射是重点。

由于这本书是英文的,对于阅读能力是一个大挑战吖。学习过程中发现了一位大佬的学习总结:

https://blog.****.net/libing_zeng/article/details/72598060

写得很清楚,比较厉害啦。 但是折射这部分的证明没有写清楚,所以我自己理清了一下,记录一下,嘻嘻(#^.^#)

  • 折射光线的方向向量:

源代码:

bool refract(const vec3& v, const vec3& n,float nt,vec3& refracted){
      vec3 uv = unit_vector(v);
      float dt = uv.dot(uv,n);
      float d = 1.0 - nt*nt*(1-dt*dt);
      if(d > 0){
         refracted = nt*(uv-n*dt) - n*sqrt(d);
          return true;
      }else{
          return false;
      }

}

计算过程如下:

光反射与折射向量方向计算详解(基于Ray Tracing in One Weekend这本书)

  •  漫反射光线的方向向量

源代码

模拟随机方向的向量(起点在原点,长度小于1,方向随机)
vec3 lambertian::randomUnitNormal()const{
     vec3 p;
     do{
            //产生(-1,1)之间的随机数
        p = 2.0*vec3((rand()%100/(float)(100)),
                     (rand()%100/(float)(100)),
                     (rand()%100/(float)(100)))
                     -vec3(1,1,1);
        }while(p.squared_length() >= 1.0);

     return p;
}

bool lambertian::scatter(const ray& rIn ,const hit_record& rec,vec3& attenuation,ray& scattered)const{
      光线起点指向反射后的撞击另一球的撞点的向量
     vec3 target = rec.p + rec.normal + randomUnitNormal();
    漫反射光线的方向向量:PM=PS+OE 起点为P点
     scattered = ray(rec.p,target-rec.p);
     attenuation = albedo;
     return true;

}

计算过程如下:

光反射与折射向量方向计算详解(基于Ray Tracing in One Weekend这本书)

镜面反射光线的方向向量

源代码:

//镜面反射光线的方向向量
 vec3 reflect(const vec3& v, const vec3 &n){
        vec3 vp;
        return v - 2*vp.dot(v,n)*n;

 }

计算过程如下:

光反射与折射向量方向计算详解(基于Ray Tracing in One Weekend这本书)