見出し画像

【MAYA】左右対称カメラを作成するcreate_symmetric_cameras

前回に続いてミラー時の作業事故を減らすツールです。
うまくシンメトリができていなく、後で見つけて泣くのは反対側を見ることが難しいからですよね
なのでPerspカメラを左右対称に動かしちゃえばいいじゃん!というPythonコマンドです。

見えていれば事故ることもない

syncPerspA1とsyncPerspB1というカメラを作成します。
syncPerspB1はsyncPerspA1の動きをミラーします。
ただし、syncPerspB1を操作することはできません。
syncPerspA1をメインカメラにし、syncPerspB1を横において監視しながら作業するという形になると思います。
相互に同期するのはちょっと難しそうなので諦めました。

アトリビュートの初期設定が
focalLength = 150
nearClipPlane = 1.0
になっています。

import maya.cmds as cmds #シンメトリカメラ作成 #
def setup_symmetric_cameras():
    # 既存のカメラを削除(もし必要なら)
    if cmds.objExists('syncPerspA1'): cmds.delete('syncPerspA1')
    if cmds.objExists('syncPerspB1'): cmds.delete('syncPerspB1')

    # 新たに2つのカメラを作成
    syncPerspA1 = cmds.camera(name='syncPerspA1')[0]
    syncPerspB1 = cmds.camera(name='syncPerspB1')[0]

    # カメラの初期位置を設定
    cmds.setAttr(syncPerspA1 + '.translateX', 28)
    cmds.setAttr(syncPerspA1 + '.translateY', 21)
    cmds.setAttr(syncPerspA1 + '.translateZ', 28)
    cmds.setAttr(syncPerspA1 + '.rotateX', -27.938)
    cmds.setAttr(syncPerspA1 + '.rotateY', 45)
    cmds.setAttr(syncPerspA1 + '.rotateZ', 0)
    
    cmds.setAttr(syncPerspB1 + '.translateX', -28)
    cmds.setAttr(syncPerspB1 + '.translateY', 21)
    cmds.setAttr(syncPerspB1 + '.translateZ', 28)
    cmds.setAttr(syncPerspB1 + '.rotateX', -27.938)
    cmds.setAttr(syncPerspB1 + '.rotateY', -45)
    cmds.setAttr(syncPerspB1 + '.rotateZ', 0)

    # フォーカルレングスとニアクリッププレーンを設定
    cmds.setAttr(syncPerspA1 + '.focalLength', 150)
    cmds.setAttr(syncPerspA1 + '.nearClipPlane', 1.0)
    cmds.setAttr(syncPerspB1 + '.focalLength', 150)
    cmds.setAttr(syncPerspB1 + '.nearClipPlane', 1.0)

    # syncPerspA1とsyncPerspB1の移動と回転を連動させるエクスプレッションを作成
    cmds.expression(s='syncPerspB1.translateX = -syncPerspA1.translateX', o=syncPerspB1, ae=True, uc='all')
    cmds.expression(s='syncPerspB1.translateY = syncPerspA1.translateY', o=syncPerspB1, ae=True, uc='all')
    cmds.expression(s='syncPerspB1.translateZ = syncPerspA1.translateZ', o=syncPerspB1, ae=True, uc='all')
    cmds.expression(s='syncPerspB1.rotateX = syncPerspA1.rotateX', o=syncPerspB1, ae=True, uc='all')
    cmds.expression(s='syncPerspB1.rotateY = -syncPerspA1.rotateY', o=syncPerspB1, ae=True, uc='all')
    cmds.expression(s='syncPerspB1.rotateZ = -syncPerspA1.rotateZ', o=syncPerspB1, ae=True, uc='all')

setup_symmetric_cameras()
 #ビューポートの変更と生成 #
def setup_viewports():
    # アクティブビューポートの取得
    active_panel = cmds.getPanel(withFocus=True)
    if not active_panel or not cmds.getPanel(typeOf=active_panel) == "modelPanel":
        print("アクティブなビューポートが見つかりません。")
        return

    # syncPerspA1カメラの存在確認
    if not cmds.objExists("syncPerspA1"):
        print("syncPerspA1が存在しません。")
        return
    else:
        # アクティブビューポートのカメラをsyncPerspA1に変更
        cmds.modelPanel(active_panel, edit=True, camera="syncPerspA1")

    # syncPerspB1カメラの存在確認
    if not cmds.objExists("syncPerspB1"):
        print("syncPerspB1がありません。")
        return

    # 新しいウィンドウの作成
    window = cmds.window(title="New Viewport", widthHeight=(300, 300))
    cmds.paneLayout()
    new_panel = cmds.modelPanel()
    cmds.modelPanel(new_panel, edit=True, camera="syncPerspB1")
    cmds.showWindow(window)

setup_viewports()

更新履歴
2023/12/26 カメラ生成後ビューポートの変更と生成を自動でしてくれるようにしました。

本ツールはChatGPTを使って作成しています。
AI生成のリスクを理解した上でご利用ください。


この記事が参加している募集

#AIとやってみた

27,676件

この記事が気に入ったらサポートをしてみませんか?