Ievads

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 ir dabiski piemērots šim darbam: čaulas skripti ir pārāk trausli, un pilnas DCC (digital content creation) rīku integrācijas ir pārāk smagas grupveida apstrādei. Jums vajag bibliotēku, kas spēj ielādēt jebkuru no šiem formātiem, nodrošina konsekventu ainas grafu un var izrakstīt atpakaļ uz jebkuru mērķa formātu, neprasot GUI vai grafikas draiveri.

Aspose.3D FOSS priekš Python (aspose-3d-foss, MIT licence) aizpilda šo plaisu. Šis ceļvedis parāda visbiežākos konversijas ceļus ar pilnīgiem, izpildāmiem koda piemēriem.


Kādus formātus atbalsta Aspose.3D FOSS?

FormātsExtension(s)IelādētSaglabātParasts lietošanas gadījums
Wavefront OBJ.objApmaiņa no modelēšanas rīkiem; .mtl materiālu faili atbalstīti
STL.stl3D printing, CAD export; binary and ASCII variants
glTF 2.0 / GLB.gltf, .glbTīmekļa skatītāji, spēļu dzinēji; GLB ir pašpietiekama binārā versija
COLLADA.daeImportēt no animācijas rīkiem; ColladaSaveOptions atbalsta eksportu
3MF.3mfAdītīvā ražošana, bagātāki drukas metadati nekā STL

Formāta noteikšana ir automātiska, pamatojoties uz faila paplašinājumu. Formātam specifiskas opciju klases (ObjLoadOptions, StlSaveOptions, GltfSaveOptions) ir pieejami, ja jums ir nepieciešama smalka vadība.

Piezīme par FBX: Bibliotēka ietver daļēju FBX tokenizētāju importam. FBX šajā izlaidumā nav ieteicams ražošanas konvertēšanas darbplūsmām; tā vietā izmantojiet OBJ vai glTF kā starpposma formātus.


OBJ uz STL: Modeļa sagatavošana 3D drukāšanai

OBJ ir visizplatītākais izvades formāts no modelēšanas un skulptūras rīkiem. STL ir 3D drukāšanas sliceru kopvaloda. Pārveidošana starp tiem ir viena funkcija.

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 kodē tikai trīsstūra sejas. Ja jūsu OBJ fails satur kvadrātveida vai n-gona sejas, eksportētājs tās automātiski trīsstūruveido pirms rakstīšanas. Ja vēlaties kontrolēt trīsstūruveidošanu tieši pirms saglabāšanas, izsauciet mesh.triangulate() katram mesh ainas:

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 uz glTF: Eksportēšana tīmeklim un spēļu dzinējiem

glTF 2.0 ir vēlamais apmaiņas formāts reāllaika renderētājiem, WebGL skatītājiem un spēļu dzinējiem, piemēram, Babylon.js, Three.js un Unity. GLB (binārā variante) pakotē ģeometriju, tekstūras un materiālus vienā pašpietiekamā failā, kas ir vieglāk piegādājams caur 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())

Formāts tiek noteikts no faila paplašinājuma: .gltf izveido JSON+binārā bufera pāri; .glb izveido vienas faila bināru. OBJ materiālu dati (LambertMaterial, PhongMaterial) tiek pārvadīti uz glTF PBR materiāla attēlojumu, kur pastāv ekvivalents.


STL uz glTF: No skenera vai CAD izvades uz tīmekli

STL faili no 3D skeneriem un CAD sistēmām ir bieži izmantoti ievades dati, kas jāpadara skatāmi tīmeklī. STL satur tikai trīsstūra ģeometriju un nav materiālu datu, tāpēc konvertēšana ir vienkārša.

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

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

Ja STL tika izveidots ar CAD rīku, kuram ir neparasta koordinātu sistēma (Z‑up pret Y‑up), varat pārbaudīt un koriģēt saknes mezgla transformāciju pirms saglabāšanas:

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 uz 3MF: Sagatavošana pievienošanas ražošanai

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 formāts tiek automātiski noteikts no .3mf paplašinājuma. Lai iegūtu precīzu kontroli, nododiet SaveOptions instanci, kas konfigurēta 3MF.


Masveida konvertēšanas paraugs

Praktiskā lietā konvertēšanas uzdevumi darbojas ar direktorijām, nevis ar atsevišķiem failiem. Zemāk esošais paraugs apstrādā OBJ failu mapi un konvertē katru no tiem uz GLB, ar kļūdu apstrādi katram failam, lai viens nepareizs fails neatceltu visu izpildi.

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

Šis modelis dabiski paplašinās uz citām avota/mērķa formāta pāriem: mainiet paplašinājuma filtru un SaveOptions klasi jebkurai kombinācijai atbalsta tabulā iepriekš.


Secinājums

Aspose.3D FOSS priekš Python padara formāta konvertēšanu vienkāršu: ielādējiet ar Scene.from_file, pēc izvēles pārbaudiet vai modificējiet ainas grafu, pēc tam saglabājiet ar atbilstošo SaveOptions.Bibliotēka iekšēji apstrādā trīsstūra sadalīšanu, koordinātu normalizāciju un formāta specifiskās īpatnības.

Lai iegūtu pilnu klašu un metožu sarakstu, skatiet API atsauce. Lai iegremdētos dziļāk ainas grafu modelī (mezgli, tīklu, transformācijas), skatiet: