昨日作った指数関数的に上昇するアニメーションのエクスプレッションを生成する MEL スクリプトを応用して、ファイナルファンタジーのボスを倒した時みたいに上から順番にポリゴンが上昇してゆくアニメーションを作成する MEL スクリプトを作成しましたので載せておきます。
やっていることはただ単に上にあるトランスフォームノードから順番に、上昇するアニメーション用のエクスプレッションを作成しているだけです。
global proc CreateExpresionForRiseAnimation(
string $targets[],
float $exponential_start_x,
float $speed, float $speed_rand_range,
float $time_offset, float $time_offset_rand_range)
{
string $expName = "RiseAnim";
string $exp = "float $start_frame="+$exponential_start_x+";\n";
for ($target in $targets)
{
float $actual_speed = $speed + rand(-$speed_rand_range / 2.0, $speed_rand_range / 2.0);
float $actual_time_offset = $time_offset + rand(0.0, $time_offset_rand_range);
$exp += "{\n float $speed = "+$actual_speed+";\n float $frame_delay = "+$actual_time_offset+";\n float $frame = frame + $start_frame - $frame_delay;\n if ($frame < $start_frame)\n {\n $frame = $start_frame;\n }\n "+$target+".translateY = exp($frame * $speed) - exp($start_frame * $speed);\n}";
}
expression -s $exp -n $expName;
}
global proc MovePivotToBottomCenter(string $target)
{
float $bb[] = `polyEvaluate -boundingBox $target`;
float $pivot_x = ($bb[0] + $bb[1]) * 0.5;
float $pivot_y = $bb[2];
float $pivot_z = ($bb[4] + $bb[5]) * 0.5;
move -a $pivot_x $pivot_y $pivot_z ($target+".scalePivot") ($target+".rotatePivot");
}
global proc CreateExpressionForRisingFromTop(
string $targets[],
float $start_frame,
float $delay_frame_rand_range,
float $merge_expression_tolerance_y)
{
for ($target in $targets)
{
MovePivotToBottomCenter($target);
}
while(size($targets) != 0)
{
print("Creating Expression..\n");
float $max_y = GetMaximumTranslateY($targets);
print("Translate Y for Creating Expression: " + $max_y + "\n");
string $current_targets[];
string $rest_of_targets[];
clear $current_targets;
clear $rest_of_targets;
int $target_index = 0;
int $rest_index = 0;
for ($obj in $targets)
{
vector $pos = `xform -q -ws -rp $obj`;
float $diff = abs($pos.y - $max_y);
if ($diff < $merge_expression_tolerance_y)
{
$current_targets[$target_index] = $obj;
++$target_index;
}
else
{
$rest_of_targets[$rest_index] = $obj;
++$rest_index;
}
}
CreateExpresionForRiseAnimation(
$current_targets,
-30.0,
1.0 / 30.0, 1.0 / 30.0,
$start_frame, $delay_frame_rand_range);
$targets = $rest_of_targets;
$start_frame += $delay_frame_rand_range;
}
print("Completed!\n");
}
使い方
- 適用したいポリゴンモデルをばらばらにする
- ばらばらにしたポリゴンのトランスフォームノードに対してこのスクリプトを実行
使用例
string $targets[]=`ls -sl -type transform`;
float $start_frame = `currentTime -q`;
float $delay_frame_rand_range = 30;
float $tolerance = 0.1;
CreateExpressionForRisingFromTop(
$targets,
$start_frame,
$delay_frame_rand_range,
$tolerance);