Aspose.3D ile Python'da 3D Mesh Nasıl Oluşturulur

Aspose.3D ile Python'da 3D Mesh Nasıl Oluşturulur

Aspose.3D FOSS for Python, 3D geometrisini tamamen kod içinde oluşturmanıza olanak tanır: harici bir modelleme aracına ihtiyaç yoktur. Bir Mesh oluşturursunuz, onu vertex konumları (control_points) ve yüz tanımları (polygons) ile doldurursunuz, normal gibi isteğe bağlı vertex özniteliklerini ekleyebilir, ardından sahneyi desteklenen herhangi bir formata kaydedersiniz.

Adım Adım Kılavuz

Adım 1: Paketi Yükle

Aspose.3D FOSS’ı PyPI’dan kurun. Yerel uzantılar veya derleyici araç zinciri gerekmez.

pip install aspose-3d-foss

Kurulumu doğrulayın:

from aspose.threed import Scene
print("Aspose.3D FOSS ready")

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


Adım 2: Bir Sahne ve Bir Düğüm Oluşturun

Her mesh bir sahne grafiği içinde bulunmalıdır. Bir Scene oluşturun ve mesh’i tutmak için adlandırılmış bir Node ekleyin:

from aspose.threed import Scene

scene = Scene()
node = scene.root_node.create_child_node("triangle")

Düğüm adı dışa aktarılan dosyada korunur ve hata ayıklama ile daha sonraki alım için node.get_child("triangle") aracılığıyla faydalıdır.


Adım 3: Bir Mesh Nesnesi Oluştur

İsteğe bağlı bir açıklayıcı adla bir Mesh örnekleyin:

from aspose.threed.entities import Mesh

mesh = Mesh("triangle")

Mesh başlangıçta boştur: köşe yok, çokgen yok. Aşağıdaki adımlarla doldurursunuz.


Adım 4: Kontrol Noktalarını (Köşe Noktalarını) Ekle

Kontrol noktaları, köşe konumlarıdır. Her köşe, Vector4(x, y, z, w) olarak depolanır; w=1 ise 3B uzaydaki bir noktayı gösterir:

from aspose.threed.utilities import Vector4

##Vertex 0: origin
# Note: control_points returns a copy of the internal vertex list.
# Appending to the returned copy discards the vertex silently.
# Use _control_points to mutate the backing list directly.
# This is a known library limitation — a public add_control_point() API is not yet available.
mesh._control_points.append(Vector4(0.0, 0.0, 0.0, 1.0))

##Vertex 1: 1 unit along X
mesh._control_points.append(Vector4(1.0, 0.0, 0.0, 1.0))

##Vertex 2: apex
mesh._control_points.append(Vector4(0.5, 1.0, 0.0, 1.0))

print(f"Vertices added: {len(mesh.control_points)}")

Important: mesh.control_points iç vertex listesinin bir kopyasını döndürür (getter list(self._control_points) çalıştırır). mesh.control_points.append(v) çağırmak kopyaya ekler, mesh’e eklemez, bu yüzden vertex sessizce atılır. Her zaman mesh._control_points.append(v) kullanarak vertex ekleyin. _control_points aracılığıyla özel duruma erişmek bilinen bir geçici çözümdür; arayüz gelecekteki bir sürümde değişebilir.


Adım 5: Çokgen Yüzeyleri Oluştur

Yüzey topolojisini köşe indisleri kullanarak tanımlayın. Köşe indislerini create_polygon()‘ye gönderin. Üç indis bir üçgen, dört indis bir dörtgen üretir:

##Triangle: connect vertices 0 → 1 → 2
mesh.create_polygon(0, 1, 2)

print(f"Polygon count: {mesh.polygon_count}")

Bir dörtgen örgü için dört indeks geçirirsiniz: mesh.create_polygon(0, 1, 2, 3).

Dizinler control_points içinde geçerli konumlar olmalıdır (0 tabanlı, aralık içinde). Dışa bakan normaller için sarma sırası saat yönünün tersidir.


Adım 6: Vertex Normal’ları Ekle

Vertex normals, mesh’e eklenmiş bir VertexElement olarak depolanır. mesh.create_element()‘i VertexElementType.NORMAL, MappingMode.CONTROL_POINT ve ReferenceMode.DIRECT ile kullanın:

from aspose.threed.entities import VertexElementType, MappingMode, ReferenceMode, VertexElementNormal
from aspose.threed.utilities import Vector4, FVector4

##Create the normal element (returns VertexElementNormal, a VertexElementFVector subclass)
normals: VertexElementNormal = mesh.create_element(
    VertexElementType.NORMAL,
    MappingMode.CONTROL_POINT,
    ReferenceMode.DIRECT
)

##One normal per vertex: all pointing out of the XY plane (0, 0, 1)
normals.set_data([
    FVector4(0, 0, 1, 0),   # vertex 0
    FVector4(0, 0, 1, 0),   # vertex 1
    FVector4(0, 0, 1, 0),   # vertex 2
])

print("Normal layer attached.")

MappingMode.CONTROL_POINT bir köşe başına bir normal anlamına gelir. ReferenceMode.DIRECT normal verilerinin kontrol noktalarıyla aynı sırada okunduğu (ek bir indeks tamponu yok) anlamına gelir.

Normal vektörler, bir konum yerine yön göstermek için FVector4(x, y, z, w) ile w=0 kullanır. FVector4 tek duyarlıklı kayan nokta vektördür; VertexElementFVector alt sınıflarındaki vertex öznitelik verileri bu türü kullanır.


