LoginSignup
0
0

maya で プレイブラストの連番出力を1からにする

Last updated at Posted at 2023-12-19

プレイブラストを何とかしたいシリーズ

表題の通りですね。

たまーにですが、連続するカットでmayaのシーン上では1fからスタートになってない場合があったり。
でも後工程の都合で1からにしたいとか

※ちなみにffmpegで連番を動画にする場合も1からスタートになっていないとうまく変換できません。

レンダリングする場合だとrenumber framesオプションでフレーム番号を振り直せるんですけどね
image.png

調べる

1からスタートにします!的なのは無さそうですね(2022

sequenceTime
シーケンス時間を使用します。
気になるのはこれ。 シーケンスタイムとは?

シーケンス時間を使用(Use Sequence Time)
オンに設定すると、プレイブラストの基準はカメラ シーケンサ(Camera Sequencer)のシーケンス時間(Sequence Time)になります(「カメラ シーケンサ(Camera Sequencer)のタイムラインと再生コントロール」も参照してください)。

はーん?

カメラ シーケンサ(Camera Sequencer)
https://help.autodesk.com/view/MAYAUL/2022/JPN/?guid=GUID-FDCA1426-D7FE-41A5-9563-5628C736BCCC

あー・・・なんか見たことある機能だな。使った事ないけど。

この部分の数字がプレイブラストの番号として扱われるのかな?
image.png

じゃぁこれをアニメーターさんに毎回必ず作っておいてもらえば問題ないですね。
ではなく

ノード自体はまぁそんな面倒な感じではなさそう。
image.png

  • カメラを指定
  • カメラにshotノードが無い場合は作成する。
  • shotノードの設定値は startFrame / endFrame と sequenceStartFrame = 1

ここでふとプレイブラストってカメラ指定できたっけ?
カメラではなく、ビューポート指定じゃぁなかったっけ?

なので

  • ビューポートを指定(カレント
  • ビューポートにセットされているカメラを取得
  • カメラにshotノードが無い場合は作成する。
  • shotノードの設定値は startFrame / endFrame と sequenceStartFrame = 1

かなぁ

実装

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

def getCurViewPanel():
    curView = omui.M3dView.active3dView()
    return OpenMayaUI.MQtUtil.fullName(int(omui.M3dView.active3dView().widget())).split("|")[-2]


def createShotNode(cameraname,shotName,timeRange):    
    shotNode = cmds.shot(shotName, startTime=timeRange[0], endTime = timeRange[1],sequenceStartTime = 1,currentCamera = cameraname)

    return shotNode

def applyPlayblaseSeq(outputPath,sequenceTime):
    start = cmds.playbackOptions(q =True, minTime=True)
    end = cmds.playbackOptions(q =True, maxTime=True)
    resolution = [
                    cmds.getAttr("defaultResolution.width"),
                    cmds.getAttr("defaultResolution.height")
                ]
            
    panel = getCurViewPanel()           
    cameraName = cmds.modelEditor(panel, q=True, camera=True)

    if sequenceTime:
        if cmds.objExists("playblastTmp"):
            cmds.delete("playblastTmp")
            
        shotNode = createShotNode(cameraName,"playblastTmp",[start,end])
    
    result = cmds.playblast(
                        filename =outputPath,
                        forceOverwrite =True,
                        format = "image",
                        compression = "png",
                        sequenceTime = sequenceTime,
                        clearCache = 1,
                        viewer = False,
                        showOrnaments =  True,
                        offScreen = True,
                        fp = 4, 
                        percent = 100,
                        quality = 100,                        
                        startTime = start,
                        endTime = end,
                        widthHeight = resolution,
                        editorPanelName = panel                        
                    )

    if sequenceTime:
        cmds.delete(shotNode)
        
outputPath = "C:/Users/kubo/Desktop/hoge/hoge"
applyPlayblaseSeq(outputPath,True)

こんなかんじかな?
一旦テストしてみる

こんなシーンで
image.png

えい
image.png

なぜにwhy?
んー・・・・
あ、理解しました。

start / end で指定しましたが、
Sequence Time上でのそのフレームを出力する
ということか

なので

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

def getCurViewPanel():
    curView = omui.M3dView.active3dView()
    return OpenMayaUI.MQtUtil.fullName(int(omui.M3dView.active3dView().widget())).split("|")[-2]


def createShotNode(cameraname,shotName,timeRange):    
    shotNode = cmds.shot(shotName, startTime=timeRange[0], endTime = timeRange[1],sequenceStartTime = 1,currentCamera = cameraname)

    return shotNode

def applyPlayblaseSeq(outputPath,sequenceTime):
    start = cmds.playbackOptions(q =True, minTime=True)
    end = cmds.playbackOptions(q =True, maxTime=True)
    resolution = [
                    cmds.getAttr("defaultResolution.width"),
                    cmds.getAttr("defaultResolution.height")
                ]
            
    panel = getCurViewPanel()           
    cameraName = cmds.modelEditor(panel, q=True, camera=True)

    if sequenceTime:
        if cmds.objExists("playblastTmp"):
            cmds.delete("playblastTmp")
            
        shotNode = createShotNode(cameraName,"playblastTmp",[start,end])
        
        #seqタイムに変換
        start = cmds.getAttr(shotNode + ".sequenceStartFrame")
        end = cmds.getAttr(shotNode + ".sequenceEndFrame")
    
    result = cmds.playblast(
                        filename =outputPath,
                        forceOverwrite =True,
                        format = "image",
                        compression = "png",
                        sequenceTime = sequenceTime,
                        clearCache = 1,
                        viewer = False,
                        showOrnaments =  True,
                        offScreen = True,
                        fp = 4, 
                        percent = 100,
                        quality = 100,                        
                        startTime = start,
                        endTime = end,
                        widthHeight = resolution,
                        editorPanelName = panel                        
                    )

    if sequenceTime:
        cmds.delete(shotNode)
        
outputPath = "C:/Users/kubo/Desktop/hoge/hoge"
applyPlayblaseSeq(outputPath,True)

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