2014年04月02日

[Mayaスクリプト]骨をミラーコピーするスクリプト

お久しぶりです。なんかPM2.5にウランが混じってるらしいですが私は元気です。直ちに影響はありません。
Mayaのスクリプトもだいぶ溜まってきたし、ブログのパスワードも思い出したので、これから更新間隔が短くなるよ。たぶん。

Mayaを強いられてもう2年が過ぎてしまいました。毎日Mayaが無くなればいいのにと呪いの言葉を吐いてたら呪詛返しに会いました。
Softimage 2015 の最終リリースについてのお知らせ - Autodesk

最近はモデリングでしかSI使ってないし、そのモデリングもzbrushのベースモデルだったり小道具だったりなので、正直どうでもいいかなと。今ではスキニング、リギングはMayaでやった方が早くなっちゃったし。
っていうか、XSIで作ったツールをMayaに移植してたらXSIのツールの使い方を忘れちゃっただけなんだけど。

で、とりあえず使用頻度の高い骨をミラーコピーするスクリプトです。Mayaにも標準でこの機能はついているんですけど糞なんで超糞なんでこれ書きました。最近トイレのタイミングがよく合う人がいるんですが、私はその人のことを勝手に「うん友」と呼んでます。


"""
Mirror Skeleton
"""
from maya.cmds import *


class mirrorSkeletonGui :
sWndName = "mirrorSkeletonWnd"
def __init__(self) :
if window(self.sWndName, q=True, ex=True) :
deleteUI(self.sWndName)
wnd = window(
self.sWndName
)
columnLayout(adj=True)
self.tfFrom = textFieldGrp(
l = "From",
tx = "Left"
)
self.tfTo = textFieldGrp(
l = "To",
tx = "Right"
)
button(
l = "Mirror",
c = self.OnClick_Mirror
)
setParent("..")
showWindow(wnd)
def OnClick_Mirror(self, *args) :
sFrom = textFieldGrp(self.tfFrom, q=True, tx=True)
sTo = textFieldGrp(self.tfTo, q=True, tx=True)
self.mirrorSkeleton(sFrom, sTo)

def printMatrix(self, m) :
print "| %02.04f %02.04f %02.04f %02.04f |"%tuple(m[0:4])
print "| %02.04f %02.04f %02.04f %02.04f |"%tuple(m[4:8])
print "| %02.04f %02.04f %02.04f %02.04f |"%tuple(m[8:12])
print "| %02.04f %02.04f %02.04f %02.04f |"%tuple(m[12:16])

def mulMatrix(self, m1, m2) :
m = [ 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1 ]
for y in range(4) :
for x in range(4) :
m[y*4+x] = m1[y*4]*m2[x] + m1[y*4+1]*m2[4+x] + m1[y*4+2]*m2[8+x] + m1[y*4+3]*m2[12+x]
return m

def getMirrorMatrix(self, o) :
m = xform(o, q=True, ws=True, m=True)
#printMatrix(m)
m = self.mulMatrix(m, [-1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1])
#printMatrix(m)
return m

def mirror(self, o, p, sFrom="Left", sTo="Right") :
sName = o.split("|")[-1].replace(sFrom, sTo)
children = None
if "joint" == nodeType(o) :
jnt = createNode("joint", n=sName)
setAttr("%s.radius"%jnt, getAttr("%s.radius"%o))
else :
jnt = createNode("transform", n=sName)
m = self.getMirrorMatrix(o)
xform(jnt, ws=True, m=m)
setAttr("%s.scale"%jnt, 1,1,1, type="double3")
jnt = parent(jnt, p)[0]
p = jnt
children = listRelatives(o, c=True, f=True)
if children :
for c in children : self.mirror(c, p, sFrom, sTo)

def mirrorSkeleton(self, sFrom, sTo) :
for o in ls(sl=True, l=True) :
p = listRelatives(o, p=True, f=True)
if not p : p = None
else : p = p[0]
self.mirror(o, p, sFrom, sTo)

mirrorSkeletonGui()



この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:


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

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