トランスフォームノードの親子階層を無視して親子付けされているポリゴンのアニメーションを頂点にベイクするMELスクリプトを載せます。
ジオメトリキャッシュをとるときに親にアニメーションがついているオブジェクトだと親のアニメーションデータが完全に無視されてジオメトリキャッシュがとられてしまうようなので、それを回避するためのスクリプトです。どんな方法でポリゴンオブジェクトにアニメーションをつけていたとしても、このスクリプトでは毎フレーム頂点のワールド座標を記録していくので、ベイク後にポリゴンアニメーションをジオメトリキャッシュに変換することができます。
追記 ---------------------------------------------
ポリゴンモデルの頂点をベイクしたい場合であれば、このスクリプトを使わなくても親子構造を持っているジオメトリ群をcombineしてあげれば、簡単にアニメーションをベイクできることがわかりました。このスクリプトが有効なのはポリゴン以外ということになります。スクリプト内のfilterExpand -sm 31のセレクションマスク31を変えるとControl Vertexなどの他のコンポーネントでも行けるはずです。
----------------------------------------------------
ただし、このスクリプトはループ回数が頂点数xフレーム数なので、ポリゴン数が多いとめちゃくちゃ重くなるので実用的ではありません。本来ならスクリプトではなくplug-inで作るべき機能です。それだけ注意して下さい。
How to use
1. duplicate source object you want to convert into geometry cache
2. execute following command in script editor,
bakeTransformedVertices(A, B, C, D);
where
A is destination object name
B is source object name
C is start frame number
D is end frame number
Example
ジオメトリキャッシュをとるときに親にアニメーションがついているオブジェクトだと親のアニメーションデータが完全に無視されてジオメトリキャッシュがとられてしまうようなので、それを回避するためのスクリプトです。どんな方法でポリゴンオブジェクトにアニメーションをつけていたとしても、このスクリプトでは毎フレーム頂点のワールド座標を記録していくので、ベイク後にポリゴンアニメーションをジオメトリキャッシュに変換することができます。
追記 ---------------------------------------------
ポリゴンモデルの頂点をベイクしたい場合であれば、このスクリプトを使わなくても親子構造を持っているジオメトリ群をcombineしてあげれば、簡単にアニメーションをベイクできることがわかりました。このスクリプトが有効なのはポリゴン以外ということになります。スクリプト内のfilterExpand -sm 31のセレクションマスク31を変えるとControl Vertexなどの他のコンポーネントでも行けるはずです。
----------------------------------------------------
ただし、このスクリプトはループ回数が頂点数xフレーム数なので、ポリゴン数が多いとめちゃくちゃ重くなるので実用的ではありません。本来ならスクリプトではなくplug-inで作るべき機能です。それだけ注意して下さい。
This is a MEL script for baking animation on vertices ignoring transform hierarchical structure.
However, it is very slow. Actually, it has to be developed as plug-in made by C++.
source codeHowever, it is very slow. Actually, it has to be developed as plug-in made by C++.
global proc bakeTransformedVertices(string $target_obj,
string $src_obj,
int $start_frame,
int $end_frame)
{
string $src_obj,
int $start_frame,
int $end_frame)
{
float $init_pos_ls[], $tmp[], $posw[];
int $frame;
string $vtxs[] = `filterExpand -sm 31 ($src_obj+".vtx[*]")`;
string $tv;
int $end = $end_frame+1;
int $i=0;
currentTime $start_frame;
for($v in $vtxs){
$tv = ($target_obj+".vtx["+$i+"]");
$tmp = `xform -q -t -ws $v`;
$init_pos_ls[$i*3] = $tmp[0];
$init_pos_ls[$i*3+1]= $tmp[1];
$init_pos_ls[$i*3+2]= $tmp[2];
setKeyframe $tv;
$i++;
}
for($frame=$start_frame+1; $frame<$end; $frame++){
currentTime $frame;
int $i=0;
for($v in $vtxs){
$tv = ($target_obj+".vtx["+$i+"]");
$posw = `xform -q -t -ws $v`;
xform -ws -t $posw[0] $posw[1] $posw[2] $tv;
setKeyframe $tv;
$i++;
}
}
}
}
How to use
1. duplicate source object you want to convert into geometry cache
2. execute following command in script editor,
bakeTransformedVertices(A, B, C, D);
where
A is destination object name
B is source object name
C is start frame number
D is end frame number
Example
bakeTransformedVertices("destObjName", "srcObjName", 1, 100);