UVのピボット位置を変更する

UV Editorでピボットの位置を、こんな感じで「Bounding Boxの左下に移動させたりしたいなー」っと思った事ございませんか!?

このUVのピボットの位置をPythonから変更する方法が、

ちょっとトリッキー(?)

なようですので、その方法をご紹介したいと思います!(`・ω・´)ゞ

検証

UVを移動などする前にPivotをマニュアルで移動した時に、Script Editorのログを見てみると、、、

setAttr "pPlaneShape1.uvPivot" -type double2 0.288593 0.306112 ;

このようなコマンドが実行されています。なるほど、、、Shapeに「uvPivot」というアトリビュートがあって管理しているようです。

Shape単位で情報を持っているのかなーっと思い、複数のポリゴンを選択してUVのPivotを移動してみると、、、

setAttr "pPlaneShape1.uvPivot" -type double2 0.101222 0.0688462 ;

どうやら、1つしかコマンドが実行されていませんでした。。。おそらく選択リストの1番目しか見ていない。。。?

ひとまず、これを踏まえてPythonでコードを書いていきたいと思います!(*´ω`*)b

選択の取得

今回UVを選択されている状態から始まると思いますので、「filterExpand」の方を使って取得したいと思います!

from maya import cmds

def main():
    selection = cmds.filterExpand(sm=35)
    if not selection:
        return

選択されたものがない時は、早々にreturnして終わらせます。

オブジェクト名(シェイプ名)を見つける

UVのPivotは、Shapeで管理されているので、コンポーネントの選択からシェイプを見つけ出さないといけません。今回は、簡単な文字列操作で、「.」でぶった切って頭を使いたいと思います。

from maya import cmds

def main():
    selection = cmds.filterExpand(sm=35)
    if not selection:
        return
    object = selection[0].split('.')[0]

例えば「pPlane1.map[0]」を「.」でぶった切ると「pPlane1」と「map[0]」に別れるので、これの最初のデータ「pPlane1」をオブジェクト名(シェイプ名)っとしています。

選択されたUVのBounding Box

選択されたUVのBounding Boxが欲しい場合は、座標を取得してmin、maxを探さなくても、コマンド「polyEvaluate」を使うことで簡単に取得できますのでオススメです!(*´ω`*)b

from maya import cmds

def main():
    selection = cmds.filterExpand(sm=35)
    if not selection:
        return
    object = selection[0].split('.')[0]
    boudingBox = cmds.polyEvaluate(bc2=True)

Pivotの変更

取得したデータを元に、Pivotの位置を変更してみたいと思います!以下のコードでは、Bounding Boxの左下になるようになっています。

引数を追加して、if文で分岐させてやると、もっと使い勝手がよくなると思いますので是非チャレンジしてみてください!(`・ω・´)ゞ

from maya import cmds

def main():
    selection = cmds.filterExpand(sm=35)
    if not selection:
        return
    object = selection[0].split('.')[0]
    boudingBox = cmds.polyEvaluate(bc2=True)
    cmds.setAttr(object+'.uvPivot', boudingBox[0][0], boudingBox[1][0])
選択を変更したり、移動・回転ツールなどを切り替えると、Pivotの位置が「選択されたUVの中央」に戻ってしまいます。