Inverse Mapping指的是某点在某面的相对位置,这个“相对位置”用u、v表示。 Inverse Mapping完成后,相当于将某面映射到了uv平面,u、v的取值范围为[0, 1]。
这一章节会讲到球面、凸四边形(含三角形)、圆、圆柱面、圆锥面五类面的Inverse Mapping。
为了对比各种面的Inverse Mapping效果,我们用同一个uv平面:
也就是说,以上提到的五类曲面(平面)影射后的uv平面的图都是这一张。那么,问题来了,对于这五类曲面(平面)本身应该分别是什么样子呢(才能最终都映射成这么一样图)?这一章节,就是解决这么个问题。
首先,我们现在在lambertian.cpp中对uv平面这张图描述一下(对应八个色块):
----------------------------------------------lambertian.cpp ------------------------------------------
lambertian.cpp
vec3 get_albedo(float u, float v) {
if ((v >= 0) && (v < 0.5)) {
if ((u >= 0) && (u < 0.25)) {
return vec3(0, 0, 0);//黑色块
}
else if ((u >= 0.25) && (u < 0.5)) {
return vec3(0, 0, 1);//蓝色块
}
else if ((u >= 0.5) && (u < 0.75)) {
return vec3(0, 1, 0); //绿色块
}
else {
return vec3(0, 1, 1); //浅蓝色块
}
}
else if ((v >= 0.5) && (v <= 1.0)) {
if ((u >= 0) && (u < 0.25)) {
return vec3(1, 0, 0);//红色块
}
else if ((u >= 0.25) && (u < 0.5)) {
return vec3(1, 0, 1);//紫色块
}
else if ((u >= 0.5) && (u < 0.75)) {
return vec3(1, 1, 0);//黄色块
}
else if ((u >= 0.75) && (u <= 1.0)) {
return vec3(1, 1, 1);//浅紫色块
}
}
}
// lambertian::scatter也配合改动一下
bool lambertian::scatter(const ray& r_in, const hit_record& rec, vec3& attenuation, ray& scattered) const {
// std::cout << "-------------lambertian::scatter----------------" << endl;
vec3 target = rec.p + rec.normal + random_in_unit_sphere();
scattered = ray(rec.p, target-rec.p);
if ((rec.u >= 0.0) && (rec.u <= 1.0) && (rec.v >= 0.0) && (rec.v <= 1.0)) {
//映射后的u、v在[0, 1],在物体的hit()会对u、v进行赋值;如果不做映射,则u、v设置为-1,在这里,attenuation还是返回原来的albedo。
attenuation = get_albedo(rec.u, rec.v);
}
else {
attenuation = albedo;
}
return true;
}