kikki's tech note

技術ブログです。UnityやSpine、MS、Javaなど技術色々について解説しています。

MayaでPythonスクリプトを使う方法

本章では、MayaでPythonスクリプトを利用する方法について共有します。

はじめに

Mayaは、様々な3Dモデルやアニメーションを組める、3DCGソフトウェアです。
ソフトウェア単体でも制作は可能ですが、スクリプトを利用することで、高品質な制作や工数の圧縮ができます。
スクリプトとして、主に以下の2種類があります。

  • MEL(Maya Embedded Language)
  • Python

※MEL:Maya独自の言語

そこで今回、PythonスクリプトでMayaを操作してみました。

スクリプトを書くまでの準備

ソフトウェアを起動し、以下の図の囲まれたアイコンを押し、編集画面を表示します。
f:id:kikkisnrdec:20150618181325p:plain

編集画面を簡単に説明すると、

  1. Pythonスクリプト向けのタブを開く
  2. 入力欄でスクリプトを記述する
  3. スクリプトを実行する

f:id:kikkisnrdec:20150618181418p:plain

transform一括変更スクリプト

以下のスクリプトは、実行すると選択された複数のオブジェクトのtransform情報を一括で書き換えるスクリプトです。
スクリプトを実行すると、「Change Transform Explorer」ウィンドウが表示されるので、該当項目に数値を入力して「Run」を押下すると実行されます。

# -*- coding: utf-8 -*-
import maya.cmds as mc

win = mc.window(title = "Change Transform Explorer", wh = (310,300))
layout = mc.columnLayout(adjustableColumn = True)

def moveObject():
    mX = mc.textField('moveX', query=True, text=True)
    mY = mc.textField('moveY', query=True, text=True)
    mZ = mc.textField('moveZ', query=True, text=True)
    rX = mc.textField('rotateX', query=True, text=True)
    rY = mc.textField('rotateY', query=True, text=True)
    rZ = mc.textField('rotateZ', query=True, text=True)
    sX = mc.textField('scaleX', query=True, text=True)
    sY = mc.textField('scaleY', query=True, text=True)
    sZ = mc.textField('scaleZ', query=True, text=True)
    slist = mc.ls(selection=True)
    for object in slist:
        if mX:
            mc.setAttr(object + '.translateX', float(mX))
        if mY:
            mc.setAttr(object + '.translateY', float(mY))
        if mZ:
            mc.setAttr(object + '.translateZ', float(mZ))
        if rX:
            mc.setAttr(object + '.rotateX', float(rX))
        if rY:
            mc.setAttr(object + '.rotateY', float(rY))
        if rZ:
            mc.setAttr(object + '.rotateZ', float(rZ))
        if sX:
            mc.setAttr(object + '.scaleX', float(sX))
        if sY:
            mc.setAttr(object + '.scaleY', float(sY))
        if sZ:
            mc.setAttr(object + '.scaleZ', float(sZ))

mc.rowLayout(numberOfColumns = 2, columnWidth2 = (70,100))
mc.text(label = 'Move X')
mc.textField('moveX')
mc.setParent('..')
mc.rowLayout(numberOfColumns = 2, columnWidth2 = (70,100))
mc.text(label = 'Move Y')
mc.textField('moveY')
mc.setParent('..')
mc.rowLayout(numberOfColumns = 2, columnWidth2 = (70,100))
mc.text(label = 'Move Z')
mc.textField('moveZ')
mc.setParent('..')
mc.rowLayout(numberOfColumns = 2, columnWidth2 = (70,100))
mc.text(label = 'Rotate X')
mc.textField('rotateX')
mc.setParent('..')
mc.rowLayout(numberOfColumns = 2, columnWidth2 = (70,100))
mc.text(label = 'Rotate Y')
mc.textField('rotateY')
mc.setParent('..')
mc.rowLayout(numberOfColumns = 2, columnWidth2 = (70,100))
mc.text(label = 'Rotate Z')
mc.textField('rotateZ')
mc.setParent('..')
mc.rowLayout(numberOfColumns = 2, columnWidth2 = (70,100))
mc.text(label = 'Scale X')
mc.textField('scaleX')
mc.setParent('..')
mc.rowLayout(numberOfColumns = 2, columnWidth2 = (70,100))
mc.text(label = 'Scale Y')
mc.textField('scaleY')
mc.setParent('..')
mc.rowLayout(numberOfColumns = 2, columnWidth2 = (70,100))
mc.text(label = 'Scale Z')
mc.textField('scaleZ')
mc.setParent('..')
mc.separator(height = 20, style = "in")
mc.button(label = 'Run', command = 'moveObject()')
mc.separator(height = 20, style = "in")

mc.showWindow(win)

総括

Mayaで同じ作業の繰り返しをする場合には、スクリプトがあると工数やケアレスミスが減ります。
是非スクリプトを覚えて実践してみましょう。


※無断転載禁止 Copyright (C) kikkisnrdec All Rights Reserved.