transformノードの数値は変えずに
nurbsCurveのshapeのみをスケールさせたい。
シアー対策で jointノードにnurbsCurveをparentしているので、inverseScaleが発生している状態
親のコントローラーがスケールした際に子のコントローラーの見た目上のスケールも変化させたいなぁと。
shapeだけに任意の変形を与える・・・・
- デフォーマーをかける
- CVに直接数値を放り込む
- transformGeometry
一旦 transformGeometry でやってみようかと。
transformGeometryとは
名前からするとGeometry を transform しますね。
inputGeometryにソースとなるshapeを入れて、
transformにそのshapeに対して掛けたいmatrixをいれて
その結果が outputGeometryに出てくる感じ
過去に使った事例としては
nurbuCurveのworldSpaceをcreateにつないでも、localな結果しか受け取ってくれないので
間にtransformGeometryを挟んでソースとなるcurveのworldMatrixを与えるということをやりました。
仮組
スケールだけ変化させたいので、
流れ的には
スケール値 -> matrix化 -> transformGeometry
ですかね。
matrix化 には composeMatrixを使用してみます。
ctrlBのスケールは1.0を維持したまま、ctrlAのスケールを見た目に反映できました。
スクリプト化
組むにあたり準備しないとならないのは
- ターゲットとなるcurveShapeのソースとなるshape ( 複製して、intermediate化かな)
- transformGeometry
- composeMatrix
と言ったところ。
1個めが面倒そうな感じ。
ひとまずターゲットのshapeに何もヒストリーが無い前提で実装。
duplicateでもいい気がしますが、階層してると面倒なので新規のshapeを作ってそれを流用。
def connectShapeScale(target):
shapes = cmds.listRelatives(target,type = "nurbsCurve")
if shapes == None:
return
orgShape = cmds.createNode("nurbsCurve")
cmds.connectAttr(shapes[0] + ".local",orgShape + ".create")
cmds.refresh()
cmds.disconnectAttr(shapes[0] + ".local",orgShape + ".create")
orgShape = cmds.rename(orgShape,shapes[0] + "Org")
tmpNode = cmds.listRelatives(orgShape, p =True)[0]
cmds.parent(orgShape,target,s =True,r=True)
cmds.delete(tmpNode)
cmds.setAttr(orgShape + ".intermediateObject", True)
あとは 諸々コネクト
def connectShapeScale(target,parentNode):
shapes = cmds.listRelatives(target,type = "nurbsCurve")
if shapes == None:
return
orgShape = cmds.createNode("nurbsCurve")
cmds.connectAttr(shapes[0] + ".local",orgShape + ".create")
cmds.refresh()
cmds.disconnectAttr(shapes[0] + ".local",orgShape + ".create")
orgShape = cmds.rename(orgShape,shapes[0] + "Org")
tmpNode = cmds.listRelatives(orgShape, p =True)[0]
cmds.parent(orgShape,target,s =True,r=True)
cmds.delete(tmpNode)
cmds.setAttr(orgShape + ".intermediateObject", True)
transGeo = cmds.createNode("transformGeometry")
composeMatrix = cmds.createNode("composeMatrix")
cmds.connectAttr(orgShape + ".local",transGeo + ".inputGeometry")
cmds.connectAttr(composeMatrix + ".outputMatrix",transGeo + ".transform")
cmds.connectAttr(parentNode + ".s",composeMatrix + ".inputScale")
cmds.connectAttr(transGeo + ".outputGeometry",shapes[0] + ".create")
connectShapeScale("ctrlB","ctrlA") で実行するとこんな結果に。
課題・反省
- そもそもnurbsCurveをコントローラーとして使用するの飽きてきた。
- そもそもスケールケアするの面倒なのに、見た目もケアするの大変。
- 見た目のケアの為にノード数が結構増えるので、リグ重くなりそう。
とここまで書きましたが、
既出でしたね!