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

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/527360db-66bc-23fe-12a7-7eecc52cedc9.png)

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

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

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

transformGeometryとは
-

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/a415373a-8d0c-10a4-8697-b17bb6493092.png)

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

過去に使った事例としては
nurbuCurveのworldSpaceをcreateにつないでも、localな結果しか受け取ってくれないので
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/af78a1f0-b240-87e9-91bf-b5ea5963406a.png)

間にtransformGeometryを挟んでソースとなるcurveのworldMatrixを与えるということをやりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/0d26b467-2129-d1d5-6680-6ad41c97ddaf.png)


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

matrix化　には　composeMatrixを使用してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/ac276625-05cf-16b5-5026-be6e98884089.png)

スケールを親コントローラーからもらってくると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/fdf56b6b-8ca1-c502-5197-fc0537275297.png)

ctrlBのスケールは1.0を維持したまま、ctrlAのスケールを見た目に反映できました。


スクリプト化
-
組むにあたり準備しないとならないのは

- ターゲットとなるcurveShapeのソースとなるshape ( 複製して、intermediate化かな）
- transformGeometry
- composeMatrix

と言ったところ。
1個めが面倒そうな感じ。

ひとまずターゲットのshapeに何もヒストリーが無い前提で実装。
duplicateでもいい気がしますが、階層してると面倒なので新規のshapeを作ってそれを流用。

```python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/b71428b9-f342-8f01-4f7a-498811a526dd.png)

あとは　諸々コネクト

```python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/1d2cc8aa-a0ef-c8bc-cea4-13426c3ae5e1.png)

課題・反省
-

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


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

https://twitter.com/cole_obrien/status/1236127237478313985?s=20&t=Kvqb4HTwZJ3gy1jmeD58Bg