Convertir le fichier FBX en ASCII <-> BINARY en Python

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.

environnement

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

Convertir

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'))

Vérifiez si la cible est au format binaire avant la conversion

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()

Accélérez avec plusieurs processus

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)

Marcher

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.

Spécifiez la version du fichier FBX du fichier de sortie

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.

Résumé

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

Convertir le fichier FBX en ASCII <-> BINARY en Python
Comment convertir des nombres à virgule flottante en nombres binaires en Python
Convertir Markdown en PDF en Python
Convertir l'image passée à Jason Stay Samlike en Python en ASCII Art
Convertir un fichier psd en png en Python
Convertir de Markdown en HTML en Python
Convertir une URL absolue en URL relative en Python
Convertir des fichiers écrits en python, etc. en pdf avec la coloration syntaxique
Lisez le binaire big endian en Python et convertissez-le en ndarray
Convertissez des PDF en images en masse avec Python
Résumé de la façon d'importer des fichiers dans Python 3
Dichotomie avec Python
Convertir des fichiers CSV UTF-8 pour les lire dans Excel
J'ai créé un script en python pour convertir des fichiers .md au format Scrapbox
Comment obtenir les fichiers dans le dossier [Python]
Conversion par lots de fichiers PSD du répertoire en PDF
Convertir un float exponentiel en str en Python
Recherche binaire en Python
Convertir le code de maillage cubique en WKT en Python
Convertir la date et l'heure zonées en temps Unixtime dans Python2.7
Convertir le fichier .ipynb du notebook jupyter en fichier .py exécutable python
Comment convertir / restaurer une chaîne avec [] en python
[Python] Convertit les nombres décimaux en nombres binaires, octaux et hexadécimaux
Convertir le tableau NumPy "ndarray" en lilt en Python [tolist ()]
Convertir le masque de réseau de notation CIDR en notation décimale à points en Python
Convertissez l'image au format .zip en PDF avec Python
Convertir l'API asynchrone de style callback en async / await en Python
Comment télécharger des fichiers depuis Selenium of Python dans Chrome
Comment ajouter des numéros de page à un fichier PDF (en Python)
Convertir / renvoyer des objets de classe au format JSON en Python
[Python] Création d'une méthode pour convertir la base en 1 seconde
Convertir le type d'entité Webpay en type Dict (récursivement en Python)
Convertir une chaîne hexadécimale en binaire
Pour vider stdout en Python
Convertir numpy int64 en python int
[Python] Convertir la liste en Pandas [Pandas]
Connectez-vous au site Web en Python
Recherche binaire en Python / C ++
Algorithme en Python (dichotomie)
Convertir le projet Scratch en Python
[Python] Convertir Shift_JIS en UTF-8
Convertir la notation CIDR en Python
Parler avec Python [synthèse vocale]
Comment développer en Python
Convertir le code python 3.x en python 2.x
Publier sur Slack en Python
[R] [Python] Memo pour lire plusieurs fichiers csv dans plusieurs fichiers zip
Conversion par lots de tous les fichiers xlsx du dossier en fichiers CSV
Autoriser Python à sélectionner la chaîne de caractères du fichier d'entrée dans le dossier
Convertir un fichier Excel en texte en Python à des fins de comparaison
Translocation de fichiers CSV avec Python Partie 1
Ecrire une dichotomie en Python
[Python] Comment faire PCA avec Python
Enregistrez le fichier binaire en Python
Comment collecter des images en Python
Comment utiliser SQLite en Python
Manipuler des fichiers et des dossiers en Python
Gestion des fichiers JSON en Python
Téléchargez des fichiers Google Drive en Python
Workflow pour convertir une formule (image) en python