0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MayaAdvent Calendar 2024

Day 11

プレイブラストでレイヤー分けしたい

Posted at

プレイブラストするときに、
背景だけ キャラだけ といった具合に特定の要素だけを抜き出して書き出したいなぁと

どうするか

表示を絞るという事なので、考えられるのが

  • displayLayerを使用する。
  • 孤立表示を使用する。
  • renderSetupを使用する。

あたりかなぁと。

renderSetupを使用する
出来んことも無いですが、若干面倒なのであんまり気は進みませんね。

displayLayerを使用する
割と簡単な気はします。
が、複数のdisplayLayerに登録されている場合、displayLayerのどれかが非表示なってるとそれが適用されますね。
なので、A レイヤーの内容だけを表示させたいが、Bレイヤーにも登録されている という場合には対応しづらいですね。

孤立表示を使用する
何らかの方法で表示させたい要素を取得し、viewportの孤立表示を使用して表示を絞ります。
シーンの状態に手を加えないので、この方法が良さそうな気がします。

となると次に、
何らかの方法で表示させたい要素を取得
これをどうするかですね。

  • objectSet
  • displayLayer
  • 直指定

手っ取り早くobjectSetでやってみます。

実装

孤立表示はこのコマンドでいけそうですね。

フォーマットとかその辺は一旦固定で実装してみます。

import maya.OpenMayaUI as OpenMayaUI
import maya.api.OpenMayaUI as omui
import maya.cmds as cmds

def setIsolateView(panelName,nodes):
    cmds.isolateSelect(panelName,state = False)        
    cmds.isolateSelect(panelName,state = True)
    
    for node in nodes:
        if cmds.objExists(node):
            cmds.isolateSelect(panelName,addDagObject = node)

def playblastAsLayer(targetSet,outputPath):
    targetNodes = []
    targetNodes = cmds.sets(targetSet,q=True)

    panelName = OpenMayaUI.MQtUtil.fullName(int(omui.M3dView.active3dView().widget())).split("|")[-2]
    
    timeRange = [
                    cmds.playbackOptions(q = True, min =True),
                    cmds.playbackOptions(q = True, max=True)
                ]
    resolution =[
                    cmds.getAttr("defaultResolution.width"),
                    cmds.getAttr("defaultResolution.height")    
    ]

    setIsolateView(panelName,targetNodes)

    cmds.playblast(
                        filename = outputPath + "_"+targetSet,
                        forceOverwrite =True,
                        format = "image",
                        compression = "png",
                        sequenceTime = True,
                        clearCache = 1,
                        viewer = False,
                        showOrnaments =  True,
                        offScreen = True,
                        fp = 4, 
                        percent = 100,
                        quality = 100,                        
                        startTime = timeRange[0],
                        endTime = timeRange[1],
                        widthHeight = resolution,
                        editorPanelName = panelName,                        
                    )
    
    cmds.isolateSelect(panelName,state = False)

このようなシーンを作ってテストしてみます。

image.png

outputPath = "D:/test/images/testPlayblast/testPlayblast"
playblastAsLayer("set1",outputPath)
playblastAsLayer("set2",outputPath)

うまい事書き出せました。

image.png

んー レイヤー毎にフォルダ分けした方が使い勝手は良さそうですね。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?