global_settings { charset utf8 } #include "colors.inc" //--------------------------------------------------------------- // 背景色とアンモナイトの色など共通定数を定義する background { color Gray90 } #declare ammo_color = Gold; // 殻の色 //------------------------------------------------------------- // アンモナイト全体を描画する(定義) // アンモナイトの描画パラメータ #declare sita_step = pi/1600; // 1描画単位の回転角 (ラジアン) #declare costal_interval1=16; // 通常の肋が発生するインターバル #declare costal_interval2=48; // 主肋が発生するインターバル #declare main_costal_start=1600*2.5; // 主肋を生成し始めるカウント値 // アンモナイト全体をオブジェクトammoniteとして定義する #declare nipponites = union { // 螺旋の初期設定 #declare lastX=0.0; // 前回の座標値 #declare lastY=0.0; #declare lastZ=0.0; #declare rtx=0.0; #declare rty=0.0; #declare rtz=0.0; #declare dispFlg=0; // 殻口の向きを決めるために最初の1回をスキップするためのフラグ #declare cnt=0; // 肋と疣の周期判定用カウンタ #declare wt = -pi; #while (wt <= 2.0*pi) // Calculation #declare wx=exp(0.11*wt)*(1+0.2*cos(6*wt))*cos(wt-0.3*sin(6*wt)); #declare wy=exp(0.11*wt)*(1+0.2*cos(6*wt))*sin(wt-0.3*sin(6*wt)); #declare wz=exp(0.11*wt)*sin(3*wt); #if(dispFlg=1) // 2回目以降を描画対象とする // 通常の肋生成周期の判定 #declare costal_level=1.0; #if(mod(cnt,costal_interval1)=0) #declare costal_level=1.05; #end // 成体殻主肋の生成周期の判定 #if(cnt>main_costal_start) // 通常の肋は徐々に小さくする #declare costal_level=costal_level-(cnt-main_costal_start)*0.0001; #if(costal_level<1.0) #declare costal_level=1.0; #end #if(mod(cnt,costal_interval2)=0) // 徐々に大きな主肋を形成(但しMaxあり) #declare costal_level=1.05+min((cnt-main_costal_start)*0.0003, 0.2); #end #end // 前回と比較して移動量(ベクトル)の絶対値を求める #declare wwr=vlength(); // 最も移動量の大きい座標軸を使って、新しい殻口の向きを決める #if(abs(wx-lastX) >= max(abs(wy-lastY),abs(wz-lastZ))) // X軸を使用して殻口の向きを決める #if(wx; #declare rot3=<0, 0, degrees(rtz)>; #declare rot1=<90, 90, 0>; #declare trans1=; #else #if(abs(wy-lastY)>=abs(wz-lastZ)) // Y軸を使用して殻口の向きを決める #if(wy; #declare rot3=<0, 0, degrees(rtz)>; #declare rot1=<0, 0, 0>; #declare trans1=<0, wwr, 0>; #else // Z軸を使用して殻口の向きを決める #if(wz; #declare rot3=<0, degrees(rty), 0>; #declare rot1=<90, 0, 0>; #declare trans1=<0, 0, wwr>; #end #end // 殻口(1描画単位)を描くための定義 #if(costal_level<=1.0) // 通常の殻口 torus { 0.3+wt*0.07, 0.05 rotate rot1 translate trans1 rotate rot2 rotate rot3 translate texture { pigment { color ammo_color } finish { specular 0.5 roughness 0.005 ambient 0.35 } } } #else // 肋のあるの殻口 torus { 0.15+wt*0.07, 0.2 scale rotate rot1 translate trans1 rotate rot2 rotate rot3 translate texture { pigment { color ammo_color } finish { specular 0.5 roughness 0.005 ambient 0.35 } } } #end #else #declare dispFlg=1; // 2回目以降描画対象とする #end #declare lastX=wx; // 最後の座標を記憶 #declare lastY=wy; #declare lastZ=wz; #declare wt=wt+sita_step; #declare cnt=cnt+1; #end } //--------------------------------------------------------------- // カメラは手前方向から、中央やや下を見て撮影 camera { location <-7, 0, 0> look_at <0, -0.3, 0> } //--------------------------------------------------------------- // ライトは手前やや下と、左手からの2つで照明 light_source { <0, -2, -10> color White} light_source { <-10, 0, 0> color White} //--------------------------------------------------------------- // nipponitesを実際に描画する object { nipponites rotate <-50, 40, -30> }