Kuinka rakentaa 3D-verkko Aspose.3D:llä Pythonissa

Kuinka rakentaa 3D-verkko Aspose.3D:llä Pythonissa

Aspose.3D FOSS for Python antaa sinun rakentaa 3D-geometrian kokonaan koodilla: ulkoista mallinnustyökalua ei tarvita. Luo Mesh, täytä se kärkipisteillä (control_points) ja kasvojen määrittelyillä (polygons), liitä valinnaisia kärkiattribuutteja, kuten normaalit, ja tallenna sitten kohtaus mihin tahansa tuettuun formaattiin.

Vaiheittainen opas

Vaihe 1: Asenna paketti

Asenna Aspose.3D FOSS PyPI:stä. Natiivisia laajennuksia tai kääntäjätyökaluketjua ei tarvita.

pip install aspose-3d-foss

Vahvista asennus:

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

Tuetut Python-versiot: 3.7, 3.8, 3.9, 3.10, 3.11, 3.12.


Vaihe 2: Luo kohtaus ja solmu

Jokaisen meshin täytyy olla koontigrafissa. Luo Scene ja lisää nimetty Node verkon säilyttämiseksi:

from aspose.threed import Scene

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

Solmun nimi säilytetään viedyssä tiedostossa, ja se on hyödyllinen virheenkorjauksessa sekä myöhemmässä hakemisessa node.get_child("triangle"):n kautta.


Vaihe 3: Luo Mesh Object

Instansioi Mesh valinnaisella kuvaavalla nimellä:

from aspose.threed.entities import Mesh

mesh = Mesh("triangle")

Verkko on aluksi tyhjä: ei kärkiä, ei polygoneja. Täytät sen seuraavissa vaiheissa.


Vaihe 4: Lisää ohjauspisteet (solmut)

Ohjauspisteet ovat kärkipisteiden sijainteja. Jokainen kärki tallennetaan Vector4(x, y, z, w), jossa w=1 ilmaisee pisteen 3D-tilassa:

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

Tärkeää: mesh.control_points palauttaa kopion sisäisestä vertex-listasta (getter suorittaa list(self._control_points)). Kutsuminen mesh.control_points.append(v) lisää kopioon, ei verkkoon, joten vertex hylätään hiljaisesti. Käytä aina mesh._control_points.append(v) vertexien lisäämiseen. Yksityisen tilan käyttäminen _control_points on tunnettu kiertotapa; käyttöliittymä saattaa muuttua kirjaston tulevassa versiossa.


Vaihe 5: Luo polygonin pinnat

Määritä pinnan topologia käyttäen kärkipisteiden indeksejä. Syötä kärkipisteiden indeksit create_polygon():lle. Kolme indeksiä tuottaa kolmion; neljä tuottaa nelikulmion:

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

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

Nelkulmioverkossa sinun tulisi antaa neljä indeksiä: mesh.create_polygon(0, 1, 2, 3).

Indeksien on oltava kelvollisia paikkoja control_points:ssä (0-pohjaisia, sallitulla alueella). Kierrejärjestys on vastapäivään ulospäin suuntautuville normaalivektoreille.


Vaihe 6: Lisää kärjen normaalit

Vertex-normaalit tallennetaan VertexElement:na, joka on liitetty verkkoon. Käytä mesh.create_element() yhdessä VertexElementType.NORMAL, MappingMode.CONTROL_POINT ja ReferenceMode.DIRECT kanssa:

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 tarkoittaa yhtä normaalia per kärki. ReferenceMode.DIRECT tarkoittaa, että normaalidata luetaan samassa järjestyksessä kuin ohjauspisteet (ei ylimääräistä indeksipuskuria).

Normaalivektorit käyttävät FVector4(x, y, z, w) yhdessä w=0 kanssa osoittamaan suuntaa eikä sijaintia. FVector4 on yksittäistarkkuuden liukulukuvektori; vertex-attribuuttitiedot VertexElementFVector alaluokissa käyttävät tätä tyyppiä.


Vaihe 7: Kiinnitä verkko solmuun ja tallenna

