一度エンベローブを適当したオブジェクトのSRTとニュートラルポーズを初期値にするために一度フリーズしてまたエンベローブを適応しなおす。
ってもの作ってたんですが。
softimageのscriptでエンベローブを適応する方法っていうと
ApplyEnvelope
ApplyFlexEnv
の二つだと思うんですが
var oSel = Selection(0);
var oEnvelope = oSel.Envelopes(0)//エンベローブ取得
var oDeformers = oEnvelope.Deformers //エンベローブのデフォーマーコレクション取得
DeleteObj( oSel+".polymsh.cls.EnvelopWeightCls*") ;//エンベローブクラスタ削除
oSel.ApplyEnvelope(oDeformers)
ってな感じで一個のオブジェクトだったら問題なく戻すことができるんですが。
これが複数のオブジェクトで適応させようと思うと。
オブジェクトごとにエンベローブデフォーマーが違う場合があるので。
var oDeformers = oEnvelope.Deformers//エンベローブのデフォーマーコレクション取得
の部分の変数を柔軟に変えたいわけですよ。
oDeformers1
oDeformers2
みたいにオブジェクト数だけ増やしたい。
oDeformers+iとかまぁ当然無理ですよね。
何かしら方法はありそうなんですけど分かったら改造でいいか。
※あばばば 配列でできました。
--------------------------------------------------------------------------------------------------------------------------------------
スクリプトのロード使ってるんで汎用性はないです、メモ用
//オブジェクトを選択して実行
var oSels = Selection;
Save_EnvelopWeight_Preset();//scriptのロード(エンベローブウェイト保存)
oDeformer = new Array(oSels.Count);//配列作成
for (i = 0; i < oSels.Count; i++) {
var oSel = Selection(i);
var oEnvelope = oSel.Envelopes(0)
var oDeformers = oEnvelope.Deformers
oDeformer[i] = oDeformers
}
FreezeObj(null, null, null);
ResetTransform(null, siCtr, siSRT, siXYZ);
SetNeutralPose(oSels, siSRT, true);
DeleteObj( oSel+".polymsh.cls.EnvelopWeightCls*");
//エンベローブ再設定
for (i = 0; i < oSels.Count; i++) {
var oSel = Selection(i);
oDeformers = oDeformer[i]
oSel.ApplyEnvelope(oDeformers)
}
Load_EnvelopWeight_Preset();//scriptのロード(エンベローブウェイト読み込み)