昔のCGのサンプルによくありそうな、クルクル回っているオブジェを作ってみます。
クルクル回るからには、アニメーションデータですね。アニメーションデータの作り方サンプルになれば良いかな、と思っています。
Xi-TRACEには、アニメーションデータを記述するため、anime命令があります。
anime <var_name>, <fbeg>,<fend>,<fstp>, <file_name> ;
アニメーションは、複数のコマを連続して表示することで、絵が動いているように見せる手法ですよね。このコマのことをフレームと呼びます。anime命令では、Xi-TRACEに計算させるフレーム番号の範囲を、<fbeg>と<fend>で指定します。開始フレームが<fbeg>、終了フレームが<fend>です。
<fstp>は、<fbeg>〜<fend>までの間のフレームをいくつ置きに飛ばして計算するかを指定します。普通は飛ばさないので、<fstp>=1ですね。デバッグ時など、計算時間を短縮したい時に1より大きな値を設定したりします。
これで、Xi-TRACEは<fbeg>から<fend>まで、<fstp>置きに(<fend> - <fbeg> + 1)/<fstp>回、レイトレーシングを実行します。
複数回実行するだけでは、同じ画像を複数回計算するだけになってしまいます。anime命令で<var_name>には、計算しようとするフレームの番号を代入する変数名を指定します。ここで指定した変数には、レイトレの度にその時のフレーム番号が代入されています(下図)。
上の例では、変数名にfnを指定し、フレーム番号で1〜29を指定していますので、この命令を検出すると、Xi-TRACEはfnを1〜29まで順次変化させながら、計30回のレイトレを実行していきます。
1画面のレイトレが終わる度に、計算した画像を<file_name>に指定したファイルへ書き出します。<file_name>には、Windowsの.aviファイルを指定できますので、計算が終わった時点で、AVIアニメーションファイルが完成しています。
まず、完成データを提供しておきます。
Xi-TRACEデータ:cube_kurukuru.xitr
データをダウンロードして、テキストエディタなどで表示しながら、お読みください。
まずは回転から。Xi-TRACEには、物体を回転させる命令がいくつかあります。このデータで使用しているのは、rotzという命令です。
rotz <θ> ;
rotzは、物体をz軸の周りに<θ>°回転させる命令です。
一般のねじ(右ねじ)はドライバを使って時計回りに回転させると、締め込まれていきます。<θ>は、z軸の正の方向へ右ねじをねじ込む回転方向が正(>0)です。
このデータでは画面の上の方向がz軸の正方向になっていますので、rotzでコマのように垂直線の周りに回転します。
台の上でクルクル回っている小さいcubeの回転記述を抜き出してみます(関係のある定数なども抜き出しています)。
var fn_tot=180; // 総フレーム数
var mc_rot=6; // 小cubeの回転数[回/fn_tot]
anime fn, 0,fn_tot - 1,1, $(file)".avi";
rotz 360*mc_rot*fn/fn_tot;
anime命令の設定を確認しておくと、フレーム数fn_tot=180、フレーム番号0〜fn_tot-1まで、変数fnにフレーム番号が入っています。
rotzの記述を見てみます。<θ>=360*mc_rot*fn/fn_totですね。
まず、<θ>は回転の角度ですので、360°で一回転します。数式を見ると360*mc_rot=360*6となっていますので、mc_rot=6回転させようとしています。
fn=0〜fn_tot-1ですので、fn/fn_totは、0〜1(のちょっと手前!正確には179/180)まで変化することがわかります。
つまり、この記述でfn_tot=180フレーム計算する間に、小さなcubeが6回転する、ことになります。
同じ理屈で台まで含めたオブジェ全体を1回転させています。
// 世界を回転(fn_totフレームで1回転)
rotz 360*fn/fn_tot;
動画では、小さなcubeと頂点に配置した光線源(台の頂上の球体です)の色が変わっていきます。
光線源の色を変化させる部分の記述を抜き出してみます。
var h=360*fn/fn_tot;
var s=1.00;
var v=1.00;
hsv;
loc 0,0,base1h + base2h*2 + base3h*2 + 20, 10, h,s,v;
hsv命令で、色モードをHSV色座標系に設定しました。HSV→色相(Hue)、彩度(Saturation)、明度(Value)で色が決定する座標系です。
局所光線源を定義するloc命令の最後3つのパラメータが、光線源の色を決定するパラメータです。3つのパラメータをカンマ(,)で区切って指定しますが、hsv座標系が選択されたので、色相、彩度、明度の順で3つのパラメータとなっています。彩度と明度は固定値ですので、色相について見ていきます。
色相は0〜360の数値で、色を決定するパラメータです。0(360)で赤色、以下60毎に、赤(0) → 黄(60) → 緑(120) → 水色(180) → 青(240) → 紫(300) → 赤(360)と変わります。colorの第一パラメータは、hという変数で指定しており、h=360*fn/fn_totですので、先ほどの回転と同じ理屈ですね。
Xi-TRACEは、プログラム言語形式のデータ記述が可能です。数値を記述するところには数式を記述できますし、変数を宣言して、計算の途中結果を作りながら、最後の結果へたどり着くことができます。このおかげで、色を変えたり、回転させたりと言った簡単なアニメーションなら、意外と簡単に記述できてしまいます。ん?簡単ではないかな?プログラミング言語に不慣れな方には難しいかも。次はもう少し複雑な動画に挑戦してみます。