0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

MayaAdvent Calendar 2022

Day 6

nurbsCurveの見た目だけスケールさせたい

Last updated at Posted at 2022-12-05

transformノードの数値は変えずに
nurbsCurveのshapeのみをスケールさせたい。

シアー対策で jointノードにnurbsCurveをparentしているので、inverseScaleが発生している状態
親のコントローラーがスケールした際に子のコントローラーの見た目上のスケールも変化させたいなぁと。

image.png

shapeだけに任意の変形を与える・・・・

  • デフォーマーをかける
  • CVに直接数値を放り込む
  • transformGeometry

一旦 transformGeometry でやってみようかと。

transformGeometryとは

名前からするとGeometry を transform しますね。

image.png

inputGeometryにソースとなるshapeを入れて、
transformにそのshapeに対して掛けたいmatrixをいれて
その結果が outputGeometryに出てくる感じ

過去に使った事例としては
nurbuCurveのworldSpaceをcreateにつないでも、localな結果しか受け取ってくれないので
image.png

間にtransformGeometryを挟んでソースとなるcurveのworldMatrixを与えるということをやりました。
image.png

仮組

スケールだけ変化させたいので、
流れ的には
スケール値 -> matrix化 -> transformGeometry
ですかね。

matrix化 には composeMatrixを使用してみます。
image.png

スケールを親コントローラーからもらってくると
image.png

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)
    

image.png

あとは 諸々コネクト

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") で実行するとこんな結果に。

image.png

課題・反省

  • そもそもnurbsCurveをコントローラーとして使用するの飽きてきた。
  • そもそもスケールケアするの面倒なのに、見た目もケアするの大変。
  • 見た目のケアの為にノード数が結構増えるので、リグ重くなりそう。

とここまで書きましたが、
既出でしたね!

0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?