چگونه صحنه‌های سه‌بعدی را در پایتون ذخیره کنیم

چگونه صحنه‌های سه‌بعدی را در پایتون ذخیره کنیم

Aspose.3D FOSS for Python به شما امکان می‌دهد یک Scene را به هر فرمت خروجی پشتیبانی‌شده با استفاده از یک فراخوانی Scene.save() ذخیره کنید. تشخیص فرمت به‌صورت خودکار هنگام عبور مسیر فایل انجام می‌شود؛ برای گزینه‌های پیشرفته مانند خروجی باینری یا جاسازی بافت، یک شیء گزینه‌های ذخیره‌سازی مخصوص فرمت را فراهم می‌کنید.

راهنمای گام به گام

مرحله 1: نصب بسته

Aspose.3D FOSS را از PyPI نصب کنید. هیچ کتابخانه بومی مورد نیاز نیست.

pip install aspose-3d-foss

نسخه‌های پایتون پشتیبانی‌شده: 3.7، 3.8، 3.9، 3.10، 3.11، 3.12.


مرحله ۲: وارد کردن کلاس‌های مورد نیاز

حداقل به 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

مرحله ۳: بارگذاری یک صحنه

یک صحنه موجود را از دیسک با استفاده از Scene.from_file() بارگذاری کنید. کتابخانه قالب منبع را به‌صورت خودکار از پسوند فایل تشخیص می‌دهد. برای ساخت یک صحنه از ابتدا، به چگونه یک مش را در پایتون بسازیم مراجعه کنید.

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

مرحله ۴: ذخیره به 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 می‌توانند با استفاده از GltfExporter و GltfSaveOptions صادر شوند. binary_mode = True را تنظیم کنید تا یک بسته باینری .glb خودمحافظ تولید کند؛ binary_mode = False را برای فرمت .gltf مبتنی بر 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())

مرحله 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)

مرحله ۷: ذخیره به 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 رئوس را به‌عنوان یک لیست داخلی از نقاط کنترل ذخیره می‌کند. برای الگوهای دقیق ساخت مش، به مقاله How to Build a Mesh in Python مراجعه کنید که شامل ایجاد چندضلعی، عناصر راس و داده‌های UV است.

خروجی GLB بزرگتر از حد انتظار است
Binary GLB تمام داده‌های هندسه و بافت را به‌صورت درون‌خطی می‌کند. اگر GltfSaveOptions.flip_tex_coord_v روی True تنظیم شود، یک عبور اضافی برای معکوس کردن مختصات گنجانده می‌شود. اگر به معکوس‌سازی بافت محور V نیاز ندارید، آن را روی False تنظیم کنید.

دوران واردات/صادرات FBX مواد را از دست می‌دهد
صادرات مواد FBX توسط FbxSaveOptions.export_legacy_material_properties کنترل می‌شود. این را به True تنظیم کنید تا بلوک‌های استاندارد مواد FBX نوشته شوند که ابزارهای شخص ثالث می‌توانند آن را بخوانند.

Collada DAE شامل مواد نیست
ColladaSaveOptions.enable_materials = True را تنظیم کنید (به‌طور پیش‌فرض False است) قبل از صادر کردن.

سوالات متداول

کدام فرمت‌ها را Aspose.3D FOSS برای 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() به‌صورت ساکت فایل‌های موجود را بازنویسی می‌کند؟

بله. کتابخانه در صورتی که فایل هدف از قبل وجود داشته باشد خطایی ایجاد نمی‌کند؛ آن را بازنویسی می‌کند. اگر نیاز دارید از بازنویسی تصادفی جلوگیری کنید، یک بررسی وجود فایل در کد خود اضافه کنید.

همچنین ببینید

 فارسی