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-fossDesteklenen 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 ObjLoadOptionsTü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 vectorKü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.