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)
Leave A Comment