Fino ad ora abbiamo visto la possibilità di creare primitive e importare modelli, ma possiamo introdurre un nuovo sistema per generare i nostri solidi, un sistema che passa per la definizione di vertice come mattone dei nostri modelli.
Il Package org.papervision3d.core.geom.renderables
ci mette a disposizione una serie di classi per la manipolazione dei vertici, linee e facce di una struttura 3D.
Vertex3D
Creiamo un nuovo oggetto vertice impostando le coordinate x
,y
e z
. Un oggetto vertice può essere molto utile, sia per memorizzare un punto all'interno di un DisplayObject3D
più facilmente rintracciabile, sia per creare o manipolare oggetti 3D.
Costruttore di Vertex3D
Vertex3D(x:Number, y:Number, z:Number)
Nel caso in cui abbiamo importato un modello dall'esterno, abbiamo la possibilità di modificare i singoli vertici. Possiamo pensare che l'oggetto 3D abbia in sé una collezione di vertici e scorrere i vari punti in un ciclo:
for each (var vertex:Vertex3D in solido.geometry.vertices) { trace (vertex.x+" "+vertex.y+" "+vertex.z); }
I vertici di un solido non sono istanze di primo grado, ma vengono richiamate dalla classe geometry
.
La classe Vertex3D
ci mette a disposizione alcuni interessanti metodi tra cui clone()
, getPosition()
e calculateNormal()
.
Line3D
Una volta definto un vertice possiamo utilizzarlo per creare strutture ed oggetti direttamente in ActionScript. Vediamo come definire una semplice linea grazie alla classe Line3D
.
Costruttore di Line3D
public function Line3D(instance:Lines3D, material:LineMaterial, size:Number, vertex0:Vertex3D, vertex1:Vertex3D)
Triangle3D
Questa classe è molto interessante perché ci consente di creare una superficie minimale, una "faccia" (o sarebbe meglio dire sfaccettatura) costituita da un triangolo.
Costruttore di Triangle3D
public function Triangle3D(do3dInstance:DisplayObject3D, vertices:Array, material:MaterialObject3D = null , uv:Array = null)
Esempio
Le tre classi si comportano in modo simile per cui faremo un solo esempio con Line3D
.
Per prima cosa creiamo un nuovo DisplayObject3D
che utilizzeremo come contenitore generico.
var Container = new DisplayObject3D("Contenitore Generico");
Successivamente dobbiamo impostare i due vertici che comporranno i punti di inizio e di fine del segmento
var v0:Vertex3D = new Vertex3D(-30, 0,0); var v1:Vertex3D = new Vertex3D(300,0,0);
Ora decidiamo il colore della nostra linea e creiamo un istanza della classe Lines3D
var lm:LineMaterial = new LineMaterial(0x8000ff,1); var lines3D:Lines3D = new Lines3D(lm,"Linea");
Infine assegniamo i due vertici così da disegnare il segmento vero e proprio e lo aggiungiamo al nostro contenitore
lines3D.addNewLine(1,v0.x,v0.y,v0.z,v1.x,v1.y,v1.z); Container.addChild(lines3D);
Ovviamente sia la linea che il contenitore possono essere modificati cambiando le solite proprietà come ad esempio
lines3D.rotationY = 45; lines3D.rotationZ = 125;