1

我正在学习光线追踪并将反射添加到我的光线追踪中。但是球体的反射看起来很平坦。我不知道为什么。

我渲染了归一化反射和彩色图片。希望有人能帮助我。谢谢。

反射代码:

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 计算的公式并得到了正确的结果 Vect reflect_dir = (dir-2*dir_normal*obj_normal).normalize(); 在此处输入图像描述

4

0 回答 0