光反射与折射向量方向计算详解(基于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;
}
}
计算过程如下:
- 漫反射光线的方向向量
源代码
模拟随机方向的向量(起点在原点,长度小于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;
}
计算过程如下:
镜面反射光线的方向向量
源代码:
//镜面反射光线的方向向量
vec3 reflect(const vec3& v, const vec3 &n){
vec3 vp;
return v - 2*vp.dot(v,n)*n;
}
计算过程如下: