プレイブラストするときに、
背景だけ キャラだけ といった具合に特定の要素だけを抜き出して書き出したいなぁと
どうするか
表示を絞るという事なので、考えられるのが
- 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)
このようなシーンを作ってテストしてみます。
outputPath = "D:/test/images/testPlayblast/testPlayblast"
playblastAsLayer("set1",outputPath)
playblastAsLayer("set2",outputPath)
うまい事書き出せました。
んー レイヤー毎にフォルダ分けした方が使い勝手は良さそうですね。