Dans n'importe quel répertoire, Tous les fichiers fbx Au format ASCII ou au format BINAIRE Il fut un temps où je voulais tout convertir en même temps, alors Je l'ai essayé avec python fbx sdk.
FBX Python Bindings
Reportez-vous à la documentation officielle et insérez les liaisons FBX Python dans votre environnement. Installing Python FBX (2020.0.1)
Au fait, si vous voulez voir la dernière version à ce moment-là, Il semble que vous pouvez y parvenir en procédant comme suit. https://www.autodesk.com/products/fbx/overview -> GET FBX SDK -> FBX Python Bindings
Conversion de format de fichier FBX Il semble que vous pouvez le faire comme ça.
J'ai utilisé ceci comme référence
Convertir n'importe quel format de fichier fbx
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()
#Convertir le fichier fbx cible en binaire
_convert('target_fbx_file_path', _get_file_fomrat('binary'))
#Convertir le fichier fbx cible en ASCII
_convert('target_fbx_file_path', _get_file_fomrat('ascii'))
Il est inutile de convertir au même format Essayez d'exclure les conversions au même format que vous le souhaitez.
Ici semble être non officiel mais au format binaire Puisque les informations d'en-tête sont répertoriées, je vais y faire référence.
Vérifiez si le fichier fbx facultatif est au format binaire
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
Puisque les 23 premiers octets sont des données binaires fixes, Les fichiers sont lus autant que nécessaire et comparés.
Si vous mettez ce jugement au début de la méthode de conversion, Seuls les fichiers différents du format souhaité seront convertis.
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()
Conversion de 1fbx en 1 tâche Paralléliser la conversion fichier par fichier J'essaierai de l'accélérer.
Utilisez concurrent.futures.ProcessPoolExecutor. La série python 3.x est requise.
Paralléliser et accélérer
import concurrent.futures
with concurrent.futures.ProcessPoolExecutor() as executor:
executor.submit(_convert, 'target_fbx_file_path', _get_file_fomrat('ascii'), false)
Je veux tout cibler dans n'importe quel répertoire, donc 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)
Je pense que cela a rendu la conversion par lots un peu plus rapide.
Le fichier converti dépend de la version du SDK FBX que vous utilisez, Il peut être spécifié comme suit.
from fbx import FbxSceneRenamer
# FBXVersion:Devenez 7500
exporter.SetFileExportVersion('FBX201600', FbxSceneRenamer.eNone)
# FBXVersion:Devenir 7200
exporter.SetFileExportVersion('FBX201200', FbxSceneRenamer.eNone)
La version qui peut être spécifiée est Défini dans fbxio.h Chaîne de caractères de type FBX_xxxx_xx_COMPATIBLE.
En résumé, il ressemble à celui téléchargé ci-dessous. https://github.com/yassy0413/fbx-file-utility-python/blob/master/fbx_file_format_utility.py
Recommended Posts