レンズを置いてみる5

 レンズを作るマクロと、焦点距離を計算するマクロを作成した。前回までは、エクセルで小数点以下5桁までの数字をコピペしていたため、球面が粗く、像に円形の線が現れていたが、POV-Rayマクロで計算しているので、精度が良い。

レンズを像面から焦点距離の2倍離して、撮像対象をレンズから焦点距離の2倍離した形にすれば、その映像は、等倍の撮像対象が見えるはず。光は、平行光を用いている。


レンズ無しの像。前回同様、片側の空いた格子を光源側に配置し、透過光観察している

lens(2.0,10.0,10.0,0,0.01,1.5,<0,0,lens_focal(0,2.0,10.0,10.0,0,1.5)*2>)

ほぼ等倍に見えるが、線がボケているように見える。次に、焦点距離にレンズを置いてみる。焦点距離の場合、もっとも絞った光点が見えるはずだが、妙に大きい光点になっている。

lens(2.0,10.0,10.0,0,0.01,1.5,<0,0,lens_focal(0,2.0,10.0,10.0,0,1.5)>)

そこで、焦点距離に係数をかけて位置を微調整した。
lens(2.0,10.0,10.0,0,0.01,1.5,<0,0,lens_focal(0,2.0,10.0,10.0,0,1.5)*0.955>)

この係数を2倍した場合の像が以下になる。先ほどよりも等倍にみえ、ボケが少ないように見える。
lens(2.0,10.0,10.0,0,0.01,1.5,<0,0,lens_focal(0,2.0,10.0,10.0,0,1.5)*0.955*2>)

もっとも絞れる光点のサイズが、レンズの解像力を決めることを考えると、ボケが改善するのは納得する。像の歪曲・湾曲は相変わらず、すごい。単純レンズの収差が大きいのは当然といえば当然だ。ここまできたら、非球面レンズなどを再現してみて、収差や解像力を改善できるか検討してみたい。

マクロを以下に記載する。

#macro lens(lens_radius,lens_curv1,lens_curv2,lens_width,lens_res,lens_ior,position)
    //#debug "\n Lens Calcuration \n"
    #local lens_cnt    = (lens_radius / lens_res)*2;
    #local lens_x      = 0.0;
    #local lens_y      = 0.0;
    #local lens_offset1 = sqrt(pow(lens_curv1,2) - pow(lens_radius,2));
    #local lens_offset2 = sqrt(pow(lens_curv2,2) - pow(lens_radius,2));

    #local cnt = 0;
    lathe{ linear_spline
        (lens_cnt + 1),
        #while(cnt < lens_cnt)
            #if( cnt < (lens_radius/lens_res))
                #local lens_y = sqrt(pow(lens_curv1,2) - pow(lens_x,2)) - lens_offset1 + (lens_width/2);
                <lens_x, lens_y>,
                //#debug concat("A ",str(cnt,0,0)," ",str(lens_x,0,5)," ",str(lens_y,0,5),"\n")
                #local lens_x = lens_x + lens_res;
            #elseif( cnt = (lens_radius/lens_res))
                #local lens_y = lens_width/2;
                <lens_x,  lens_y>,
                <lens_x, -lens_y>,
                //#debug concat("B ",str(cnt,0,0)," ",str(lens_x,0,5)," ",str( lens_y,0,5),"\n")
                //#debug concat("B ",str(cnt,0,0)," ",str(lens_x,0,5)," ",str(-lens_y,0,5),"\n")
                #local lens_x = lens_x - lens_res;
            #else
                #local lens_y = lens_offset2 - (lens_width/2) - sqrt(pow(lens_curv2,2) - pow(lens_x,2) );
                <lens_x, lens_y>
                //#debug concat("C ",str(cnt,0,0)," ",str(lens_x,0,5)," ",str(lens_y,0,5),"\n")
                #local lens_x = lens_x - lens_res;
            #end
            #local cnt = cnt + 1;
            
        #end
        pigment{color rgb<1,1,1> filter 1.0} interior{ior lens_ior}
        rotate x*90
        translate position
        photons{target}
    }
#end

#macro lens_focal(lens_type,lens_radius,lens_curv1,lens_curv2,lens_width,lens_ior)
// lens_type
// 0 totu , totu
// 1 totu , ou
// 2 ou   , totu
// 3 ou   , ou
    #if(lens_type = 0)
        #local cr1 = 1;
        #local cr2 = -1;
    #elseif(lens_type = 1)
        #local cr1 = 1;
        #local cr2 = 1;
    #elseif(lens_type = 2)
        #local cr1 = -1;
        #local cr2 = -1;
    #else
        #local cr1 = -1;
        #local cr2 = 1;
    #end    
    #local lens_offset1 = sqrt(pow(lens_curv1,2) - pow(lens_radius,2));
    #local lens_offset2 = sqrt(pow(lens_curv2,2) - pow(lens_radius,2));
    #local lens_d1 = (sqrt(pow(lens_curv1,2) - pow(0,2)) - lens_offset1 + (lens_width/2));
    #local lens_d2 = (sqrt(pow(lens_curv2,2) - pow(0,2)) - lens_offset2 + (lens_width/2));
    #local lens_d  = lens_d1 + lens_d2;
    
    #local cr1 = cr1 * lens_curv1;
    #local cr2 = cr2 * lens_curv2;
    #local focal = 1/( ((lens_ior-1)*((1/cr1) - (1/cr2))) +
                       (pow((lens_ior-1),2) * lens_d)/(lens_ior * cr1 * cr2)
                     );
    //#debug concat("\n",str(focal,0,5),"\n")
    focal
#end







コメント

このブログの人気の投稿

LuxCoreRenderを使ってみる

BlenderでLuxCoreRenderを使う

レンズを置いてみる2