2012年06月23日

[Mayaスクリプト]小物スクリプト

まぁアレだよ。フリーのMaya使いが作ったデータって凄い汚いよね。

半年振りの更新ですよ。納品終わってちょっと暇になったので。
「仮納品お疲れ様でした」なんていうメールが来たので油断できないけど!
もうね、MotionBuilderでアニメーションつけますよって話だったのによくわからないリグが組んであるキャラモデルが来たりしてね。
コントロールリグとバウンティングリグが同じ階層にあったり、分かれてるって思ってコントロールリグを削除したら一部のメッシュも削除されちゃったり、十分の一のサイズで寄越しやがったからGlobalScaleってノードがあったので10倍の大きさにしたらキャラが長細くなったりで、大変笑わせて頂きました。

スキンウエイトのついていないノードが山ほどあって削除したかったんだけど、モデリングが押しに押しまくっていたので、コンストレインとIKハンドルと目に見えるコントローラだけサクッと削除してFBXにエクスポートしたらやたらと時間がかかる。
なんかクソでけぇファイルが出来たので調べてみたら、ハイレゾメッシュが非表示にされてた。
で、MotionBuilderにキャラを持っていくためにデータをシコシコ整理してたわけなんですが、不思議に思ったのが、transformノードがやたらと多い。transform345とか3桁の数字がついたやつがごろごろある。最初のうちはウエイトがついてないか動かして確認しながら消してたりしてたんだけど、だんだん面倒くさくなってきたのと、よりインパクトのあるブツが出てきたので放置してFBXにエクスポートすることに。右手の骨の名前がteL1とか、前腕はudeR2なのに。

中国のウェブサイトにはモデルデータをアップする掲示板が結構あるんですよ。ほとんどがゲームから抜き出したデータだけどね。狐森さんがコミケで売ってたヤツもアップされてたよ。かにひらさんのスレッドが凄く伸びてたり。制作者とかゲーム名とか明記されてるんで一応著作権には配慮してるつもりらしい。
そこで骨付きのキャラモデルをダウンロードしてみたんだけど、ノードの名前が「FBXASC146ZFBXASC198FBXASC146FBXASC226FBXASC128FBXASC156FBXASC198FBXASC146FBXASC094FBXASC194FBXASC129FBXASC091」とかAutodesk製品のリクエストコードかよ!とか思いつつうっかりリネームとかデータ整理してて気づいたんですよ。transformノードがたくさんある理由を。

髪の毛の骨がウエイトのついていない骨にペアレントされていたので、頭の骨にペアレントしようとしたんですよ。
20120623_1.jpg

transformノードがたくさん出来た!
20120623_2.jpg
ふざけんな!クソ

調べてみたらjointはconnectJointコマンドで親子付けするらしい。Skeleton>ConnectJoint□でオプション開いてModeをParentJointに。
しかもコマンドを実行するための条件がキビシイ。子供にするjointの親を辿っていってjointがあってはいけない。ひとつずつしか実行出来ない。
子供にするjointを一旦UnparentしてからConnectJointすると。ひとつずつね。面倒くせぇ。そりゃぁtransformノード増えちゃうよね。人に渡すんなら削除しとけと思うけどね。

で、今更だけどスクリプトを書いた。
選択したjointを最後に選択したjointにペアレントします。
"""
Change parent of joint.
Last selection will be parent.
"""
from maya.cmds import *

sels = ls(sl=True)
for o in sels[:-1] :
p = listRelatives(o, p=True)
if p : s = parent(o, w=True)[0]
else : s = o
p = listRelatives(s, p=True)
connectJoint(s, sels[-1], pm=True)
if p : delete(p[0])

20120623_3.jpg
transformノードが残らない。話のわかるヤツだ。

ついでに選択したjointのradiusを最初に選択したjointのradiusにあわせるスクリプト。
"""
Set radius of joint from first selection.
"""
from maya.cmds import *

sels = ls(sl=True)
r = getAttr("%s.radius"%sels[0])
for o in sels[1:] :
if "joint" != nodeType(o) : continue
setAttr("%s.radius"%o, r)

もし骨の大きさがバラバラなデータが来ても、慌てず騒がずこのスクリプトを実行します。そして「なんでスケール入ってんの?!」と慌て騒ぎます。
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:


この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。