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」ボタンを作りました。

次数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()

0 件のコメント:

コメントを投稿