In jedem Verzeichnis, Alle fbx-Dateien Zum ASCII-Format oder BINARY-Format Es gab eine Zeit, in der ich alles auf einmal konvertieren wollte Ich habe es mit Python fbx sdk versucht.
FBX Python Bindings
Lesen Sie die offizielle Dokumentation und fügen Sie FBX Python Bindings in Ihre Umgebung ein. Installing Python FBX (2020.0.1)
Übrigens, wenn Sie die neueste Version zu diesem Zeitpunkt sehen möchten, Es scheint, dass Sie es wie folgt erreichen können. https://www.autodesk.com/products/fbx/overview -> GET FBX SDK -> FBX Python Bindings
FBX-Dateiformatkonvertierung Es scheint, dass Sie es so machen können.
Ich habe dies als Referenz verwendet
Konvertieren Sie ein beliebiges fbx-Dateiformat
from fbx import FbxManager
from fbx import FbxScene
from fbx import FbxImporter
from fbx import FbxExporter
FBX_MANAGER = FbxManager.Create()
def _get_file_fomrat(format_name):
io_plugin_registry = FBX_MANAGER.GetIOPluginRegistry()
for format_id in range(io_plugin_registry.GetWriterFormatCount()):
if io_plugin_registry.WriterIsFBX(format_id):
desc = io_plugin_registry.GetWriterFormatDescription(format_id)
if format_name in desc:
return format_id
# Default format is auto
return -1
def _convert(path, file_format_id):
scene = FbxScene.Create(FBX_MANAGER, "")
importer = FbxImporter.Create(FBX_MANAGER, "")
importer.Initialize(path, -1)
importer.Import(scene)
importer.Destroy()
exporter = FbxExporter.Create(FBX_MANAGER, "")
exporter.Initialize(path, file_format_id)
exporter.Export(scene)
exporter.Destroy()
scene.Destroy()
#Konvertieren Sie die fbx-Zieldatei in eine Binärdatei
_convert('target_fbx_file_path', _get_file_fomrat('binary'))
#Konvertieren Sie die fbx-Zieldatei in ASCII
_convert('target_fbx_file_path', _get_file_fomrat('ascii'))
Es ist sinnlos, in dasselbe Format zu konvertieren Versuchen Sie, Konvertierungen in das gewünschte Format auszuschließen.
Hier scheint inoffiziell, aber im Binärformat zu sein Da die Header-Informationen aufgelistet sind, werde ich darauf verweisen.
Überprüfen Sie, ob die optionale fbx-Datei im Binärformat vorliegt
FBX_BINARY_SIGNATURE = b"Kaydara FBX Binary \x00\x1A\x00"
FBX_BINARY_SIGNATURE_LENGTH = len(FBX_BINARY_SIGNATURE)
def _is_binary_fbx(path):
with open(path, 'rb') as file:
return file.read(FBX_BINARY_SIGNATURE_LENGTH) == FBX_BINARY_SIGNATURE
return False
Da die ersten 23 Bytes feste Binärdaten sind, Ich lese so viele Dateien wie ich brauche und vergleiche sie.
Wenn Sie dieses Urteil zu Beginn der Konvertierungsmethode setzen, Es werden nur Dateien konvertiert, die sich vom gewünschten Format unterscheiden.
def _convert(path, file_format_id, required_binary):
if _is_binary_fbx(path) != required_binary:
scene = FbxScene.Create(FBX_MANAGER, "")
importer = FbxImporter.Create(FBX_MANAGER, "")
importer.Initialize(path, -1)
importer.Import(scene)
importer.Destroy()
exporter = FbxExporter.Create(FBX_MANAGER, "")
exporter.Initialize(path, file_format_id)
exporter.Export(scene)
exporter.Destroy()
scene.Destroy()
1fbx als 1 Job konvertieren Parallelisieren Sie die Konvertierung Datei für Datei Ich werde versuchen, es zu beschleunigen.
Verwenden Sie concurrent.futures.ProcessPoolExecutor. Python 3.x-Serie ist erforderlich.
Parallelisieren und beschleunigen
import concurrent.futures
with concurrent.futures.ProcessPoolExecutor() as executor:
executor.submit(_convert, 'target_fbx_file_path', _get_file_fomrat('ascii'), false)
Ich möchte also alles in einem beliebigen Verzeichnis anvisieren os.walk.
import os
import sys
with concurrent.futures.ProcessPoolExecutor() as executor:
file_format_id = _get_file_fomrat('binary')
for root, _dirs, files in os.walk('target_directory_path'):
for filename in files:
if filename.endswith('.fbx'):
path = os.path.join(root, filename)
executor.submit(_convert, path, file_format_id, true)
Ich denke, dies hat die Stapelkonvertierung etwas schneller ermöglicht.
Die konvertierte Datei hängt von der Version des verwendeten FBX SDK ab. Es kann wie folgt angegeben werden.
from fbx import FbxSceneRenamer
# FBXVersion:Werden Sie 7500
exporter.SetFileExportVersion('FBX201600', FbxSceneRenamer.eNone)
# FBXVersion:Werden Sie 7200
exporter.SetFileExportVersion('FBX201200', FbxSceneRenamer.eNone)
Die Version, die angegeben werden kann, ist Definiert in fbxio.h Zeichenfolge vom Typ FBX_xxxx_xx_COMPATIBLE.
Zusammenfassend sieht es so aus, als ob es unten hochgeladen wurde. https://github.com/yassy0413/fbx-file-utility-python/blob/master/fbx_file_format_utility.py
Recommended Posts