Lisää verkko solmuun, sitten tallenna kohtaus:

node.add_entity(mesh)

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

Täydellinen toimiva skripti (kaikki vaiheet yhdistettynä):

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

Yleiset ongelmat

IssueResolution
IndexError kohteessa create_polygonVarmista, että kaikki indeksit ovat range(len(mesh.control_points)) sisällä. Indeksit ovat 0-pohjaisia.
Mesh exports with zero verticesmesh.control_points.append(...) poistaa hiljaisesti vertexit, koska ominaisuus palauttaa kopion. Käytä sen sijaan mesh._control_points.append(...).
Normals count does not match vertex countKun käytetään MappingMode.CONTROL_POINT + ReferenceMode.DIRECT, normals.data:ssä täytyy olla tarkalleen len(control_points) merkintää.
Mesh missing from saved fileVahvista, että node.add_entity(mesh) kutsuttiin ennen scene.save(). Verkkoa, joka ei ole liitetty mihinkään solmuun, ei viedä.
Wrong winding order (face appears invisible)Vastapäivään kulkeva vertex-järjestys tuottaa ulospäin suuntautuvan normaalin. Käännä indeksijärjestys create_polygon:ssa kääntääksesi sen.
polygon_count palauttaa 0polygon_count lukee saman listan kuin polygons. Jos create_polygon ei ole kutsuttu, lista on tyhjä.
Normals appear incorrect in viewerVarmista, että kaikki normaalivektorit ovat yksikköpituuksia. Laske n / abs(n):lla tai anna ennalta normalisoidut arvot.

Usein kysytyt kysymykset

Mikä on ero Vector3 ja Vector4 välillä ohjauspisteille?

control_points tallentaa Vector4-objekteja. w-komponentti on homogeeninen koordinaatti: käytä w=1-komponenttia kärkipisteiden sijainteihin ja w=0-komponenttia suuntavektoreihin, kuten normaalivektoreihin. Vector3-komponenttia käytetään muunnoksiin (käännös, skaalaus), mutta ei geometrian tallennukseen.

Voinko rakentaa verkon nelikulmioilla kolmioiden sijaan?

Kyllä. Kutsu mesh.create_polygon(0, 1, 2, 3) neljällä indeksillä määrittääksesi nelikulmion. Jotkut tallennuskohteet (STL, 3MF) vaativat kolmioita ja muuntavat nelikulmiot automaattisesti kolmioiksi. glTF ja COLLADA säilyttävät nelikulmiot.

Kuinka lisään UV-koordinaatit?

Käytä mesh.create_element_uv(TextureMapping.DIFFUSE, MappingMode.POLYGON_VERTEX) luodaksesi VertexElementUV diffuusikanavalle, ja täytä sen data-lista Vector4-merkinnöillä. UV‑koordinaatit käyttävät x ja y; z ja w ovat tyypillisesti 0. Ensimmäisen argumentin on oltava TextureMapping‑vakio (esim. TextureMapping.DIFFUSE), joka määrittää, mihin tekstuuripaikkaan UV‑kerros kuuluu.

Tarvitseeko mesh normaalit, jotta se viedään oikein?

Ei. Normaalit ovat valinnaisia. Jos ne jätetään pois, useimmat katseluohjelmat laskevat per‑face normaalit monikulmion kiertojärjestyksestä. Selkeiden per‑vertex normaalien lisääminen tuottaa tasaisemman varjostuksen.

Voinko lisätä useita meshejä yhteen solmuun?

Kyllä. Kutsu node.add_entity(mesh) useita kertoja. Jokainen kutsu lisää uuden entiteetin node.entities:iin. Jotkut formaatit saattavat litistää useita entiteettejä yhdeksi viennissä.

Kuinka trianguloida verkko, jossa on sekoitettuja polygonityyppejä?

Kutsu mesh.triangulate() muuntaaksesi kaikki nelikulmiot ja N-gonit kolmioiksi paikallisesti. Tämä on hyödyllistä ennen tallentamista formaatteihin, jotka tukevat vain kolmioita.

 Suomi