Cách Lưu Các Cảnh 3D trong Python

Cách Lưu Các Cảnh 3D trong Python

Aspose.3D FOSS for Python cho phép bạn lưu một Scene sang bất kỳ định dạng đầu ra được hỗ trợ nào bằng một cuộc gọi Scene.save() duy nhất. Phát hiện định dạng là tự động khi bạn truyền đường dẫn tệp; đối với các tùy chọn nâng cao như đầu ra nhị phân hoặc nhúng texture, bạn cung cấp một đối tượng tùy chọn lưu đặc thù cho định dạng.

Hướng Dẫn Từng Bước

Bước 1: Cài đặt gói

Cài đặt Aspose.3D FOSS từ PyPI. Không cần thư viện gốc.

pip install aspose-3d-foss

Các phiên bản Python được hỗ trợ: 3.7, 3.8, 3.9, 3.10, 3.11, 3.12.


Bước 2: Nhập các lớp cần thiết

Tối thiểu bạn cần Scene. Chỉ nhập khẩu lớp xuất khẩu hoặc lớp tùy chọn lưu định dạng khi bạn cần hành vi không mặc định.

from aspose.threed import Scene

Đối với các tùy chọn riêng cho định dạng:

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

Bước 3: Tải một Cảnh

Tải một cảnh hiện có từ đĩa bằng cách sử dụng Scene.from_file(). Thư viện tự động phát hiện định dạng nguồn dựa trên phần mở rộng tệp. Để xây dựng một cảnh từ đầu thay vào đó, xem How to Build a Mesh in Python.

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

Ngoài ra, mở một cảnh với các tùy chọn rõ ràng qua Scene.open():

from aspose.threed import Scene

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

Bước 4: Lưu dưới dạng STL

Gọi Scene.save() với một đường dẫn .stl. Mặc định đầu ra là ASCII STL. Để ghi một binary STL (tệp nhỏ hơn, không có tiêu đề có thể đọc được bởi con người) hãy sử dụng 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)

Bước 5: Lưu dưới dạng glTF hoặc GLB

Các tệp GLTF 2.0 có thể được xuất bằng GltfExporterGltfSaveOptions. Đặt binary_mode = True để tạo một gói nhị phân .glb tự chứa; đặt binary_mode = False cho định dạng .gltf dựa trên JSON.

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

Bước 6: Lưu dưới dạng FBX

Các cảnh FBX được xuất qua FbxExporter. Sử dụng FbxSaveOptions để bật nén hoặc nhúng kết cấu vào tệp đầu ra.

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)

Bước 7: Lưu dưới dạng OBJ hoặc Collada (DAE)

Đối với OBJ và Collada, truyền đường dẫn tệp trực tiếp tới Scene.save(). Thư viện sẽ phát hiện định dạng từ phần mở rộng.

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

Các vấn đề thường gặp và cách khắc phục

Tệp đầu ra trống sau scene.save()
Điều này thường có nghĩa là nút gốc của cảnh không có nút con nào chứa hình học. Xác minh rằng mỗi nút lưới đã được gắn vào scene.root_node trước khi gọi save. Kiểm tra len(scene.root_node.child_nodes) sau khi xây dựng cảnh.

AttributeError khi xây dựng hình học lưới
Lớp Mesh lưu trữ các đỉnh dưới dạng danh sách các điểm kiểm soát nội bộ. Để biết các mẫu xây dựng lưới chi tiết, hãy tham khảo bài viết How to Build a Mesh in Python mà đề cập đến việc tạo đa giác, các phần tử đỉnh và dữ liệu UV.

GLB output is larger than expected
Binary GLB nhúng tất cả dữ liệu hình học và kết cấu.
Nếu GltfSaveOptions.flip_tex_coord_v được đặt thành True, một bước lật tọa độ bổ sung sẽ được bao gồm.
Đặt nó thành False nếu bạn không cần lật kết cấu theo trục V.

Quá trình nhập/xuất FBX vòng tròn làm mất vật liệu
Việc xuất vật liệu FBX được kiểm soát bởi FbxSaveOptions.export_legacy_material_properties. Đặt giá trị này thành True để ghi các khối vật liệu FBX tiêu chuẩn mà các công cụ của bên thứ ba có thể đọc được.

Collada DAE không bao gồm vật liệu
Đặt ColladaSaveOptions.enable_materials = True (mặc định là False) trước khi xuất.

Câu hỏi thường gặp

Các định dạng nào mà Aspose.3D FOSS cho Python có thể xuất?

Thư viện hỗ trợ xuất sang: STL, glTF 2.0 (văn bản và nhị phân GLB), FBX, OBJ, Collada (DAE) và 3MF. Phát hiện định dạng được thực hiện tự động khi bạn truyền một chuỗi đường dẫn tệp tới Scene.save(); thư viện sẽ đọc phần mở rộng để chọn bộ xuất phù hợp.

Có API xuất luồng nào tránh việc ghi vào đĩa không?

Vâng. GltfExporter.export(scene, stream, options) ghi vào bất kỳ io.BytesIO hoặc đối tượng giống tệp nào. Bạn có thể truyền bộ đệm trong bộ nhớ trực tiếp tới phản hồi web hoặc xử lý tiếp theo mà không cần chạm vào hệ thống tệp.

Làm thế nào để tôi chuyển đổi một cảnh từ định dạng này sang định dạng khác?

Tải cảnh với Scene.from_file("input.fbx") và lưu với scene.save("output.gltf"). Thư viện xử lý việc chuyển đổi trong bộ nhớ; không cần các tệp trung gian.

Tôi có thể lưu nhiều sub‑scene vào các tệp riêng biệt không?

Truy cập scene.sub_scenes để lặp qua từng sub‑scene, tạo một đối tượng Scene mới, gắn các node liên quan và gọi save() trên mỗi.

Scene.save() có ghi đè các tệp hiện có một cách im lặng không?

Vâng. Thư viện không gây ra lỗi nếu tệp đích đã tồn tại; nó sẽ ghi đè lên. Thêm kiểm tra sự tồn tại của tệp trong mã của bạn nếu bạn cần bảo vệ khỏi việc ghi đè vô tình.

Xem thêm

 Tiếng Việt