はじめに
3D content rarely stays in a single format for its entire lifetime. A model may originate as an OBJ file exported from a modelling application, travel through a 3D printing pipeline as STL, appear in a web application as glTF, and end up in an additive manufacturing tool as 3MF. Each format serves a different audience and a different downstream tool, and conversion between them is something most 3D pipelines need to handle reliably.
Python はこの作業に自然に適しています:シェルスクリプトは脆弱すぎますし、フル DCC(デジタルコンテンツクリエーション)ツールの統合はバッチ処理には重すぎます。必要なのは、これらのフォーマットをすべて読み込み、一貫したシーングラフを提供し、GUI やグラフィックスドライバを必要とせずに任意のターゲットフォーマットへ書き出すことができるライブラリです。.
Aspose.3D FOSS Python 向け (aspose-3d-foss, MIT license) がそのギャップを埋めます。このガイドでは、最も一般的な変換パスを、完全で実行可能なコード例とともに示します。.
どのフォーマットが Aspose.3D FOSS でサポートされていますか??
| フォーマット | Extension(s) | ロード | 保存 | 一般的な使用例 |
|---|---|---|---|---|
| Wavefront OBJ | .obj | はい | はい | モデリングツールからのデータ交換; .mtl マテリアルファイルに対応 |
| STL | .stl | はい | はい | 3D printing, CAD export; binary and ASCII variants |
| glTF 2.0 / GLB | .gltf, .glb | はい | はい | Webビューア、ゲームエンジン;GLBは自己完結型のバイナリバリアントです |
| COLLADA | .dae | はい | はい | アニメーションツールからインポート;; ColladaSaveOptions エクスポートをサポート |
| 3MF | .3mf | はい | はい | 積層造形、STL よりもリッチな印刷メタデータ |
フォーマットの検出はファイル拡張子から自動的に行われます。フォーマット固有のオプションクラス (ObjLoadOptions, StlSaveOptions, GltfSaveOptions) は、細かい制御が必要なときに利用できます。.
FBX に関する注意: このライブラリにはインポート用の部分的な FBX トークナイザが含まれています。今回のリリースでは、製品変換ワークフローに FBX の使用は推奨されません。代わりに OBJ または glTF を中間フォーマットとして使用してください。.
OBJ から STL へ:3D プリント用モデルの準備
OBJ はモデリングやスカルプティングツールからの最も一般的な出力フォーマットです。STL は 3D プリント用スライサーの共通言語です。両者の変換はワンコールで行えます。.
from aspose.threed import Scene
from aspose.threed.formats import StlSaveOptions
scene = Scene.from_file("model.obj")
opts = StlSaveOptions()
scene.save("model.stl", opts)
STL は三角形の面しかエンコードしません。OBJ ファイルに四角形や n-gon の面が含まれている場合、エクスポーターは書き込む前に自動的に三角形化します。保存前に三角形化を明示的に制御したい場合は、次を呼び出してください mesh.triangulate() シーン内の各メッシュに対して:
from aspose.threed import Scene
from aspose.threed.entities import Mesh
from aspose.threed.formats import StlSaveOptions
scene = Scene.from_file("model.obj")
def triangulate_all(node):
for entity in list(node.entities):
if isinstance(entity, Mesh):
tri_mesh = entity.triangulate()
# Attach the triangulated mesh via add_entity
node.add_entity(tri_mesh)
for child in node.child_nodes:
triangulate_all(child)
triangulate_all(scene.root_node)
scene.save("model_triangulated.stl", StlSaveOptions())
OBJ から glTF へ:Web およびゲームエンジン向けエクスポート
glTF 2.0 はリアルタイムレンダラ、WebGL ビューア、Babylon.js、Three.js、Unity などのゲームエンジン向けの推奨インターチェンジフォーマットです。GLB(バイナリ版)はジオメトリ、テクスチャ、マテリアルを単一の自己完結型ファイルにパッケージ化し、HTTP で配信しやすくなります。.
from aspose.threed import Scene
from aspose.threed.formats import GltfSaveOptions
scene = Scene.from_file("model.obj")
##Save as JSON-based glTF (external buffer)
opts_gltf = GltfSaveOptions()
scene.save("model.gltf", opts_gltf)
##Save as self-contained GLB binary: preferred for web delivery
scene.save("model.glb", GltfSaveOptions())
フォーマットはファイル拡張子から推測されます: .gltf JSON とバイナリバッファのペアを生成します; .glb 単一ファイルのバイナリを生成します。OBJ のマテリアルデータ (LambertMaterial, PhongMaterial) は、同等が存在する場合、glTF PBR マテリアル表現に引き継がれます。.
STL から glTF へ:スキャナまたは CAD 出力から Web へ
3D スキャナや CAD システムからの STL ファイルは、Web で閲覧可能にする必要がある一般的な入力です。STL は三角形ジオメトリのみを保持し、マテリアルデータは含まれないため、変換はシンプルです。.
from aspose.threed import Scene
from aspose.threed.formats import GltfSaveOptions
scene = Scene.from_file("scan.stl")
scene.save("scan.glb", GltfSaveOptions())
CAD ツールが異常な座標系(Z-up と Y-up)で STL を生成した場合、保存前にルートノードの変換を確認し、修正することができます::
from aspose.threed import Scene
from aspose.threed.formats import GltfSaveOptions
scene = Scene.from_file("cad_export.stl")
##Rotate 90 degrees around X to convert Z-up to Y-up
root = scene.root_node
root.transform.set_euler_angles(-90.0, 0.0, 0.0)
scene.save("cad_export_yup.glb", GltfSaveOptions())
glTF から 3MF: 積層造形の準備
3MF is a modern 3D printing format backed by the 3MF Consortium. It supports richer metadata than STL (colour, material assignments, build instructions) and is accepted by slicer software such as PrusaSlicer and Bambu Studio. If you are delivering models from a web viewer into a printing workflow, converting GLB to 3MF is a useful step.
from aspose.threed import Scene
from aspose.threed import FileFormat
from aspose.threed.formats import SaveOptions
scene = Scene.from_file("model.glb")
scene.save("model.3mf")
3MF フォーマットは拡張子から自動的に検出されます。 .3mf 拡張子です。明示的に制御するには、 SaveOptions 3MF 用に構成されたインスタンス。.
バッチ変換パターン
実際には、変換タスクは個々のファイルではなくディレクトリ内のファイル群に対して実行されます。以下のパターンは OBJ ファイルのフォルダを処理し、各ファイルを GLB に変換します。ファイルごとのエラーハンドリングを行うため、1 つの不良ファイルが全体の実行を中断させることはありません。.
import os
from aspose.threed import Scene
from aspose.threed.formats import GltfSaveOptions
input_dir = "./obj_files"
output_dir = "./glb_files"
os.makedirs(output_dir, exist_ok=True)
opts = GltfSaveOptions()
results = {"ok": [], "failed": []}
for filename in os.listdir(input_dir):
if not filename.lower().endswith(".obj"):
continue
src = os.path.join(input_dir, filename)
stem = os.path.splitext(filename)[0]
dst = os.path.join(output_dir, stem + ".glb")
try:
scene = Scene.from_file(src)
scene.save(dst, opts)
results["ok"].append(filename)
print(f"OK {filename} -> {stem}.glb")
except Exception as exc:
results["failed"].append((filename, str(exc)))
print(f"ERR {filename}: {exc}")
print(f"\n{len(results['ok'])} converted, {len(results['failed'])} failed.")
if results["failed"]:
for name, reason in results["failed"]:
print(f" {name}: {reason}")
このパターンは他のソース/ターゲット フォーマット ペアにも自然に拡張されます: 拡張子フィルタと SaveOptions 上記のサポート表にある任意の組み合わせのクラス。.
結論
Aspose.3D FOSS for Python は、フォーマット変換をシンプルにします: load with Scene.from_file,、オプションでシーン グラフを検査または変更し、適切な SaveOptions.。ライブラリは内部で三角形化、座標正規化、フォーマット固有の挙動を処理します。.
クラスとメソッドの完全な一覧については、 API リファレンス. シーン グラフモデル(ノード、メッシュ、トランスフォーム)についてさらに詳しく知りたい場合は、以下をご参照ください::
- クラス Scene: ロード、保存、シーンレベルのメタデータ
- クラス Node: 階層、トランスフォーム、エンティティのアタッチ
- クラス Mesh: 頂点データ、ポリゴン、頂点要素
- Python で 3D モデルをロードする方法
- PyPI: aspose-3d-foss