我正在学习光线追踪,我将反射添加到我的光线追踪中。但是球体的反射看起来很平坦。我不知道为什么。
我渲染了标准化反射和彩色图像。希望有人能帮助我。感谢。
反思代码:
Color getColor( Vect pos,Vect dir,const vector<Source*> &lights,const vector<Object*> &objects,double ambient,int index,double accuracy,int deep){
Color win_obj_color = objects[index]->getColor();
Vect win_obj_normal = objects[index]->getNormalAt(pos);
Color final_color(win_obj_color*ambient);
double dir_normal = win_obj_normal*dir;
if (dir_normal >0) return final_color;
Vect reflect_dir = (dir +2*win_obj_normal).normalize();
if (objects[index]->reflectivity()>0 && deep>0) {
Ray reflect_ray(pos,reflect_dir);
vector<index_line> reflection_detection = check_intersections(objects,reflect_ray,accuracy);
if (reflection_detection.size()!=0) {
//final_color+=Color(reflect_dir);
final_color += getColor(reflect_ray.origin+reflect_ray.direction*reflection_detection[0].distance,reflect_ray.direction,lights,objects,ambient,reflection_detection[0].index,accuracy,deep-1)*(-dir_normal)*objects[index]->reflectivity();
}
}
....
最后我得到了正确的反思。
问题出在这里
Vect reflect_dir = (dir +2*win_obj_normal).normalize();
这将使reflect_dir几乎与对象的法线方向相同
我更改了reflect_dir计算的公式并获得了正确的结果
Vect reflect_dir = (dir-2*dir_normal*obj_normal).normalize();