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

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

表題の通りですね。

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

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

レンダリングする場合だとrenumber framesオプションでフレーム番号を振り直せるんですけどね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/829fa56b-56d5-6e63-69cd-a110d3d1946a.png)


調べる
-

https://help.autodesk.com/cloudhelp/2022/JPN/Maya-Tech-Docs/CommandsPython/playblast.html

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

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


https://help.autodesk.com/view/MAYAUL/2022/JPN/?guid=GUID-2D865271-2873-4EDB-82C4-7FB9D7B311E7

>シーケンス時間を使用(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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/8ff9461f-32e1-f1b5-a0f1-76d17dcb8829.png)

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

ノード自体はまぁそんな面倒な感じではなさそう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/e29a7021-18c1-4e8f-6bb5-23caa370d55e.png)

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

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

なので

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

かなぁ

実装
-

```python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/51721cea-4fe7-79bb-0dd2-5e926e9f7666.png)

えい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/c5cb232f-b5b6-caae-74ad-7e682013f499.png)

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

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

なので



```python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/5bc48d17-4e9a-c282-f7c7-237ed3510ba8.png)

はい　できました。