ロゴ メインコンテンツへ
RSSフィード
「デジタルコンテンツ制作」に関連する記事一覧

MEL FF のボスが倒されて消えるときみたいなエフェクトを作る

2016/06/12 21:46
(この記事の文字数: 258)
MEL 

昨日作った指数関数的に上昇するアニメーションのエクスプレッションを生成する 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");
}

使い方

  1. 適用したいポリゴンモデルをばらばらにする
  2. ばらばらにしたポリゴンのトランスフォームノードに対してこのスクリプトを実行

使用例


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);


  このエントリーをはてなブックマークに追加  

<<「デジタルコンテンツ制作」の記事一覧に戻る

<<「デジタルコンテンツ制作」の次の記事
「デジタルコンテンツ制作」の前の記事 >>

コメント(0 件)



コンテンツロード: 0.02 sec
Copyright(C)2006-2024 puarts All Rights Reserved