[画像処理]週末でレイトレーシング[2]

1.レイトレーシング

実装クラス:vec3、球体(ボール)、X線(放射線、光線方向ベクトル組成+の開始点からの放射)

camera.h hitable.h hitable_list.h

ray.cpp線の.h

sphere.h

vec3.h + vec3.cpp

ショー下図ツール:ffplay.exe

sphere.h

#ifndefのSPHEREH
 の#define SPHEREH 
の#include " hitable.h " 
クラス球:公共hitable {
     パブリック
    球(){} 
    球(vec3 CEN、フロートR):センター(CEN)、半径(R){}
     仮想 ブールヒット(CONST光線&R、フロート TMIN、フロートTMAX、
    hit_record&REC)CONST 
    vec3センター; 
    フロート半径。
}。

ブール球::ヒット(constの光線&R、フロート T_MIN、フロート T_MAX、hit_record&REC)のconst { 
    vec3 OC = r.origin() - 中心;
    フロート A = ドット(r.direction()、r.direction())。
    フロート Bの=はドット(OC、r.direction())。
    フロート C =ドット(OC、OC) -半径* 半径。
    フロート判別式= B * B - * C;
    もし(判別式> 0 ){
         フロート TEMP =(-b - SQRT(B * B - * C))/ もし(温度<T_MAX && TEMP> T_MIN){ 
            rec.t = TEMP。
            rec.p =r.point_at_parameter(rec.t)。
            rec.normal =(rec.p -中心)/ 半径。
            返す ; 
        } 
        TEMP =(-b + SQRT(B * B - * C))/ もし(温度<T_MAX && TEMP> T_MIN){ 
            rec.t = TEMP。
            rec.p = r.point_at_parameter(rec.t)。
            rec.normal =(rec.p -中心)/ 半径。
            返す ; 
        } 
    } 
    を返す 
} 
#endifの

 

 

アンチエイリアシングを着色

 

光の反射の増加

vec3色(CONST光線&R、hitable * 世界){ 
    hit_record REC。
    もし(世界的>ヒット(R、0.001 、FLT_MAX)、REC){ 
        vec3 RND = random_in_unit_shpere()。
        vec3対象 = rec.p + rec.normal + RND。
        // のprintf( "%F%F%F \ n"は、RND [0]、RND [1]、RND [2])。
        戻り 0.5 *色(光線(rec.p、ターゲット- rec.p)、世界)。
    } 
    { 
        vec3 unit_direction = unit_vector(r.direction())。
        フロート T = 0.5 *(unit_direction.y()+ 1.0);
        リターン1.0 - T)* vec3(1.01.01.0)+ T * vec3(0.50.71.0 )。
    } 
}

 

 

 

 

おすすめ

転載: www.cnblogs.com/wangzming/p/11967122.html