global_settings { charset utf8 } #include "colors.inc" //--------------------------------------------------------------- // 背景色とアンモナイトの色など共通定数を定義する background { color Gray90 } #declare ammo_color = Gold; // Ammonite color //------------------------------------------------------------- // アンモナイト全体を描画する(定義) // アンモナイトの描画パラメータ #declare sita_step = pi/400; // 1描画単位の回転角 (ラジアン) #declare proto = 0.03; // 初房サイズ #declare start_size = proto/4;// 殻口径の初期サイズ #declare num_whorl=5; // 巻き数 #declare costal_interval=14; // 肋が発生するインターバル // 螺旋の計算パラメータ #declare fact_rt = 0.0018; // 回転角に応じて半径が大きくなる割合(初期値) #declare fact_wt = 0.002; // 回転角に応じて太さが大きくなる割合(初期値) #declare fact_ar=0.05; // 回転角に応じてfact_rtが大きくなる割合 #declare fact_aw=0.05; // 回転角に応じてfact_wtが大きくなる割合 #declare fact_ah=0.05; // 回転角に応じて高さが高くなる割合 // アンモナイト全体をオブジェクトEubostrychocerasとして定義する #declare Eubostrychoceras = union { // 螺旋の初期設定 #declare max_wt = (num_whorl-0.12)*(2.0*pi/sita_step); // 全体の描画に必要なループ回数 #declare wt = 100; // ループカウンタの初期値 #declare wsita = sita_step*wt; // 回転角の初期値 #while (wt <= max_wt) // wtがmax_wt以上になるまでループする // 螺旋座標値と殻口サイズの計算 #declare wr = (exp(fact_ar*wsita))*(exp(fact_rt*wsita)-1+proto/2.0)+0.3; #declare ww = (exp(fact_aw*wsita))*(exp(fact_wt*wsita)-1)+start_size+0.05; #declare wx=wr*cos(wsita); #declare wy=wr*sin(wsita); #declare wz=exp(fact_ah*wsita); // 肋生成周期の判定 #declare costal_level=1.0; #if(mod(wt,costal_interval)=0) #declare costal_level=1.1; #end // 1成長単位を描画する定義 torus { ww, 0.03 scale texture { pigment { color ammo_color } finish { specular 0.5 roughness 0.005 ambient 0.35 } } rotate <0, 0, degrees(wsita)> translate } #declare wt=wt+1; // ループカウンタをカウントアップ #declare wsita = wsita+sita_step; // 回転角を加算 #end } //--------------------------------------------------------------- // カメラは手前方向から、中央を見て撮影 camera { location <0, 0, -5> look_at <0, 0, 0> } //--------------------------------------------------------------- // ライトは手前やや上から照明 light_source { <0, 3, -10> color White} //--------------------------------------------------------------- // アンモナイトを実際に描画する object { Eubostrychoceras rotate <90, 0, 0> translate <0, 3, 0> }