FBXを書き出して、UEやUnityでインポートしてデータ調整する作業が多く多く、プロジェクトによってFBXの設定が異なったりしています。

その場合はユーザープリセットを作ると便利です。プリセットを使えば、ヒューマンエラーを防いで皆同じ設定で書き出せますが、意外とこのプリセットを共有する人が少ないです。

Maya 2018以前の場合はOS Native にしないとFBXのプリセットオプションが出てこないので、プリセットファイルを作成する時だけでもいいので、OS Nativeに変更しましょう。

 

OS Nativeにして、エクスポートする時に以下の画面が出てきます。ここでプリセット保存が出来ます。

保存したFBXプリセットファイルはユーザーのmayaフォルダのFBXフォルダに残ります:

このプリセットを共有して、このFBXフォルダに入れておけば、FBXエクスポートのプリセットオプションに出てきます。

しかし、モデリング調整して、UEに持っていく、またMayaに戻って、データを調整して、またUEに持っていく。という作業も多いので、スクリプトにした方が更に正確で楽な作業が出来るから弊社ではこういうやり方をしています。

コードは単純です。
プリセットを読み込み、FBXを書き出す。
それだけです。

FBXPreset = 'プリセッのトパス'
FBXfilepath = 'fbxファイルのパス'
mel.eval('FBXLoadExportPresetFile -f "' + FBXPreset
mel.eval('FBXExport -f ' +'"'+ FBXfilepath +'" -s')

SVNやPerforce を使っているとファイルをアップした後に「読み取り専用」になったりするので、FBXエクスポートが出来なくなります。その場合はPythonで読み取り専用設定を解除してから書き出すことも出来ます:

import os
import stat
os.chmod(FBXfilepath, stat.S_IWRITE)

弊社で使っているスクリプトは参考になるかもしれないので、ここに貼っておきます。

使い方:

このコードをパイソンのファイルとして保存します。例:exportFBX.py
scripts フォルダに入れて、Maya内でimportして、実行:

import exportFBX
exportFBX.main (FBXプリセットパス, FBXフォルダ名, 語尾)

・オブジェクトは配列という前提で動いています。
・FBXプリセットパスの例:
C:\Users\myara\Documents\maya\FBX\Presets\2020.1.1\export\test.fbxexportpreset
・FBXフォルダ名:
プロジェクト内にFBXフォルダを作成するオプション。
・語尾:
ファイル名はシーン名と同じにしているので、FBXファイルに語尾を付けたい場合。

例:

import exportFBX
cmds.select('testObject')
FBXPreset = r'C:\Users\myara\Documents\maya\FBX\Presets\2020.1.1\export\test.fbxexportpreset'
exportFBX.main( FBXPreset, 'FBX', sufix='_LOD')

これで”testObject”というオブジェクトを選択してから、プロジェクトフォルダ内にFBXというフォルダを作成し、シーン名_LOD という名前でFBXを出力します。

このコードを使用された場合、好きにカスタマイズして自己責任でお願します。

#---------------------------------------------------
# Export FBX
#---------------------------------------------------
from maya import cmds, mel
import pymel.core as pm
import os
import stat
from logging import getLogger

log = getLogger('Export FBX')

def gotoBindPose(objs):
    '''Go To Bind Pose'''
    if type(objs) is not list:
        objs = [objs]
    cursel = cmds.ls(sl=1)
    for obj in objs:
        cmds.select(str(obj), r=1)
        mel.eval('gotoBindPose')
    cmds.select(cursel, r=1)

def findRelatedSkinCluster(skinObject):
    '''Returns Skin Cluster. Requires pymel'''
    skinCl = pm.mel.findRelatedSkinCluster(skinObject)
    if len(skinCl) != 0:
        return skinCl
    else:
        return None
            

def main(FBXPreset, fbxFolderName='fbx', sufix=''):
    # load FBX if necessary
    #-------------------------------------
    fbxPlugin = cmds.pluginInfo( 'fbxmaya', query=True, loaded=True)
    if fbxPlugin != True:
        try:
            cmds.loadPlugin( 'fbxmaya.mll' )
        except:
            log.error( 'FBX Plugin not found' )
            return

       
    objs = cmds.ls(sl=1)
    
    # GoTo Bind Pose
    #-------------------------------------
    for node in objs:
        skinCl = findRelatedSkinCluster(node)
        if skinCl:
            gotoBindPose(node)

    # Create FBX Folder
    #-------------------------------------
    projPath = pm.workspace.path # I had problems with cmds.workspace(q=True, rd=True). pymel version seems to be working fine.
    FBX_folderPath = os.path.join( projPath, fbxFolderName ).replace("\\","/")
    if not os.path.isdir(FBX_folderPath):
        os.mkdir(FBX_folderPath)
    
    mel.eval('FBXLoadExportPresetFile -f "' + FBXPreset.replace('\\', '/') + '"')
    
    # Get Scene File with Pymel
    filenamePath = pm.sceneName()
    filenameWithExt = filenamePath[filenamePath.rfind('/')+1:]
    filename = filenameWithExt[0:filenameWithExt.rfind(".")]
    FBXname = filename + sufix + ".fbx"
   
    # Set FBX File Path
    #-------------------------------------
    FBX_filepath = os.path.join(FBX_folderPath, FBXname).replace("\\","/")
    
    # If File exists change it to "not read only"
    #-------------------------------------
    if os.path.isfile(FBX_filepath):
        os.chmod(FBX_filepath, stat.S_IWRITE)
            
    # Export
    #-------------------------------------
    mel.eval('FBXExport -f ' +'"'+ FBX_filepath +'" -s')
    log.info(" Selected objects exported to " + FBX_filepath)def main(objs, FBXPreset, fbxFolderName='fbx', sufix=''):
    # load FBX if necessary
    #-------------------------------------
    fbxPlugin = cmds.pluginInfo( 'fbxmaya', query=True, loaded=True)
    if fbxPlugin != True:
        try:
            cmds.loadPlugin( 'fbxmaya.mll' )
        except:
            log.error( 'FBX Plugin not found' )
            return

    cmds.select(objs, r=1)
    
    # GoTo Bind Pose
    #-------------------------------------
    for node in objs:
        skinCl = findRelatedSkinCluster(node)
        if skinCl:
            gotoBindPose(node)

    # Create FBX Folder
    #-------------------------------------
    projPath = pm.workspace.path # I had problems with cmds.workspace(q=True, rd=True). pymel version seems to be working fine.
    FBX_folderPath = os.path.join( projPath, fbxFolderName ).replace("\\","/")
    if not os.path.isdir(FBX_folderPath):
        os.mkdir(FBX_folderPath)
    
    mel.eval('FBXLoadExportPresetFile -f "' + FBXPreset.replace('\\', '/' + '"')
    
    # Get Scene File with Pymel
    filenamePath = pm.sceneName()
    filenameWithExt = filenamePath[filenamePath.rfind('/')+1:]
    filename = filenameWithExt[0:filenameWithExt.rfind(".")]
    FBXname = filename + sufix + ".fbx"
   
    # Set FBX File Path
    #-------------------------------------
    FBX_filepath = os.path.join(FBX_folderPath, FBXname).replace("\\","/")
    
    # If File exists change it to "not read only"
    #-------------------------------------
    if os.path.isfile(FBX_filepath):
        os.chmod(FBX_filepath, stat.S_IWRITE)
            
    # Export
    #-------------------------------------
    mel.eval('FBXExport -f ' +'"'+ FBX_filepath +'" -s')
    log.info(" Selected objects exported to " + FBX_filepath)