myara CG blog

CG Design Blog. Thoughts, experiments and experiences.

SI | Separate Clusters w/ Weights

今日はキュラクターのバリエーションモデリングやってました。

全く変わらないパーツもあるし、他のキャラクタの共通パーツもあるので、他のキャラクターのクラスターを切り離して使い回したほうが楽じゃないかと思って、自動にしてくれるスクリプトを探していました。

ツイッターにつぶやいたらTera256さんがスクリプトをアップしてくれました

残念ながら、このコードは「Extract Polygons」を使っているので、エンベロープが消えてしまいます。

キャラモデラーにとってはSoftimageの素晴らしいところはエンベロープだと思います。切り離しても、マージしてもウェイトが残るというところが素晴らしい。

これは当たり前だったから、この素晴らしさはMayaを使うことになってから初めて知りました。

ウェイト付きのキャラクタにポイント・エッジ・ポリゴンを増やせない、消せない、消すとウェイトが消えます。
ウェイトを付けた後にモデリングはあんまりいじれない、ポーズをつけたままにいじると変なことになったりする。
複製するとウェイトが消えます。Non Deformer History(XSIのFreeze M)やるとウェイトが可笑しくなったり、小数点が入ったりします。ウェイト保存とかはdoraskinなどユーザーが作ったツールに頼るしかありません。doraskinって良いツールだな~SI版も欲しいですね。

Mayaのウェイトはマジで使えないですね!もうなんとかして下さいよ!Autodeskさん!

でもMayaの構造から変えないと出来ないと思うね。そうしたら、(単純な)シーンはどのバージョンでも開けるというMayaの一番良いところがだめになるかもしれませんね。

それ以外、Mayaってどこが良いですか?みんなの3DCGさんよ!

あ~いけないまたMaya愚痴になっちゃった。はい、Softimageの話に戻ります。

やっぱりウェイトをキープして、切り離すツールがなかったので、急いで作りました。

手動の方法は:

・オブジェクトを複製
・複製したオブジェクトのクラスタのコンポネントを選択
・選択範囲を反転
・コンポネントを削除

あとは名前を変えて、フリーズ。

単純な作業だけど、クラスタが多いと面倒くさいですね。
しかも、1体だけじゃないんですからね。

でも単純だからコマンドをそのまま使えばすぐ作れそうだったから作って見ました。

一応、今日の仕事では結構使っていたので多分大丈夫だと思います。

適当なコードを少し整理したから公開します:

DOWNLOAD

使い方:
----------------------------------------
・オブジェクトを選択して実行 → 全クラスタをバラバラにしてくれます。

・クラスタを選択して実行 → 選択されたクラスタだけを切り離してくれます。

元のオブジェクトはそのまま残ります、クラスタも消さない。
元のクラスタも消してくれる機能はまた今度にします。多分。
今必要ないからこれでいい。


/*----------------------------------

Separate Clusters
------------------------------------
Separate Clusters maintaining their envelope weights.
It doesn't delete the original object or clusters.

2012/02/17
myara
----------------------------------*/

nolog()
var oSel=GetValue("selectionlist")

for ( var i=0; i < oSel.Count; i++ ) {
// if selection is a polygon Cluster, separate it
if (oSel(i).type=="poly"){
SepCls(oSel(i))
}
// if selection is a polygon Cluster, separate all poly clusters
else if (oSel(i).type=="polymsh"){
// Just in case unhide all.
// Otherwise we may have a hidden cluster named "InvisiblePolygons"
UnhideAllPolygons();
var oCls = oSel(i).ActivePrimitive.Geometry.Clusters.Filter("poly")
for ( var j=0, a=oCls.Count; j < a ; j++ ) {
SepCls(oCls(j))
}
if (oCls.count==0){
LogMessage("No Polygon Clusters Found in Object", siWarning)
}
}
else{
Logmessage("Select a Polygon Cluster or Polymesh Object", siWarning)
}
}

function SepCls(oCls, env){
Selection.Clear()
var oObj0 = oCls.Parent3DObject;

// Duplicate Object, delete the rest of components
var oObj = Duplicate (oObj0);
SelectMembers(oObj + ".polymsh.cls." + oCls.name);
InvertSelection("Polygon", null, null);
ApplyTopoOp("DeleteComponent");

// Rename and asign Material on duplicated
SelectObj(oObj);
var oObj = selection(0);
oObj.name = oCls.name;
oObj.SetMaterial (oCls.Material);

// Delete all polygon Clusters on duplicated
var oCls = oObj.ActivePrimitive.Geometry.Clusters.Filter("poly");
for (var j = 0, a = oCls.Count ; j < a; j++){
RemoveCluster(oCls(j));
}

// Freeze and deselect all
FreezeModeling (oObj)
Selection.Clear()
}

function nolog(){
// Turn Log Off
var prefs = Application.Preferences;
prefs.SetPreferenceValue( "scripting.cmdlog", false );
}

Comments

Post a comment


Only the blog author may view the comment.

Trackbacks

Trackbacks URL
http://myara.blog.fc2.com/tb.php/75-61edb093
Use trackback on this entry.