Gポイントポイ活 Amazon Yahoo 楽天

無料ホームページ 楽天モバイル[UNLIMITが今なら1円] 海外格安航空券 海外旅行保険が無料!

log

2011.06.14 Lscript:選択アイテムのセンター位置にNULLを作成

リグを作成する場合はNULLアイテムを多用することになると思うのですが、毎回
NULLアイテムをリネームして位置を設定するのは面倒です。IKの場合だと
1ボタンでIKを設定するスクリプトがいくつかあるので、それを使えばいいですが、
他のコンストレイントを使う場合も自動で作成したいですよね。ということで、選択
アイテムのセンター位置にNULLを作成するというスクリプトを用意してみました。

// 選択オブジェクト群のシーン開始時のルート位置に
// NULLオブジェクトを作成するスクリプト。
@warnings
@script generic
@name AddNullAtSelectObjectCenter
generic
{
// シーンの開始フレーム番号を取得
var StartFrame = Scene().previewstart;
// シーンのFPSを取得
var Fps = Scene().fps;
// cf.以下のforループ内で使用するgetWorldPosition()は
// 正確にはキーフレーム情報ではなく現在のビュー上で
// 設定したワールド座標値を取得するので、一旦選択フレームを
// 切り替えてビュー上で設定した変更値をリセットさせる。
GoToFrame( Scene().currenttime * Fps );
// 選択アイテム群を取得
SelectArray = Scene().getSelect();
// 選択アイテムが存在しない場合
if( SelectArray == nil ) {
AddNull( "Null" );
return;
}
// 選択アイテム群のルート位置にNULLオブジェクトを作成
for( i=1; i<=size(SelectArray); i++ ) {
// NULLオブジェクトを新しく作成
AddNull( SelectArray[i].name + "_Null" );
// シーンの開始フレーム時のワールド座標値を取得
var Pos = SelectArray[i].getWorldPosition( StartFrame / Fps );
// NULLオブジェクトの座標値を変更
// cf.Position()は選択アイテムに対して行う関数だがAddNull()直後は
// 新しく作成したNULLのみが選択されるので、ここではそれを利用。
Position( Pos.x, Pos.y, Pos.z );
// NULLオブジェクトの回転値も変更する場合
// var Rotate = SelectArray[i].getWorldRotation( StartFrame / Fps );
// Rotation( Rotate.x, Rotate.y, Rotate.z );
// Position(),Rotation(),Scaling()で設定した座標値を
// 指定時刻のキーフレームとして作成
CreateKey(0);
}
}

実は似たようなスクリプトが他にもあるんですけどね。
そちらは同一名のNULLが存在した場合は位置を更新できなかったりするので
こちらの方法をお勧めしたいなと思います。
また、NULLアイテムの名前を変えたい場合はAddNull()部分を変えるなりして
各自カスタマイズしてみて下さい。