![見出し画像](https://assets.st-note.com/production/uploads/images/107275402/rectangle_large_type_2_21e26714cfe73e074cf485a6c7e9d5f5.jpeg?width=800)
【MAYA】左右対称カメラを作成するcreate_symmetric_cameras
前回に続いてミラー時の作業事故を減らすツールです。
うまくシンメトリができていなく、後で見つけて泣くのは反対側を見ることが難しいからですよね
なのでPerspカメラを左右対称に動かしちゃえばいいじゃん!というPythonコマンドです。
![](https://assets.st-note.com/production/uploads/images/107276775/picture_pc_f2cd13e3cbfcb2c102a96e2261aab28d.gif?width=800)
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生成のリスクを理解した上でご利用ください。
この記事が気に入ったらサポートをしてみませんか?