D日記

モーションアーティストの技術ブログだよ。日常も書くよ。

MENU

【Maya】タイムスライダーをモーションの尺に合わせる【MEL】

f:id:ponta565:20190804162516p:plain

今日は他人のモーションシーンを開いた時にたまに起こる、
「どのフレームにモーションあるねん!!」
問題を解決しようと思う。

問題

外注からもらったデータとかでたまにこういうのありません?
タイムスライダーの表示領域外にモーションデータがはみ出てるやつw
f:id:ponta565:20190626032730p:plain

いちいち、タイムスライダーをモーションデータに合わせるのもメンドイですよね。

解決してくれるMEL

// 指定したノードが使われていたら 1 を返す
proc int isNodeUsed(string $node){
    int $isUsed = 1;

    if ($node != "characterPartition") {
        string $reallyExist[] = `ls $node`;
        
        if (size($reallyExist) != 0) {
            string $connectionList[] = `listConnections $node`;

            if (size($connectionList) <= 0){
                $isUsed = 0;
            }
        }
    }

    return $isUsed;
}


proc SetTimeSliderCurrentAnimationRange(){

    // 不使用アニメーションカーブの削除
    string $nodeList[] = `ls -type animCurve`;

    for ($i=0; $i < size($nodeList); $i++) {

        if (!isNodeUsed($nodeList[$i] )) {
            deleteIfNotReferenced( $nodeList[$i] );
        }
    }


    // 全アニメーションファイルを比較し、最小・最大フレーム を取得する。
    $animCurves = ls( "-type" , "animCurve" );
    $min = `findKeyframe -w first $animCurves[0]`;
    $max = `findKeyframe -w last $animCurves[0]`;


    for( $ac in $animCurves ){
        $temp = `findKeyframe -w first $ac`;
        if( $temp < $min ) $min = $temp;

        $temp = `findKeyframe -w last $ac`;
        if( $temp > $max ) $max = $temp;
        
    }


    // タイムスライダーを合わせる
    playbackOptions  -ast $min -aet $max -min $min -max $max;


}

SetTimeSliderCurrentAnimationRange();


ごめんなさい。もうね最近Githubに貼るのがめんどくさくてね(^o^)


一応処理内容をざっくりいうと・・・
①シーン内の不使用アニメーションファイルを削除
②シーン内の全アニメーションカーブを取得
③②で取得した中の、最小・最大フレームにタイムスライダーを合わせる
・・・という感じです。

参考URL
whaison.jugem.jp