レンズを置いてみる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





コメント
コメントを投稿