global_settings { charset utf8 } #include "colors.inc" //--------------------------------------------------------------- // 背景色とアンモナイトの色など共通定数を定義する background { color Gray90 } #declare ammo_color = Gold; // 殻の色 //--------------------------------------------------------------- // 殻口形状を定義する // 殻口のサイズ/精度 #declare t_step=0.002; // 殻口を描く際のステップの細かさ #declare whorl_height=4.0; // 殻口の高さ(POV-Rayの単位) // 殻口を定義するベジェ曲線のパラメータ // 殻口の形状を正面から見た場合のベジェ曲線のパラメータ // (前半、内側) #declare P0Ix=0.0; // FIX #declare P0Iy=-whorl_height/2.0; // FIX #declare P1Ix=0.2; #declare P1Iy=-2.0; #declare P2Ix=0.7; #declare P2Iy=-1.7; #declare P3Ix=0.7; #declare P3Iy=0.0; // (後半、外側) #declare P0Ox=P3Ix; // FIX #declare P0Oy=P3Iy; // FIX #declare P1Ox=0.7; #declare P1Oy=0.8; #declare P2Ox=0.7; #declare P2Oy=1.5; #declare P3Ox=0.0; // FIX #declare P3Oy=2.0; // FIX // 殻口の形状を側面から見た場合のベジェ曲線のパラメータ // (前半、内側) #declare P0Iz=0; // FIX #declare P1Iz=0; #declare P2Iz=0; #declare P3Iz=0; // (後半、外側) #declare P0Oz=P3Iz; // FIX #declare P1Oz=0; #declare P2Oz=0; #declare P3Oz=0; // 前半と後半の変化点 (0.0-1.0) #declare RevPointXY = (P3Iy-P0Iy)/whorl_height; #declare RevPointZ = 0.8; // 殻口の描画(定義) #declare Growth_line_base = blob { threshold 0.01 // ブロブの引合う強さ #declare wt = 0.0; #while (wt <= 1.0) // 0.0~1.0までの範囲でベジェ曲線を計算し、殻口を描く // ベジェ曲線によるXY座標の計算(計算式は以下のとおり) // B(t)=pow((1-t),3)*P0 + 3*t*pow((1-t),2)*P1 + 3*pow(t,2)*(1-t)*P2 + pow(t,3)*P3 #if (wt > RevPointXY) // 前半/後半の判定 // (後半部分の場合の計算) #declare wxyt=(wt-RevPointXY)/(1-RevPointXY); #declare Btx=pow((1-wxyt),3)*P0Ox + 3*wxyt*pow((1-wxyt),2)*P1Ox + 3*pow(wxyt,2)*(1-wxyt)*P2Ox + pow(wxyt,3)*P3Ox; #declare Bty=pow((1-wxyt),3)*P0Oy + 3*wxyt*pow((1-wxyt),2)*P1Oy + 3*pow(wxyt,2)*(1-wxyt)*P2Oy + pow(wxyt,3)*P3Oy; #else // (前半部分の場合の計算) #declare wxyt=wt/RevPointXY; #declare Btx=pow((1-wxyt),3)*P0Ix + 3*wxyt*pow((1-wxyt),2)*P1Ix + 3*pow(wxyt,2)*(1-wxyt)*P2Ix + pow(wxyt,3)*P3Ix; #declare Bty=pow((1-wxyt),3)*P0Iy + 3*wxyt*pow((1-wxyt),2)*P1Iy + 3*pow(wxyt,2)*(1-wxyt)*P2Iy + pow(wxyt,3)*P3Iy; #end // 簡易的にZ方向の位置を計算する #declare zt=(Bty-P0Iy)/(P3Oy-P0Iy); // yの値を元に簡易的にZ用のt値を決める #if (zt > RevPointZ) // 前半/後半の判定 // (後半部分の場合の計算) #declare wzt=(zt-RevPointZ)/(1-RevPointZ); #declare Btz=pow((1-wzt),3)*P0Oz + 3*wzt*pow((1-wzt),2)*P1Oz + 3*pow(wzt,2)*(1-wzt)*P2Oz + pow(wzt,3)*P3Oz; #else // (前半部分の場合の計算) #declare wzt=zt/RevPointZ; #declare Btz=pow((1-wzt),3)*P0Iz + 3*wzt*pow((1-wzt),2)*P1Iz + 3*pow(wzt,2)*(1-wzt)*P2Iz + pow(wzt,3)*P3Iz; #end // x,y,z座標に小さな球を描画する sphere { // 右側 , 0.1, 1 } sphere { // 左側 <-Btx, Bty, Btz>, 0.1, 1 } #declare wt=wt+t_step; #end texture { // 仕上げ(表面)属性 pigment { color ammo_color } finish { specular 0.5 roughness 0.005 ambient 0.35 } } } // 描いた殻口の向きを整えて、オブジェクトGrowth_lineとして定義する #declare Growth_line = object { Growth_line_base rotate <0, 90, -90> } //------------------------------------------------------------- // アンモナイト全体を描画する(定義) // アンモナイトの描画パラメータ #declare sita_step = pi/1600; // 1描画単位の回転角 (ラジアン) #declare proto = 0.2; // 初房サイズ #declare start_size = proto/4;// 殻口径の初期サイズ #declare num_whorl=5; // 巻き数 // 螺旋の計算パラメータ #declare fact_rt = 0.050; // 回転角に応じて半径が大きくなる割合(初期値) #declare fact_wt = 0.018; // 回転角に応じて太さが大きくなる割合(初期値) #declare fact_ar=0.07; // 回転角に応じてfact_rtが大きくなる割合 #declare fact_aw=0.07; // 回転角に応じてfact_wtが大きくなる割合 // アンモナイト全体をオブジェクトammoniteとして定義する #declare ammonite= union { // 初房を定義する sphere { <0, 0, 0>, proto texture { pigment { color ammo_color } finish { specular 0.5 roughness 0.005 ambient 0.35 } } } // 螺旋の初期設定 #declare max_wt = (num_whorl-0.12)*(2.0*pi/sita_step); // 全体の描画に必要なループ回数 #declare wsita = 0.0; // 回転角の初期値 #declare wt = 0; // ループカウンタの初期値 #while (wt <= max_wt) // wtがmax_wt以上になるまでループする // 螺旋座標値と殻口サイズの計算 #declare wr = (exp(fact_ar*wsita))*(exp(fact_rt*wsita)-1+proto/2.0); #declare ww = (exp(fact_aw*wsita))*(exp(fact_wt*wsita)-1)+start_size; #declare wx=wr*cos(wsita); #declare wy=wr*sin(wsita); // 1成長単位を描画する定義 object { Growth_line scale ww rotate <0, 0, degrees(wsita)> translate } #declare wt=wt+1; // ループカウンタをカウントアップ #declare wsita = wsita+sita_step; // 回転角を加算 #end } //--------------------------------------------------------------- // カメラは手前方向から、中央やや下を見て撮影 camera { location <0, 0, -100> look_at <0, -5, 0> } //--------------------------------------------------------------- // ライトは手前やや右上から照明 light_source { <1, 3, -100> color White} //--------------------------------------------------------------- // アンモナイトを実際に描画する object { ammonite // 側面から translate <-20, 0, 0> } object { ammonite // 前面から rotate <0, 0, -40> rotate <0, 90, 0> translate <40, 0, 10> }