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 がオブジェクトの法線方向とほぼ同じになることです。
Reflect_dir 計算の式を変更し、正しい結果を得ました Vect reflect_dir = (dir-2*dir_normal*obj_normal).normalize(); ここに画像の説明を入力

4

0 に答える 0