これは Maya Advent Calendar 2020 の24日目の記事です。
Mayaで3Dモデルをレンダリングし、アイテムアイコンを作ります。
アイテムアイコンっていうのは、UIでアイテムを選択したりするときに出る小さい画像の事です。
#なんでMaya使うの?
ゲームエンジン側に撮影機能付いてればそれでいいと思います。
エンジニアがツール作る時間がなかったという理由もあるし、ある程度デザイン側で例外作るとか融通利かせられるというメリットもあったので、Mayaで撮影することになりました。
最近はUnity使ってるので、Unityに撮影ツール作っちゃってますが・・・。
##Mayaでレンダリングするメリット
イレギュラーなサイズのアイテムとか、カメラ角度を変更したいという希望に対応しやすいです。仕様変更や追加要望など、TAがいればデザイナーだけで完結するので小回りはききやすいかと思います。
最近は広告用イラストのポージングにも使ってますが、リグ呼び出してポーズ変えるのが楽だったりレイヤー分けしてレンダリング出来るので、そういうとこもメリットかと思います。(この場合は通常のBatchRender)
##Mayaを使うデメリット
ゲームエンジンの描画とは全く同一にはならないとこですかね。
アイコンって表示小さくなるので、似たような表示に出来るなら問題ないかと思います。
#どうやって作るの?
量産したいのでスクリプトでMayaを動かし、レンダリングします。
レンダリングには通常のrenderコマンドではなく、ogsRenderコマンドを使用します。
##ogsRenderとは?
http://help.autodesk.com/cloudhelp/2018/JPN/Maya-Tech-Docs/Commands/index.html
OGS はビューポート レンダラの 1 つです。
ビューポートの表示をそのまま撮影したいので使いました。背景やアルファもちゃんと抜けます。
##renderだと上手く行かなかった
前(Maya2016)はHardWare2.0がちゃんとレンダリングできなかったように思うので(うろ覚え)、ogsRenderコマンドに行きついたように記憶しています。
オリジナルのdx11Shaderを利用していたのも原因かも。
#処理の流れ
Mayaファイルを任意のスクリプトでバッチ処理するツール(Python製、今回説明は割愛)に撮影するファイル(複数)を入力
↓
下記のスクリプトでレンダリング
↓
画像加工する処理(Photoshop jsx、今回説明は割愛)
という流れで処理しています。
##コード
# -*- coding: utf-8 -*-
from maya import cmds, mel
import os
import glob
import subprocess
import renderingSetup
#OGSレンダーでレンダリングする
def capture(rendertime, renderdir, renderCam, rendername, width, height):
cmds.setAttr((renderCam + ".backgroundColor"), 0.0,0.0,0.0 ,type='float3')
cmds.setAttr("hardwareRenderingGlobals.multiSampleEnable", 1)
cmds.setAttr("hardwareRenderingGlobals.multiSampleCount", 8)
cmds.setAttr("hardwareRenderingGlobals.ssaoEnable", 0)
cmds.setAttr( "defaultRenderGlobals.currentRenderer", "mayaHardware2", type='string')
cmds.setAttr( "defaultRenderGlobals.imageFormat", 19) #bmp=20; jpg=8; TARGA=19; PNG=32
cmds.setAttr( "defaultRenderGlobals.imageFilePrefix",(renderdir + rendername), type='string')
cmds.ogsRender(camera=renderCam, w=width, h=height, f=rendertime)
print u"created."
#シーンのセットアップ
def CaptureSetup(filepath):
cmds.file(filepath,o=True)
mb = os.path.basename(filepath)
name = mb.split('.')
dir = filepath.split("scenes")
cmds.workspace(dir[0], o=True )
try:
renderingSetup.main()
except:
return
renderdir = "D:" #任意
capture(0, renderdir, 'persp', name[0], 2048, 2048)
def main(pathlist):
for filepath in pathlist:
CaptureSetup(filepath)
if __name__ == '__main__':
main()
##コードの説明
mainで入力パスをforで回す
複数一気に処理するためにパスリストを受け取っています。
ちなみにその前手の処理で、maya自体はmayabatch.exeで起動しGUIを出さないようにしています。
↓
CaptureSetupでシーンを加工
レンダリングする前に、カメラ角度を変更したり、場合によってはシェーダを差し替えたりしてモノに応じてセットアップします。
↓
Captureで撮影
ここでレンダリングしています。
hardwareRenderingGlobalsでHardWare2.0レンダラの設定をしています。
defaultRenderGlobalsでシーンに対するレンダリング設定をしています。
画像のフォーマットはdefaultRenderGlobals.imageFormatに対し番号で指定します。
https://knowledge.autodesk.com/ja/support/maya/learn-explore/caas/sfdcarticles/sfdcarticles/kA93g0000000ZzG.html
#メリークリスマス イヴ
明日はryusasさんです。