nurbsCurveをアニメーションさせたいなぁと
CV数が一致してたらCVにキーフレームを打ってしまってお終いなのですが、
任意のCV数同士のカーブをうまい事アニメーションさせたい。
別件で気づいた
別のことやってて気づいたのですが、
nurbsCurveのloftってCV数違ってもつながってくれるんですよね。
format = CVs で実行
イイ感じに増やしてくれてるなぁ
loftに頼る
loftに頼ってみよう
- キーポーズのカーブを定義
- カーブ同士をloftでつなげる(rebuild)
- キーポーズと同一の場所のCVを取得
- アニメーション
こんな流れでできるか?
キーポーズのカーブを定義
カーブ同士を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)
キーポーズと同一の場所の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 で出来ました。
ん?
ここアニメーションさせればよくない?
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)
わーい アニメーションできました