Adım 7: Mesh’i Düğüme Bağlayın ve Kaydedin

Mesh’i düğüme ekleyin, ardından sahneyi kaydedin:

node.add_entity(mesh)

scene.save("triangle.gltf")
print("Saved triangle.gltf")

Tam çalışan betik (tüm adımlar birleştirildi):

from aspose.threed import Scene
from aspose.threed.entities import Mesh, VertexElementType, MappingMode, ReferenceMode, VertexElementNormal
from aspose.threed.utilities import Vector3, Vector4, FVector4

scene = Scene()
node = scene.root_node.create_child_node("triangle")

mesh = Mesh("triangle")

##Add 3 vertices (x, y, z, w)
# Use _control_points to mutate the backing list directly (control_points returns a copy)
mesh._control_points.append(Vector4(0.0, 0.0, 0.0, 1.0))
mesh._control_points.append(Vector4(1.0, 0.0, 0.0, 1.0))
mesh._control_points.append(Vector4(0.5, 1.0, 0.0, 1.0))

##Create a triangle polygon
mesh.create_polygon(0, 1, 2)

##Add normals (create_element returns VertexElementNormal, a VertexElementFVector subclass)
normals: VertexElementNormal = mesh.create_element(VertexElementType.NORMAL, MappingMode.CONTROL_POINT, ReferenceMode.DIRECT)
normals.set_data([
    FVector4(0, 0, 1, 0),
    FVector4(0, 0, 1, 0),
    FVector4(0, 0, 1, 0),
])

node.add_entity(mesh)
scene.save("triangle.gltf")

Yaygın Sorunlar

SorunÇözüm
IndexError içinde create_polygonTüm indekslerin range(len(mesh.control_points)) içinde olduğundan emin olun. İndeksler 0 tabanlıdır.
Mesh sıfır köşe ile dışa aktarılıyormesh.control_points.append(...), özelliğin bir kopya döndürdüğü için köşeleri sessizce atar. Bunun yerine mesh._control_points.append(...) kullanın.
Normal sayısı köşe sayısıyla eşleşmiyorMappingMode.CONTROL_POINT + ReferenceMode.DIRECT kullanırken, normals.data tam olarak len(control_points) girişe sahip olmalıdır.
Mesh kaydedilen dosyada eksiknode.add_entity(mesh)‘nin scene.save()‘den önce çağrıldığını doğrulayın. Hiçbir düğüme eklenmemiş bir mesh dışa aktarılmaz.
Yanlış sarma sırası (yüzey görünmez)Saat yönünün tersine köşe sırası dışa bakan bir normal üretir. create_polygon içindeki indeks sırasını tersine çevirerek bunu tersine çevirin.
polygon_count 0 döndürürpolygon_count, polygons ile aynı listeyi okur. create_polygon çağrılmadıysa, liste boştur.
Normal’lar görüntüleyicide hatalı görünüyorTüm normal vektörlerinin birim uzunlukta olduğundan emin olun. n / abs(n) ile hesaplayın veya önceden normalleştirilmiş değerleri geçirin.

Sıkça Sorulan Sorular

Kontrol noktaları için Vector3 ve Vector4 arasındaki fark nedir?

control_points Vector4 nesnelerini depolar. w bileşeni homojen koordinattır: köşe konumları için w=1 ve normaller gibi yön vektörleri için w=0 kullanın. Vector3 dönüşümler (çevrim, ölçekleme) için kullanılır ancak geometri depolama için kullanılmaz.

Üçgenler yerine dörtgenlerle bir mesh oluşturabilir miyim?

Evet. mesh.create_polygon(0, 1, 2, 3)‘i dört indeksle çağırarak bir dörtgen tanımlayın. Bazı kaydetme hedefleri (STL, 3MF) üçgen gerektirir ve dörtgenleri otomatik olarak üçgene çevirir. glTF ve COLLADA dörtgenleri korur.

UV koordinatlarını nasıl eklerim?

mesh.create_element_uv(TextureMapping.DIFFUSE, MappingMode.POLYGON_VERTEX) kullanarak difüz kanal için bir VertexElementUV oluşturun, ardından onun data listesini Vector4 girişleriyle doldurun. UV koordinatları x ve y kullanır; z ve w genellikle 0’dır. İlk argüman bir TextureMapping sabiti (ör. TextureMapping.DIFFUSE) olmalı ve UV katmanının hangi doku yuvasına ait olduğunu belirler.

Mesh, doğru bir şekilde dışa aktarılabilmesi için normallere ihtiyaç duyuyor mu?

Hayır. Normaller isteğe bağlıdır. Atlanırsa, çoğu görüntüleyici çokgen sarma sırasından yüzey başına normalleri hesaplar. Açıkça belirlenmiş tepe başına normaller eklemek daha pürüzsüz gölgelendirme üretir.

Bir düğüme birden fazla ağ ekleyebilir miyim?

Evet. node.add_entity(mesh)‘yi birden çok kez çağırın. Her çağrı, node.entities‘ye yeni bir varlık ekler. Bazı formatlar dışa aktarırken birden çok varlığı tek bir varlık haline getirebilir.

Karışık çokgen tiplerine sahip bir ağı nasıl üçgenleştiririm?

mesh.triangulate()‘i çağırarak tüm dörtgenleri ve N‑gonları yerinde üçgenlere dönüştürün. Bu, yalnızca üçgenleri destekleyen formatlara kaydetmeden önce faydalıdır.

 Türkçe