👀

Maya rendersetup メモ

2024/08/02に公開

Maya rendersetup メモ

業務でMayaのRendersetupを触ったが、使う機会が少なそうなので備忘録としてメモ。

rendersetupとは

概要はこの動画がわかりやすい。
https://www.youtube.com/watch?v=R3eROhXRfng

display layerの後継機能。ビューポートやレンダリングでのレイヤー作成を行うことができる。
レイヤー内では、

  • オブジェクトの表示・非表示
  • シェーディングの変更
  • attributeの変更
    などの設定が可能。

Layer, Collection, Overrideの3つの要素で構成されている。

Layer

レンダリングを行う単位。
以下の情報を持つ。

  • visible
    alt text
    ビューポート上での表示を制御するフラグ。
  • renderable
    alt text
    バッチでのレンダリングを行うかどうかを制御するフラグ。
  • collection
    どのノードを対象とするかの情報を持つrendersetupの要素。(後述)

Collection

レイヤー内でのレンダリング対象を指定する。
以下の情報を持つ。

  • selector
    alt text
    対象となるノードを指定する要素。outlinerと同じように表記することで対象を指定する。
  • overrides
    alt text
    レンダリング時のオーバーライド情報を持つ要素。(後述)

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')

alt text

レイヤーに色を設定する。

rendersetup GUI 上の色を変更できる。

layer.setLabelColor("Red")

スクリプトを実行すると、レイヤーの色が変更される。
alt text

レイヤーの名前を取得する。

レイヤーオブジェクトは自身の名前を取得できる。

layer.name()

名前の変更は以下のように行う。

layer.setName("newLayerName")

レイヤーのバッチレンダリングを有効にする。

レンダリングの対象にしたい場合は、以下のように設定する。

layer.setRenderable(True)

ここの部分が有効になる。
alt text
レンダリングしたくない場合、Falseにする。

layer.setRenderable(False)

レイヤーの表示を有効にする。

ビューポートやRender Viewをどのレイヤーで表示するかを設定する。

layer.makeVisible()

ここの部分が有効になる。
alt text
Visibleとして設定できるlayerはシーン内で1つのみなので、makeVisible()を実行すると他のレイヤーはVisibleではなくなる。

レイヤーにコレクションを追加する。

レイヤーにコレクションを追加する。

collection = layer.createCollection('collectionName')

コレクションの名前を取得する。

layerと同じ。

collection.name()
collection.setName("newCollectionName")

コレクションの色を設定する。

layerと同じ。

collection.setLabelColor("Blue")

コレクションのセレクターを取得する。

selectorはコレクションに対象ノードを指定するための要素。
コレクションはセレクターと1-1の関係。
GUIでいうここの部分。
alt text

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

GitHubで編集を提案

Discussion