今日は他人のモーションシーンを開いた時にたまに起こる、
「どのフレームにモーションあるねん!!」
問題を解決しようと思う。
問題
外注からもらったデータとかでたまにこういうのありません?
タイムスライダーの表示領域外にモーションデータがはみ出てるやつw
いちいち、タイムスライダーをモーションデータに合わせるのもメンドイですよね。
解決してくれる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