LoginSignup
2
0

mayaでnurbsCurveをアニメーションさせたい

Last updated at Posted at 2023-12-02

nurbsCurveをアニメーションさせたいなぁと

たとえば 左から右のように形状を変化させたい
image.png

CV数が一致してたらCVにキーフレームを打ってしまってお終いなのですが、
任意のCV数同士のカーブをうまい事アニメーションさせたい。

別件で気づいた

別のことやってて気づいたのですが、
nurbsCurveのloftってCV数違ってもつながってくれるんですよね。
format = CVs で実行
image.png

あれはCV数はどうやって解決してるんだろうとみてみると
image.png

イイ感じに増やしてくれてるなぁ

loftに頼る

loftに頼ってみよう

  • キーポーズのカーブを定義
  • カーブ同士をloftでつなげる(rebuild)
  • キーポーズと同一の場所のCVを取得
  • アニメーション

こんな流れでできるか?

キーポーズのカーブを定義

はい 定義
image.png

カーブ同士をloftでつなげる

curves = ["curve1","curve2","curve3"]

##loftノード作る
loftNode = cmds.createNode("loft")
cmds.setAttr(loftNode + ".degree",1)
cmds.setAttr(loftNode + ".uniform",1)
cmds.setAttr(loftNode + ".reverseSurfaceNormals",0)
cmds.setAttr(loftNode + ".autoReverse",0)

for i in range(0,len(curves)):
    sourcePlug = curves[i] + ".worldSpace[0]"
    targetPlug = loftNode + ".inputCurve["+str(i)+"]"
    cmds.connectAttr(sourcePlug,targetPlug,f =True)

ちょっと結果が判りづらいので、一時的にnurbsSurfaceを追加

curves = ["curve1","curve2","curve3"]

##出力用srf
outputSrf = cmds.createNode("transform", name = "output_srf")
cmds.createNode("nurbsSurface", name = "output_srfShape", p = outputSrf)

##loftノード作る
loftNode = cmds.createNode("loft")
cmds.connectAttr(loftNode + ".outputSurface",outputSrf + ".create")
cmds.setAttr(loftNode + ".degree",1)
cmds.setAttr(loftNode + ".uniform",1)
cmds.setAttr(loftNode + ".reverseSurfaceNormals",0)
cmds.setAttr(loftNode + ".autoReverse",0)

for i in range(0,len(curves)):
    sourcePlug = curves[i] + ".worldSpace[0]"
    targetPlug = loftNode + ".inputCurve["+str(i)+"]"
    cmds.connectAttr(sourcePlug,targetPlug,f =True)

びろーん
image.png

キーポーズと同一の場所のCVを取得

キーポーズと同一の場所のCV・・・
同一の場所・・・
うーん・・・

select -r output_srf.cv[0][29] ;
select -tgl output_srf.cv[1][29] ;
select -tgl output_srf.cv[2][29] ;

なるほど 1つ目のindexを考えれば良いか。

curves = ["curve1","curve2","curve3"]

##出力用srf
outputSrf = cmds.createNode("transform", name = "output_srf")
cmds.createNode("nurbsSurface", name = "output_srfShape", p = outputSrf)

##loftノード作る
loftNode = cmds.createNode("loft")
cmds.connectAttr(loftNode + ".outputSurface",outputSrf + ".create")
cmds.setAttr(loftNode + ".degree",1)
cmds.setAttr(loftNode + ".uniform",1)
cmds.setAttr(loftNode + ".reverseSurfaceNormals",0)
cmds.setAttr(loftNode + ".autoReverse",0)

for i in range(0,len(curves)):
    sourcePlug = curves[i] + ".worldSpace[0]"
    targetPlug = loftNode + ".inputCurve["+str(i)+"]"
    cmds.connectAttr(sourcePlug,targetPlug,f =True)

##rebuild後のCV位置を取得
sellist = om.MGlobal.getSelectionListByName(outputSrf)        
outputSrfFnShape = om.MFnNurbsSurface(sellist.getDagPath(0))
CVNum_V = outputSrfFnShape.numCVsInV
rebuildCVs = []
for i in range(0,len(curves)):
    rebuildCV = []
    for param in range(0,CVNum_V):
        position = outputSrfFnShape.cvPosition(i,param)
        rebuildCV.append([position[0],position[1],position[2]])
    rebuildCVs.append(rebuildCV)


アニメーション

アニメーションさせる為のカーブを新しく用意しなくてはならんかった。
CV数がrebuild後と一致してるカーブをどうすっかなぁ
そもそもloftしたsurfaceのカーブってどうなってんだろ?
isoparamからカーブに変換できなかったっけかー
curves > duplicate srface curves で出来ました。

なるほど
image.png

ついでになるほどノード
image.png

ん?

image.png

ここアニメーションさせればよくない?

curves = ["curve1","curve2","curve3"]

##出力用srf
outputSrf = cmds.createNode("transform", name = "output_srf")
cmds.createNode("nurbsSurface", name = "output_srfShape", p = outputSrf)

##loftノード作る
loftNode = cmds.createNode("loft")
cmds.connectAttr(loftNode + ".outputSurface",outputSrf + ".create")
cmds.setAttr(loftNode + ".degree",1)
cmds.setAttr(loftNode + ".uniform",1)
cmds.setAttr(loftNode + ".reverseSurfaceNormals",0)
cmds.setAttr(loftNode + ".autoReverse",0)

for i in range(0,len(curves)):
    sourcePlug = curves[i] + ".worldSpace[0]"
    targetPlug = loftNode + ".inputCurve["+str(i)+"]"
    cmds.connectAttr(sourcePlug,targetPlug,f =True)

##出力カーブ生成
outputCurve = cmds.createNode("transform", name = "output_cv")
cmds.createNode("nurbsCurve", name = "output_cvShape", p = outputCurve)

##curveFromSurfaceIso
isoCurve = cmds.createNode("curveFromSurfaceIso")
cmds.setAttr(isoCurve + ".isoparmDirection",1)
cmds.setAttr(isoCurve + ".relativeValue",1)
cmds.setAttr(isoCurve + ".isoparmValue",0)
cmds.connectAttr(loftNode + ".outputSurface",isoCurve + ".inputSurface")
cmds.connectAttr(isoCurve + ".outputCurve", outputCurve + ".create", f=True)

わーい アニメーションできました

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0