<- Back

●初歩的換算系プロシージャー2つ


【1】比率の計算。例えば16:9は1280:?の「?」を知りたいときなど。

proc float ratio(float $a, float $b, float $c) {

   return $c/($a/$b);

}
<使用例>16対9は1280対いくつか知りたい。

ratio(16, 9, 1280);
// Result: 720 //



【2】フレーム数を時間に換算。例えば1805フレームは何分何秒何フレームかなど。

proc string frameToTime(int $frame) {

   int $koma, $sec, $min, $s;
   $min = ceil($frame/1800);
   $s = fmod($frame, 1800);
   $sec = ceil($s/30);
   $koma = fmod($frame, 30);

   return($min+"min "+$sec+"sec "+$koma+"frame\n");

}
<使用例>1805フレームは何分何秒何フレームか?

frameToTime 1805;
// Result: 1min 0sec 5frame //



●シーン中のマッピング等で使われている全てのファイルテクスチャ名をリストする

string $files[] = `ls -type "file"`;
string $ftn;
for($file in $files) {
   $ftn = `getAttr ($file+".ftn")`;
   print($ftn+"\n");
} 
昔のデータを引っ張り出してきたとき、そのシーンがどのフォルダ(ディレクトリ)のどんな外部画像ファイルを使っているか、ざっと目を通すのによく使います。


●選択したオブジェクトのアニメーションを時間軸でランダムにシフトする

string $selected[] = `ls -sl`;
float $min = 0;
float $max = 20;
string $animCurve[];
float $v;

for($i = 0; $i < `size $selected`; $i++) {
   $animCurve = `listConnections -t "animCurve" $selected[$i]`;
   $v = `rand $min $max`;
   for($h = 0; $h < `size $animCurve`; $h++) {
      keyframe -e -iub true -r -o over -tc $v $animCurve[$h];
   }
}
例えば下の左のように同じアニメーションがついた複数のオブジェクトがあり、それぞれのアニメーションをランダムにシフトしたいような場合に用います。アニメーションをシフトしたいオブジェクトを選択してスクリプトを実行します。$minと$maxで指定した値の範囲でランダムにシフトします。




●文字列の配列から任意の要素をひとつ返す


「chooseOneFrom」は文字列の配列1つを引数にとり、その配列に格納されている複数の文字列の中からひとつを選んで返します。

proc string chooseOneFrom(string $str[]) {

   int $size = `size $str`;

   int $n = `rand 0 $size`;

   return $str[$n];

}
使い方ですが、

string $a[] = {"apple", "orange", "banana", "grape"};
chooseOneFrom $a;
みなたいな感じで使用します。この場合、配列$aに格納されている"apple"、"orange"、"banana"、"grape"のいずれかひとつが返されます。どれが返されるかは完全にランダムで決まりますので予測はできません。

このプロシージャーのしくみを説明します。2行目でMELの"size"コマンドを使って、配列に格納されている要素の数 $size を取得します。次に3行目で"rand"コマンドを使い、0から $size に収まる1個のランダムな整数 $n を発生させます(正確には"rand"コマンドで発生する値は小数ですが、整数型の変数$nに格納される時点で整数に丸められます)。そして配列の $n番目の要素を返すという仕組みです。

このプロシージャーは、例えばあらかじめ10種類作っておいた石ころを、広い平原に適当にばら撒いて敷き詰めるようなケースで役立ちます。または、数種類の人間を作っておいて、それをランダムに増やして街中に配置するといったことにも使えます。


<- Back