مقدمه

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) این خلا را پر می‌کند. این راهنما رایج‌ترین مسیرهای تبدیل را با مثال‌های کد کامل و قابل اجرا نشان می‌دهد.


کدام فرمت‌ها توسط 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بلهبلهنمایشگرهای وب، موتورهای بازی؛ GLB نسخه باینری خودکفا است
COLLADA.daeبلهبلهوارد کردن از ابزارهای انیمیشن؛; ColladaSaveOptions پشتیبانی از خروجی
3MF.3mfبلهبلهتولید افزودنی، متادیتای چاپ غنی‌تری نسبت به STL

تشخیص قالب به‌صورت خودکار از پسوند فایل انجام می‌شود. کلاس‌های گزینه‌های مخصوص قالب (ObjLoadOptions, StlSaveOptions, GltfSaveOptions) در دسترس هستند وقتی به کنترل دقیق نیاز دارید.

نکته درباره FBX: کتابخانه شامل یک توکنایزر جزئی FBX برای وارد کردن است. استفاده از FBX برای جریان‌های کاری تبدیل در محیط تولید در این نسخه توصیه نمی‌شود؛ به‌جای آن از OBJ یا glTF به‌عنوان فرمت‌های میانی استفاده کنید.


OBJ به STL: آماده‌سازی یک مدل برای چاپ سه‌بعدی

OBJ رایج‌ترین فرمت خروجی از ابزارهای مدل‌سازی و حجاری است. STL زبان مشترک اسلایسرهای چاپ سه‌بعدی است. تبدیل بین آن‌ها با یک فراخوانی انجام می‌شود.

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‑گون باشد، صادرکننده به‌صورت خودکار قبل از نوشتن آن‌ها را مثلث‌بندی می‌کند. اگر می‌خواهید قبل از ذخیره‌سازی، مثلث‌بندی را به‌صورت صریح کنترل کنید، call 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: خروجی برای وب و موتورهای بازی

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) به نمایه متریال PBR glTF منتقل می‌شود که در آن معادل موجود است.


STL به glTF: از خروجی اسکنر یا CAD به وب

فایل‌های STL از اسکنرهای سه‌بعدی و سیستم‌های CAD ورودی‌های رایجی هستند که باید برای وب قابل مشاهده شوند. STL فقط هندسه مثلثی و هیچ داده متریالی را حمل نمی‌کند، بنابراین تبدیل آن ساده است.

from aspose.threed import Scene
from aspose.threed.formats import GltfSaveOptions

scene = Scene.from_file("scan.stl")
scene.save("scan.glb", GltfSaveOptions())

اگر STL توسط یک ابزار CAD با سیستم مختصات غیرمعمول (Z‑up در مقابل Y‑up) تولید شده باشد، می‌توانید تبدیل ریشه گره را قبل از ذخیره‌سازی بررسی و اصلاح کنید:

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 به‌صورت خودکار از the .3mf پسوند. برای کنترل صریح، یک SaveOptions نمونه‌ای که برای 3MF پیکربندی شده است.


الگوی تبدیل دسته‌ای

در عمل، وظایف تبدیل بر روی پوشه‌های حاوی فایل‌ها به‌جای فایل‌های تک‌تک عمل می‌کنند. الگوی زیر یک پوشه حاوی فایل‌های OBJ را مدیریت می‌کند و هر کدام را به GLB تبدیل می‌نماید، به‌طوری که خطای هر فایل به‌صورت جداگانه پردازش شود تا یک فایل خراب کل اجرای برنامه را متوقف نکند.

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 برای Python تبدیل فرمت را ساده می‌کند: بارگذاری با Scene.from_file,، در صورت نیاز گراف صحنه را بررسی یا اصلاح کنید، سپس با مناسب‌ترین SaveOptions. کتابخانه به‌صورت داخلی مثلث‌بندی، نرمال‌سازی مختصات و نکات خاص هر فرمت را مدیریت می‌کند.

برای دریافت فهرست کامل کلاس‌ها و متدها، به مرجع API. برای مطالعه عمیق‌تر مدل گراف صحنه (گره‌ها، مش‌ها، تبدیلات)، ببینید: