Maya rendersetup メモ
Maya rendersetup メモ
業務でMayaのRendersetupを触ったが、使う機会が少なそうなので備忘録としてメモ。
rendersetupとは
概要はこの動画がわかりやすい。
display layerの後継機能。ビューポートやレンダリングでのレイヤー作成を行うことができる。
レイヤー内では、
- オブジェクトの表示・非表示
- シェーディングの変更
- attributeの変更
などの設定が可能。
Layer, Collection, Overrideの3つの要素で構成されている。
Layer
レンダリングを行う単位。
以下の情報を持つ。
- visible
ビューポート上での表示を制御するフラグ。 - renderable
バッチでのレンダリングを行うかどうかを制御するフラグ。 - collection
どのノードを対象とするかの情報を持つrendersetupの要素。(後述)
Collection
レイヤー内でのレンダリング対象を指定する。
以下の情報を持つ。
- selector
対象となるノードを指定する要素。outlinerと同じように表記することで対象を指定する。 - overrides
レンダリング時のオーバーライド情報を持つ要素。(後述)
Override
selectorで設定されたcollectionの対象ノードに対して、Attributeを上書きする要素。
- absolute override
値を直接指定して上書きする。 - relative override
値を加算して上書きする。
Pythonでの操作
rendersetupを操作するためのPythonのモジュールは以下の通り。
import maya.app.renderSetup.model
現在のレンダーセットアップインスタンスを取得する。
シーン内のレンダーセットアップインスタンス。
シーンが変わると参照が切れるのでインスタンスを再度生成する必要がある。
from maya.app.renderSetup.model import renderSetup
rs = renderSetup.instance()
現在作成されている全てのレンダーレイヤーを取得する。
シーン内のlayerオブジェクトのリストを取得できる。
layers = rs.getRenderLayers()
masterLayerを取得する。
masterLayerとはシーン内に必ず存在するレイヤーのこと。
コレクションを持たないため、普通にレンダリングする分には意識する必要はない。
作成したレイヤーのみを利用したい場合にmasterLayerのrenderableをFalseにしたり、シーン保存前にVisibleをTrueにするなどの場合に利用することが多いのかな...?
masterLayer = rs.getDefaultRenderLayer()
masterLayerは後述のrenderableやVisibleは設定できるが、コレクションの作成などのメソッドは持たないっぽい。
レンダーレイヤーを作成する。
指定した名前でレンダーレイヤーを作成する。
layer = rs.createRenderLayer('layerName')
レイヤーに色を設定する。
rendersetup GUI 上の色を変更できる。
layer.setLabelColor("Red")
スクリプトを実行すると、レイヤーの色が変更される。
レイヤーの名前を取得する。
レイヤーオブジェクトは自身の名前を取得できる。
layer.name()
名前の変更は以下のように行う。
layer.setName("newLayerName")
レイヤーのバッチレンダリングを有効にする。
レンダリングの対象にしたい場合は、以下のように設定する。
layer.setRenderable(True)
ここの部分が有効になる。
レンダリングしたくない場合、Falseにする。
layer.setRenderable(False)
レイヤーの表示を有効にする。
ビューポートやRender Viewをどのレイヤーで表示するかを設定する。
layer.makeVisible()
ここの部分が有効になる。
Visibleとして設定できるlayerはシーン内で1つのみなので、makeVisible()を実行すると他のレイヤーはVisibleではなくなる。
レイヤーにコレクションを追加する。
レイヤーにコレクションを追加する。
collection = layer.createCollection('collectionName')
コレクションの名前を取得する。
layerと同じ。
collection.name()
collection.setName("newCollectionName")
コレクションの色を設定する。
layerと同じ。
collection.setLabelColor("Blue")
コレクションのセレクターを取得する。
selectorはコレクションに対象ノードを指定するための要素。
コレクションはセレクターと1-1の関係。
GUIでいうここの部分。
selector = collection.getSelector()
セレクターを設定する。
セレクターはどのノードを対象とするかが指定できるFilterTypeを持つ。
# 恐らく定数としてMayaAPI2.0に定義されていそう...?
# All
selector.setFilterType(0)
# Transform
selector.setFilterType(1)
# Shape
selector.setFilterType(2)
# Shader
selector.setFilterType(3)
# Light
selector.setFilterType(4)
# ShadingEngine
selector.setFilterType(5)
# Custom
selector.setFilterType(8)
selectorに文字列のパターンを指定することでフィルタがかけられる。
selector.setPattern("*")
一度設定したパターンは以下のように取得できる。
selector.getPattern()
コレクションにオーバーライドを追加する。
コレクションにオーバーライドを追加する。
# absolute override
dummy_shape = cmds.createNode("mesh", name="dummy_object_for_override")
override = collection.createAbsoluteOverride(dummy_shape, "primaryVisibility")
override.setAttrValue(False)
# relative override
dummy_shape2 = cmds.createNode("tramsform", name="dummy_object_for_override2")
override = collection.createRelativeOverride(dummy_shape2,"translateX")
# 値を2倍にする
override.setMultiply(2)
# -1をoffsetに設定
override.setOffset(-1)
# shader override
override = collection.createOverride('lambert',typeIDs.shaderOverride)
override.setShader('lambert1', '.outColor')
おまけ
rendersetupに限らず、情報が少ないモジュールを操作したい場合はinspectモジュールを使うとヒントがあることがある。
ないこともある。
import inspect
inspect.getmembers(layer)
# Result: [('__class__', <class 'maya.app.renderSetup.model.renderLayer.RenderLayer'>), ...
おまけ2
rendersetupを設定した後にrenderingを行う際の参考URL
- Mayaのコマンド ライン レンダラを使用したバッチレンダリング
https://polygonote.com/2019_0129_8269/ - コマンド ライン レンダラの共通フラグ
https://help.autodesk.com/view/MAYACRE/JPN/?guid=GUID-0280AB86-8ABE-4F75-B1B9-D5B7DBB7E25A - Deadline Client Applications » Command
https://docs.thinkboxsoftware.com/products/deadline/10.1/1_User Manual/manual/manual-submission.html - [Maya Python] コマンドからDeadlineにサブミットする
https://qiita.com/akasaki1211/items/b7f999ac579b06aa7cc8
Discussion