選択しているオブジェクトの位置や回転、スケール、ピボットなどをコピーして、別のオブジェクトにペーストするスクリプトです。
※ご使用の際は自己責任でお願いします。
●Copy
選択しているオブジェクトの情報をコピーします。
●Pivot
選択しているオブジェクトのピボット位置を、コピーしたピボット位置に合わせます。(上手く動作しないかも)
●Translate
選択しているオブジェクトの位置を、コピーした位置に合わせます。
●Translate(ver.FT)
選択しているオブジェクトの位置を、コピーした位置に合わせます。
コピーしたオブジェクトがフリーズトランスフォームされていた場合は、こちらを使ってください。
●Rotate
選択しているオブジェクトの回転を、コピーした回転に合わせます。
●Scale
選択しているオブジェクトのスケールを、コピーしたスケールに合わせます。
●Center Pivot
ピボット位置をセンターにします。
●Freeze Transform
フリーズトランスフォームします。
●スクリプト(python)
import maya.cmds as mc
#copy location,rotation and scale value of selected object
def copySelObjVal(arg):
global loc,rot,sca,WRP,WSP,locFT
if not mc.ls(sl=1):
if mc.window('ErrorCPNon',ex=1):
mc.deleteUI('ErrorCPNon')
mc.window('ErrorCPNon',title='Error',s=0)
mc.columnLayout()
mc.text(l='Nothing selected objects',w=200,h=50)
mc.showWindow()
elif len(mc.ls(sl=1)) >= 2:
if mc.window('ErrorCPTwo',ex=1):
mc.deleteUI('ErrorCPTwo')
mc.window('ErrorCPTwo',title='Error',s=0)
mc.columnLayout()
mc.text(l='Too many selected objects',w=200,h=50)
mc.showWindow()
else:
selA = mc.ls(sl=1)
loc = mc.xform(selA,q=1,ws=1,t=1)
rot = mc.xform(selA,q=1,ws=1,ro=1)
sca = mc.xform(selA,q=1,r=1,s=1)
WRP = mc.xform(selA,q=1,rp=1,ws=1)
WSP = mc.xform(selA,q=1,sp=1,ws=1)
locFT_tmp = mc.xform(q=1,ws=1,piv=1)
locFT = locFT_tmp[0:3]
#paste location value of selected object
def pasteSelTraVal(arg):
global loc,rot,sca,WRP,WSP
if not mc.ls(sl=1):
if mc.window('ErrorCPNon',ex=1):
mc.deleteUI('ErrorCPNon')
mc.window('ErrorCPNon',title='Error',s=0)
mc.columnLayout()
mc.text(l='Nothing selected objects',w=200,h=50)
mc.showWindow()
elif len(mc.ls(sl=1)) >= 2:
if mc.window('ErrorCPTwo',ex=1):
mc.deleteUI('ErrorCPTwo')
mc.window('ErrorCPTwo',title='Error',s=0)
mc.columnLayout()
mc.text(l='Too many selected objects',w=200,h=50)
mc.showWindow()
else:
selB = mc.ls(sl=1)
mc.xform(selB,ws=1,t=loc)
#paste rotaion value of selected object
def pasteSelRotVal(arg):
global loc,rot,sca,WRP,WSP
if not mc.ls(sl=1):
if mc.window('ErrorCPNon',ex=1):
mc.deleteUI('ErrorCPNon')
mc.window('ErrorCPNon',title='Error',s=0)
mc.columnLayout()
mc.text(l='Nothing selected objects',w=200,h=50)
mc.showWindow()
elif len(mc.ls(sl=1)) >= 2:
if mc.window('ErrorCPTwo',ex=1):
mc.deleteUI('ErrorCPTwo')
mc.window('ErrorCPTwo',title='Error',s=0)
mc.columnLayout()
mc.text(l='Too many selected objects',w=200,h=50)
mc.showWindow()
else:
selB = mc.ls(sl=1)
mc.xform(selB,ws=1,ro=rot)
#paste scale value of selected object
def pasteSelScaVal(arg):
global loc,rot,sca,WRP,WSP
if not mc.ls(sl=1):
if mc.window('ErrorCPNon',ex=1):
mc.deleteUI('ErrorCPNon')
mc.window('ErrorCPNon',title='Error',s=0)
mc.columnLayout()
mc.text(l='Nothing selected objects',w=200,h=50)
mc.showWindow()
elif len(mc.ls(sl=1)) >= 2:
if mc.window('ErrorCPTwo',ex=1):
mc.deleteUI('ErrorCPTwo')
mc.window('ErrorCPTwo',title='Error',s=0)
mc.columnLayout()
mc.text(l='Too many selected objects',w=200,h=50)
mc.showWindow()
else:
selB = mc.ls(sl=1)
mc.xform(selB,s=sca)
#paste pivot value of selected object
def pasteSelPivVal(arg):
global loc,rot,sca,WRP,WSP
if not mc.ls(sl=1):
if mc.window('ErrorCPNon',ex=1):
mc.deleteUI('ErrorCPNon')
mc.window('ErrorCPNon',title='Error',s=0)
mc.columnLayout()
mc.text(l='Nothing selected objects',w=200,h=50)
mc.showWindow()
elif len(mc.ls(sl=1)) >= 2:
if mc.window('ErrorCPTwo',ex=1):
mc.deleteUI('ErrorCPTwo')
mc.window('ErrorCPTwo',title='Error',s=0)
mc.columnLayout()
mc.text(l='Too many selected objects',w=200,h=50)
mc.showWindow()
else:
selB = mc.ls(sl=1)
mc.xform(selB,rp=WRP,ws=1)
mc.xform(selB,sp=WSP,ws=1)
#center pivot
def centerPivot(arg):
mc.xform(cp=1)
#freeze transform
def freezTransformKU(arg):
mc.makeIdentity(a=1,t=1,r=1,s=1)
#paste loc value for freeze transform object
def pasteTraValFT(arg):
global loc,rot,sca,WRP,WSP,locFT
if not mc.ls(sl=1):
if mc.window('ErrorCPNon',ex=1):
mc.deleteUI('ErrorCPNon')
mc.window('ErrorCPNon',title='Error',s=0)
mc.columnLayout()
mc.text(l='Nothing selected objects',w=200,h=50)
mc.showWindow()
elif len(mc.ls(sl=1)) >= 2:
if mc.window('ErrorCPTwo',ex=1):
mc.deleteUI('ErrorCPTwo')
mc.window('ErrorCPTwo',title='Error',s=0)
mc.columnLayout()
mc.text(l='Too many selected objects',w=200,h=50)
mc.showWindow()
else:
selB = mc.ls(sl=1)
mc.xform(selB,ws=1,t=locFT)
#window
if mc.window('copyPaste', ex=1):
mc.deleteUI('copyPaste')
mc.window('copyPaste',title='copyPaste',s=0)
mc.columnLayout()
mc.button(l='Copy',c=copySelObjVal,w=110,bgc=(1,0.443,0))
mc.button(l='Pivot',c=pasteSelPivVal,w=110,bgc=(0.8,0.8,0.8))
mc.button(l='Translate',c=pasteSelTraVal,w=110)
mc.button(l='Translate(ver.FT)',c=pasteTraValFT,w=110)
mc.button(l='Rotate',c=pasteSelRotVal,w=110)
mc.button(l='Scale',c=pasteSelScaVal,w=110)
mc.button(l='Center Pivot',c=centerPivot,w=110,bgc=(0.5,0.5,0.5))
mc.button(l='Freeze Transform',c=freezTransformKU,w=110,bgc=(0.2,0.2,0.2))
mc.showWindow()
2016年1月24日日曜日
2016年1月18日月曜日
アニメーションの軌跡に沿ったカーブを作るスクリプト
アニメーションの軌跡に沿ったカーブを作るスクリプト
●Curveボタン
選択しているオブジェクトのアニメーションに沿った次数1のNurbs curveを作ります。
●Nur to Bez
選択しているNurbs curveをBezier curveに変換します。
●Sel smooth
Bezier curveの選択したcvに対してsmoothをかけます。
●All smooth
選択しているBezier curveにsmoothをかけます。
●Bez to Nur
選択しているBezier curveをNurbs curveに変換します。
※ナーブスカーブをベジェカーブに変換したり、ベジェカーブにスムースをかけたりするボタンがある理由
次数1のナーブスカーブでは、動きの速いオブジェクトだとカーブがカクカクしてしまいます。
カーブを滑らかにするために次数を上げればいいのですが、次数を上げるとカーブがオブジェクトの軌跡を外れてしまいます。
なので軌跡を外れずにカーブを滑らかにするために、一旦ベジェカーブにしてからカーブを滑らかにできるようにしました。
ただ、ナーブスのCV全部にスムースをかけてしまうと、バウンシングボールのようなアニメーションの時の接地部分でカーブが変になってしまいます。そのため、滑らかにしたいCVに対してだけスムースをかけられるように「Sel smooth」ボタンを作りました。
●スクリプト(python)
#make nurbs curve of select object's animation
import maya.cmds as cmds
def createCurve(arg):
sel = cmds.ls(sl=1)
staF = cmds.playbackOptions(q=1,min=1)
endF = cmds.playbackOptions(q=1,max=1)
allF = range(staF+1,endF+1)
cmds.currentTime(staF)
locStaF = cmds.xform(sel,q=1,ws=1,t=1)
cmds.curve(d=1,p=locStaF)
curN = cmds.ls(sl=1)
for i in allF:
cmds.currentTime(i)
loc = cmds.xform(sel,q=1,ws=1,t=1)
cmds.curve(curN,a=1,p=loc)
def changeBezier(arg):
cmds.nurbsCurveToBezier( )
def changeAllSmooth(arg):
curN = cmds.ls(sl=1)
str_curN = str(curN).replace("[u'",'').replace("']",'')
degs = cmds.getAttr( '.degree' )
spans = cmds.getAttr( '.spans' )
cvs = degs+spans
cvs_step3 = range(0,cvs,3)
cvs_step3.pop(0)
cmds.select(str_curN + '.cv[0]')
for i in cvs_step3:
cmds.select(str_curN + '.cv[' + str(i) + ']',add=1)
cmds.bezierAnchorState(sm=1)
cmds.select(str_curN)
def changeSelSmooth(arg):
cmds.bezierAnchorState(sm=1)
def changeNurbs(arg):
cmds.bezierCurveToNurbs( )
#window
if cmds.window('curveTrail', ex=1):
cmds.deleteUI('curveTrail')
cmds.window('curveTrail',title='curveTrail')
cmds.columnLayout()
cmds.button(l='Curve',c=createCurve,w=100)
cmds.button(l='Nur to Bez',c=changeBezier,w=100)
cmds.setParent('..')
cmds.rowLayout(nc=2)
cmds.button(l='All Smooth',c=changeAllSmooth,w=100,bgc=(0.2,0.2,0.2))
cmds.button(l='Sel Smooth',c=changeSelSmooth,w=100,bgc=(0.8,0.8,0.8))
cmds.setParent('..')
cmds.button(l='Bez to Nur',c=changeNurbs,w=100)
cmds.showWindow()
●Curveボタン
選択しているオブジェクトのアニメーションに沿った次数1のNurbs curveを作ります。
●Nur to Bez
選択しているNurbs curveをBezier curveに変換します。
●Sel smooth
Bezier curveの選択したcvに対してsmoothをかけます。
●All smooth
選択しているBezier curveにsmoothをかけます。
●Bez to Nur
選択しているBezier curveをNurbs curveに変換します。
※ナーブスカーブをベジェカーブに変換したり、ベジェカーブにスムースをかけたりするボタンがある理由
次数1のナーブスカーブでは、動きの速いオブジェクトだとカーブがカクカクしてしまいます。
カーブを滑らかにするために次数を上げればいいのですが、次数を上げるとカーブがオブジェクトの軌跡を外れてしまいます。
なので軌跡を外れずにカーブを滑らかにするために、一旦ベジェカーブにしてからカーブを滑らかにできるようにしました。
ただ、ナーブスのCV全部にスムースをかけてしまうと、バウンシングボールのようなアニメーションの時の接地部分でカーブが変になってしまいます。そのため、滑らかにしたいCVに対してだけスムースをかけられるように「Sel smooth」ボタンを作りました。
次数1のカーブはカクカク |
理想 |
CV全部にスムースをかけた場合 |
●スクリプト(python)
#make nurbs curve of select object's animation
import maya.cmds as cmds
def createCurve(arg):
sel = cmds.ls(sl=1)
staF = cmds.playbackOptions(q=1,min=1)
endF = cmds.playbackOptions(q=1,max=1)
allF = range(staF+1,endF+1)
cmds.currentTime(staF)
locStaF = cmds.xform(sel,q=1,ws=1,t=1)
cmds.curve(d=1,p=locStaF)
curN = cmds.ls(sl=1)
for i in allF:
cmds.currentTime(i)
loc = cmds.xform(sel,q=1,ws=1,t=1)
cmds.curve(curN,a=1,p=loc)
def changeBezier(arg):
cmds.nurbsCurveToBezier( )
def changeAllSmooth(arg):
curN = cmds.ls(sl=1)
str_curN = str(curN).replace("[u'",'').replace("']",'')
degs = cmds.getAttr( '.degree' )
spans = cmds.getAttr( '.spans' )
cvs = degs+spans
cvs_step3 = range(0,cvs,3)
cvs_step3.pop(0)
cmds.select(str_curN + '.cv[0]')
for i in cvs_step3:
cmds.select(str_curN + '.cv[' + str(i) + ']',add=1)
cmds.bezierAnchorState(sm=1)
cmds.select(str_curN)
def changeSelSmooth(arg):
cmds.bezierAnchorState(sm=1)
def changeNurbs(arg):
cmds.bezierCurveToNurbs( )
#window
if cmds.window('curveTrail', ex=1):
cmds.deleteUI('curveTrail')
cmds.window('curveTrail',title='curveTrail')
cmds.columnLayout()
cmds.button(l='Curve',c=createCurve,w=100)
cmds.button(l='Nur to Bez',c=changeBezier,w=100)
cmds.setParent('..')
cmds.rowLayout(nc=2)
cmds.button(l='All Smooth',c=changeAllSmooth,w=100,bgc=(0.2,0.2,0.2))
cmds.button(l='Sel Smooth',c=changeSelSmooth,w=100,bgc=(0.8,0.8,0.8))
cmds.setParent('..')
cmds.button(l='Bez to Nur',c=changeNurbs,w=100)
cmds.showWindow()
登録:
投稿 (Atom)