Pythonで3Dシーンを保存する方法

Pythonで3Dシーンを保存する方法

Aspose.3D FOSS for Python は、単一の Scene.save() 呼び出しで Scene を任意のサポートされている出力形式に保存できます。ファイルパスを渡すと形式検出は自動的に行われます。バイナリ出力やテクスチャ埋め込みなどの高度なオプションの場合は、形式固有の保存オプションオブジェクトを提供します。

ステップバイステップガイド

ステップ 1: パッケージをインストール

PyPI から Aspose.3D FOSS をインストールします。ネイティブ ライブラリは必要ありません。

pip install aspose-3d-foss

サポートされている Python バージョン: 3.7, 3.8, 3.9, 3.10, 3.11, 3.12。


ステップ 2: 必要なクラスをインポート

最低でも Scene が必要です。デフォルト以外の動作が必要な場合にのみ、フォーマット固有のエクスポーターまたは保存オプションクラスをインポートしてください。

from aspose.threed import Scene

フォーマット固有のオプション:

from aspose.threed.formats.gltf import GltfSaveOptions, GltfExporter
from aspose.threed.formats.stl import StlFormat, StlSaveOptions
from aspose.threed.formats.fbx import FbxExporter, FbxSaveOptions
from aspose.threed.formats.collada import ColladaExporter, ColladaSaveOptions

ステップ 3: シーンをロード

Scene.from_file() を使用して、ディスクから既存のシーンをロードします。ライブラリはファイル拡張子からソース形式を自動的に検出します。代わりに最初からシーンを構築するには、Pythonでメッシュを構築する方法 を参照してください。

# Load from an existing file — format auto-detected from extension
scene = Scene.from_file("input.obj")

代わりに、Scene.open() を使用して明示的なオプションでシーンを開きます:

from aspose.threed import Scene

scene = Scene()
scene.open("input.fbx")

ステップ 4: STL に保存

Scene.save().stl パスで呼び出します。デフォルトでは出力は ASCII STL です。バイナリ STL(ファイルが小さく、人が読めるヘッダーがありません)を書き込むには StlSaveOptions を使用します。

# ASCII STL — format detected from the .stl extension
scene.save("output.stl")

# Binary STL — smaller file size
from aspose.threed.formats.stl import StlFormat, StlSaveOptions

stl_format = StlFormat()
options = stl_format.create_save_options()
options.binary_mode = True
scene.save("output_binary.stl", options)

ステップ5: glTF または GLB に保存

GLTF 2.0 ファイルは GltfExporterGltfSaveOptions を使用してエクスポートできます。binary_mode = True を設定すると、自己完結型の .glb バイナリバンドルが生成されます;binary_mode = False を設定すると、JSON ベースの .gltf フォーマットになります。

import io
from aspose.threed.formats.gltf import GltfExporter, GltfSaveOptions

# Text glTF
options = GltfSaveOptions()
options.binary_mode = False
options.file_name = "output.gltf"

exporter = GltfExporter()
with open("output.gltf", "wb") as f:
    stream = io.BytesIO()
    exporter.export(scene, stream, options)
    f.write(stream.getvalue())

# Binary GLB
options_glb = GltfSaveOptions()
options_glb.binary_mode = True
options_glb.file_name = "output.glb"

stream_glb = io.BytesIO()
exporter.export(scene, stream_glb, options_glb)
with open("output.glb", "wb") as f:
    f.write(stream_glb.getvalue())

ステップ 6: FBX に保存

FBXシーンはFbxExporterを使用してエクスポートされます。FbxSaveOptionsを使用して圧縮を有効にするか、テクスチャを出力ファイルに埋め込むことができます。

from aspose.threed.formats.fbx import FbxExporter, FbxSaveOptions

options = FbxSaveOptions()
options.enable_compression = True
options.embed_textures = False  # keep textures as separate files

exporter = FbxExporter()
exporter.save(scene, "output.fbx", options)

ステップ 7: OBJ または Collada (DAE) に保存

OBJ と Collada の場合、ファイルパスを直接 Scene.save() に渡します。ライブラリは拡張子から形式を検出します。

# OBJ — format auto-detected from .obj extension
scene.save("output.obj")

# Collada DAE — with material and coordinate-system options
from aspose.threed.formats.collada import ColladaExporter, ColladaSaveOptions

options = ColladaSaveOptions()
options.enable_materials = True
options.flip_coordinate_system = False
options.indented = True

exporter = ColladaExporter()
exporter.export(scene, open("output.dae", "wb"), options)

一般的な問題と対処法

scene.save() 後の空の出力ファイル
これは通常、シーンのルートノードにジオメトリを持つ子ノードがないことを意味します。save を呼び出す前に、各メッシュノードが scene.root_node にアタッチされていることを確認してください。シーンを構築した後、len(scene.root_node.child_nodes) をチェックしてください。

AttributeError メッシュジオメトリを構築する際
Mesh クラスは頂点を内部のコントロールポイントリストとして保存します。詳細なメッシュ構築パターンについては、Pythonでメッシュを構築する方法 記事をご参照ください。この記事ではポリゴン作成、頂点要素、UV データを取り上げています。

GLB 出力が予想より大きい
Binary GLB はすべてのジオメトリとテクスチャ データをインライン化します。GltfSaveOptions.flip_tex_coord_vTrue に設定されている場合、余分な座標フリップ パスが含まれます。V 軸テクスチャ フリップが不要な場合は False に設定してください。

FBX インポート/エクスポートの往復でマテリアルが失われる
FBX マテリアルのエクスポートは FbxSaveOptions.export_legacy_material_properties によって制御されます。これを True に設定すると、サードパーティツールが読み取れる標準的な FBX マテリアルブロックが書き込まれます。

Collada DAE にはマテリアルが含まれていません
エクスポートする前に ColladaSaveOptions.enable_materials = True を設定してください(デフォルトは False です)。

よくある質問

Aspose.3D FOSS for Python がエクスポートできるフォーマットは何ですか?

このライブラリは、STL、glTF 2.0(テキストおよびバイナリGLB)、FBX、OBJ、Collada(DAE)、および3MFへのエクスポートをサポートしています。ファイルパス文字列をScene.save()に渡すと、形式検出が自動的に行われ、ライブラリは拡張子を読み取って適切なエクスポーターを選択します。

ディスクへの書き込みを回避するストリーミングエクスポートAPIはありますか?

はい。GltfExporter.export(scene, stream, options) は任意の io.BytesIO またはファイルライクオブジェクトに書き込みます。ファイルシステムに触れることなく、インメモリバッファを直接ウェブレスポンスやさらに処理に渡すことができます。

シーンをあるフォーマットから別のフォーマットに変換するにはどうすればよいですか?

Scene.from_file("input.fbx") を使用してシーンをロードし、scene.save("output.gltf") で保存します。ライブラリはメモリ内変換を処理するため、中間ファイルは必要ありません。

複数のサブシーンを別々のファイルに保存できますか?

scene.sub_scenes にアクセスして各サブシーンを反復処理し、新しい Scene オブジェクトを作成し、関連するノードを添付し、各々に対して save() を呼び出します。

Scene.save() は既存のファイルを黙って上書きしますか?

はい。ライブラリは対象ファイルがすでに存在していてもエラーを発生させず、上書きします。誤って上書きしないようにする必要がある場合は、コードにファイル存在チェックを追加してください。

参照

 日本語