Python içinde 3D Modelleri Yükleme

Python içinde 3D Modelleri Yükleme

Aspose.3D FOSS for Python, yerel bağımlılıkları olmadan 3D dosyalarını açmak için basit bir API sunar. Bir dosyayı bir nesneye yükledikten sonra Scene nesne, düğüm hiyerarşisini gezebilir ve sahnedeki her ağ için ham geometri verilerini okuyabilirsiniz.

Adım Adım Kılavuz

Adım 1: Paketi Yükleyin

PyPI üzerinden Aspose.3D FOSS’u kurun. Ek sistem kütüphanelerine ihtiyaç yoktur.

pip install aspose-3d-foss

Desteklenen Python sürümleri: 3.7, 3.8, 3.9, 3.10, 3.11, 3.12.


Adım 2: Scene Sınıfını İçe Aktarın

Bu Scene sınıfı, tüm 3D verileri için üst düzey kapsayıcıdır. Gerekli olabilecek tüm yükleme seçeneği sınıflarıyla birlikte içe aktarın.

from aspose.threed import Scene
from aspose.threed.formats import ObjLoadOptions

Tüm genel sınıflar şunun altında bulunur aspose.threed veya alt paketlerinde (aspose.threed.entities, aspose.threed.formats, aspose.threed.utilities).


Adım 3: Bir Dosya Yükleyin

Statik Scene.from_file() metodu, desteklenen herhangi bir formatı açmak için kullanın. Kütüphane, formatı dosya uzantısından otomatik olarak algılar.

##Automatic format detection
scene = Scene.from_file("model.obj")

Alternatif olarak, bir Scene örnek oluşturun ve open(); yükleme seçeneklerini geçirmek veya hataları açıkça ele almak istediğinizde kullanışlıdır:

scene = Scene()
scene.open("model.obj")

Her iki yöntem de OBJ, STL (ikili ve ASCII), glTF 2.0 / GLB, COLLADA (DAE) ve 3MF dosyalarını destekler.


Adım 4: Scene Düğümlerini Gezin

Yüklenmiş bir sahne, … ağaçtır Node … kökünde bulunan nesneler scene.root_node. Tüm düğümleri bulmak için özyinelemeli olarak yineleyin:

from aspose.threed import Scene, Node

scene = Scene.from_file("model.obj")

def walk(node: Node, depth: int = 0) -> None:
    indent = "  " * depth
    print(f"{indent}Node: {node.name!r}")
    for child in node.child_nodes:
        walk(child, depth + 1)

walk(scene.root_node)

Her Node sıfır veya daha fazla taşıyabilir Entity nesneler (meshes, kameralar, ışıklar). Kontrol et node.entities neyin eklendiğini görmek için.


Adım 5: Vertex ve Poligon Verilerine Erişim

Bir düğümün varlığını şuna dönüştür Mesh ve kontrol noktalarını (vertex positions) ve çokgenleri (face index lists) oku:

from aspose.threed import Scene
from aspose.threed.entities import Mesh

scene = Scene.from_file("model.obj")

for node in scene.root_node.child_nodes:
    for entity in node.entities:
        if isinstance(entity, Mesh):
            mesh: Mesh = entity
            print(f"Mesh '{node.name}': "
                  f"{len(mesh.control_points)} vertices, "
                  f"{len(mesh.polygons)} polygons")

            # First vertex position
            if mesh.control_points:
                v = mesh.control_points[0]
                print(f"  First vertex: ({v.x:.4f}, {v.y:.4f}, {v.z:.4f})")

            # First polygon face (list of control-point indices)
            if mesh.polygons:
                print(f"  First polygon: {mesh.polygons[0]}")

mesh.control_points bir listedir Vector4 nesneler; x, y, z konumu ve w homojen koordinattır (genellikle 1.0).

mesh.polygons tam sayılardan oluşan listelerin bir listesidir; her iç liste bir yüz için kontrol noktası indekslerinin sıralı kümesidir.


Adım 6: Formata Özgü Yükleme Seçeneklerini Uygulayın

Bir OBJ dosyasının nasıl yorumlanacağı üzerinde ince ayarlı kontrol için, bir ObjLoadOptions örneğini scene.open():

