一度エンベローブを適当したオブジェクトの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とかまぁ当然無理ですよね。
何かしら方法はありそうなんですけど分かったら改造でいいか。
※あばばば 配列でできました。
--------------------------------------------------------------------------------------------------------------------------------------
Softimage用のMMDで使うscriptです。
MMDの出力時には不要なShadowRigのRootを削除して親子関係を直します。
汎用性はないかなーと思います。自分専用。
softimageで作ってる方ってあんまり多くないので参考にもならんかも
というか先駆者はもっとちゃんとやり方構築されてますよねorz
で、結局これってマクロなんですよね。
やってることってモデルの中から"*root"を検索して
見つかったrootの親と子を取得して親子関係を付け直して
取得したものは消すっていうことやってます。
というてもこれが結構回数行うのでずっと似たようなもの作ろうと考えてました。
本当はもっと処理楽にしたところあるんですけどとりあえずですね。
いっぺんにやると失敗するのです
コメントはかなり細かく書くので慣れてる人からするとうっとおしいくらい書いてます。自分が後で見て分かるよう。たまにしか書かないからね。
ParentObjって子の方は複数含まれてるデータでも一気にやってくれるんですねぇ、最初はループして一個ずつ読ませてたわ。
//---------------------こっからscript--------------------------------------
//モデルを選んで実行
//親子の関係をぶった切りおじいちゃんと親子の関係を結びなおす
//なお親は世界に放り出される模様
var oCondition = "*root*"//******条件この列を書き換えてください******
var oSel = Selection(0)
var oType = oSel.Type
if (oType == "#model"){Run( );}
else{x="Modelを選択しやがれですよ";}
function Run( )//実行命令
{
var oChildren = oSel.FindChildren(oCondition,"")//名前に*rootを含む子を取得
for(var i = 0 ; i < oChildren.count ;i++){
var oRoot = oChildren(i)//root取得
var oRParent = oRoot.Parent//rootの親取得
var oRChildren = oRoot.Children//rootの子取得(複数)
ParentObj( oRParent , oRChildren);//親子関係をつける、子は複数もいけるっぽい
CutObj(oRoot);//rootを親から外す、家族の近いを切るなんてそんな って人はこめんとあうつ
DeleteObj(oChildren);//削除、消すなんてそんなって人はコメントあうつ!
}
}
ソース全文とりあえず
小数点以下も出せるけどとりあえず整数がほしいらしいので整数だけ
//-------------ここから------------
//フリーズしていないと使えません、.PositionArrayっての参照してください。
var oSel = Selection(0);
//ジオメトリを取得
var oGeo = oSel.ActivePrimitive.Geometry
//頂点数を取得
var oPCount = oGeo.Points.Count
//配列を作成
var aPos = new Array(oPCount*3)
//頂点数だけループ
for(i=0;i<oPCount;i++){
var oPoint = oGeo.Points(i)
//SRTの値を配列に入れる作業
for(j=i*3;j<(i*3)+3;){
//roundの部分をceilにすると切り上げ、floorにすると切捨て
aPos[j] = Math.round(oPoint.Position.x)
aPos[j+1] = Math.round(oPoint.Position.y)
aPos[j+2] = Math.round(oPoint.Position.z)
//logmessage ("Xは"+aPos[j])
//logmessage ("Yは"+aPos[j+1])
//logmessage ("Zは"+aPos[j+2])
//ループ回数を進める計算
j = j + 3
}
}
//頂点を動かす
oGeo.Points.PositionArray = aPos;
昨日の記事の続きです。
会社でscriptできる人に相談した結果AutoSaveが実行されたときにイベントを発生させるのは難しいんじゃないだろうか
と言う風になりました。
でまぁやりたいこと話したそれはoyaGさんの作ったSaveSceneAsNowPluginをTimerEventで実行するようにすればいいじゃないの?って言われてまさにそのとおりだったわけですよ。
アプローチ的には保存の前に現在のシーンをバックアップへコピー、その後シーンを保存って寸法です。
SaveSceneAsNowPluginではショートカットに割り当てて上書き保存をするとバックアップを取る っていうことを行っています。
なのでそれをTimerEventで一定間隔ごとに行えば自動保存をバックアップしてくれる ということだ。
前回は現在のシーンは保存してないけどAutoSaveしたものは残したい っていうのを考えてたんだけどそんな辺鄙な状況はほぼない。
戻りたいならシーンを探しにいけば良いということで現在の形に落ち着きました。
Script自体は結局Jscriptで書き直しました。
やりたいことは近かったので結構流用は出来たので無駄にならずよかったです。
あと気がつかなかったんですけどAutoSaveって最後に保存押してから で時間計算するんですね。だからそもそもこまめに保存してる場合はバックアップデータが作られないってことに気がつきませんでした。
plAutoSave.Js
プラグインフォルダにぶち込めば動きます。
時間間隔直したい場合は、テキストエディタで開いて。
//基本30分にしてます、ここをms(ミリセカンド)書き換えれば間隔をコントロールできます。
in_reg.RegisterTimerEvent("AutoSaveBackup",1800000,0);
の部分の1800000を書き換えてください。1000で1秒です
例によって使用は自己責任で。
青色文字は追記修正
先日生放送してたらエラー落ちしてまるっと30分がお亡くなりになられた悲しみにうちしがれて書いた。
生放送のときはどうやらオートセーブ入れてなかったっぽい、どっちにしてもダメだー
オートセーブもどんどん消えていくからバックアップは残して欲しいんですよね。でも消えちゃうの。
復帰は正直信用できないから自衛するしかないの。
MAXちゃんはすげー細かい時間でオートバックアップ取ってしかもそのとき止まらないっていうなかなか優秀な子だったんですよ、それだけはsoftimageになってちょっと怖いなぁって所です。
でメイン。
イベント型プラグインです。自動保存の時間+1分でバックアップを取ります。
30分30秒後に保存するようにしました。上手く昨日しないみたいなので。
バックアップ先はプロジェクトにUserBackupができるのでそこに入ります。
Pluginsフォルダにぶち込むと勝手に働いてくれると思います。
あと動作実験はしてないので導入は自己責任で。これから試します。動くといいね。
plAutoSaveBackup.js
2012SP1で試してますが、現状既に何点か気になる点と直したい点があります。
1.AutoSaveの名前
AutoSaveの設定をオンにするとAutoSaveってファイルがアクティブプロジェクト内の
system/ユーザー名/
にAutoSave1ってできるんですが、
これAutoSaveってファイル名じゃなくてなぜかケツに1が付くんですよね。うちの環境に合わせて書いたのでAutoSave1ってファイルがあったらコピーするってことになってます。もしAutoSaveってファイルが生成される方がいたら書き換えるなりしてくれればとりあえずは解決すると思います。
2.イベントの発動タイミング
プラグインにも種類があるんですけど今回はあることしたときにスクリプトが走るっていうイベント型プラグインを作成しています。
本来ならばAutoSaveをしたときに自動でスクリプトが走る ってのが理想です。
ただ私にはわからなかったので自動セーブの時間を拾って1分後にコピーするって風にしてます。
何か詳しい人がいたら教えてください・・・
上手く機能しなかったので、数値で指定しました。
元々は自動でセーブして別ファイル作ってやろうと思ったんですけど、そういうことはできないんですよね、今いじってるのは保存しないでそのまま続けて別データを保存する。
そういうことが出来る方法を考えたら標準のAutoSaveしかなくてよく分からない遠回りをする羽目になりました。
これも私が知らないだけかもしれないんですけど、とりあえず知りません。そのうち見つかるかも。
今回はWscript?とか結構使っているフォルダ作ったりとかはなんか普通じゃできないとかなんとか、その辺よく分かってないですけど。
script書くときはいつも探り探りです。いや本当
最近なんか特に同僚がすっかりscript漬けなので頼めば書いてくれるんですよ。
でもそれだと自分が書かなくなって怠惰に堕落して結果書けなくなっていると、
なので今回は自分で何も聞かず書いてみました、タブン同じもの書かせたもっとスマートに書くんだろうなって気はします。