from aspose.threed import Scene
from aspose.threed.formats import ObjLoadOptions

options = ObjLoadOptions()
options.flip_coordinate_system = True   # Convert right-hand Y-up to Z-up
options.scale = 0.01                    # Convert centimetres to metres
options.enable_materials = True         # Load .mtl material file
options.normalize_normal = True         # Normalize all normals to unit length

scene = Scene()
scene.open("model.obj", options)

STL dosyaları için eşdeğer sınıf şudur StlLoadOptions. glTF için, kullanın GltfLoadOptions. Bakınız API referansı tam bir liste için.


Yaygın Sorunlar ve Çözümler

Çağırırken FileNotFoundError Scene.from_file()

Yol, çalışma zamanında çalışma dizinine göre mutlak ya da doğru bir göreli yol olmalıdır. Kullan pathlib.Path güvenilir yollar oluşturmak için:

from pathlib import Path
from aspose.threed import Scene

path = Path(__file__).parent / "assets" / "model.obj"
scene = Scene.from_file(str(path))

mesh.polygons STL dosyası yüklendikten sonra boştur

STL dosyaları üçgenleri ham yüzeyler (facets) olarak depolar, indeksli bir ağ (mesh) olarak değil. Yükleme sonrasında, çokgenler bu yüzeylerden sentezlenir. Eğer polygons boş görünüyor, kontrol edin len(mesh.control_points); eğer sayı 3’ün katıysa, geometri indekslenmemiş biçimde depolanır ve ardışık üç köşe bir üçgen oluşturur.

Koordinat sistemi uyumsuzluğu (model döndürülmüş veya yansıtılmış görünüyor)

Farklı araçlar farklı konvansiyonlar kullanır (Y-up vs Z-up, sol el vs sağ el). Ayarla ObjLoadOptions.flip_coordinate_system = True veya kök düğümünün üzerine bir dönüş uygulayın Transform yükleme sonrasında.

AttributeError: 'NoneType' object has no attribute 'polygons'

Bir düğümün varlık listesi, ağ olmayan varlıklar (kameralar, ışıklar) içerebilir. Her zaman şununla koruyun isinstance(entity, Mesh) dönüştürmeden önce.


Sık Sorulan Sorular (SSS)

Hangi 3D formatlarını yükleyebilirim?

OBJ (Wavefront), STL (ikili ve ASCII), glTF 2.0 / GLB, COLLADA (DAE) ve 3MF. FBX dosya tokenizasyonu kısmen destekleniyor ancak tam ayrıştırma henüz tamamlanmadı.

Bir OBJ dosyasını yüklemek aynı zamanda .mtl malzemeyi?

Evet, şu zaman ObjLoadOptions.enable_materials = True (varsayılan). Kütüphane şunu arar .mtl dosyayı aynı dizinde .obj dosya. Eğer .mtl eksikse, geometri yine de yüklenir ve bir uyarı verilir.

Bir dosyayı yol yerine bayt akışından yükleyebilir miyim?

Evet. scene.open() herhangi bir dosya benzeri nesneyi bir .read() metoduyla birlikte bir dosya yolu dizesi de kabul eder. Açık bir ikili akış (örneğin,., io.BytesIO) doğrudan. Scene.from_file() yalnızca bir dosya yolu dizesi kabul eder.

Yüzey normallerini nasıl alırım?

Yükleme sonrası kontrol edin mesh.get_element(VertexElementType.NORMAL). Bu bir VertexElementNormal ki data liste, referans başına bir normal vektör içerir, … göre eşlenir mapping_mode ve reference_mode.

from aspose.threed.entities import Mesh, VertexElementType

normals = mesh.get_element(VertexElementType.NORMAL)
if normals:
    print(normals.data[0])  # First normal vector

Kütüphane, birden fazla dosyayı eşzamanlı olarak yüklemek için thread-safe mı?

Her Scene Nesne bağımsızdır. Ayrı dosyaları ayrı Scene örnekler ayrı iş parçacıklarından güvenlidir, tek bir Scene iş parçacıkları arasında harici kilitleme olmadan.

 Türkçe