Una volta impostata la scena e la camera abbiamo bisogno di un contenitore generico che possegga i metodi classici per inserire gli oggetti nel nostro mondo. Questo viene chiamato DisplayObject3D
e, al pari del suo similare bidimensionale, gestisce tutte le funzionalitàà di base per spostare, traslare e ruotare un oggetto. Lo possiamo trovare nel package org.papervision3d.objects
.
Il costruttore di DisplayObject3D
public function DisplayObject3D( name:String, geometry:GeometryObject3D, initObject:Object)
Parametro | Tipo | Val. default | Descrizione |
---|---|---|---|
name | String | null | Nome dell'oggetto |
geometry | GeometryObject3D | null | Definizione geometrica di un modello: punti, facce, materiali, etc. |
initObject | Object | null | Un oggetto che può essere utile per definire proprietà aggiuntive |
Non è molto frequente istanziare variabili DisplayObject3D
, possiamo considerarlo alla stregua di un movieclip vuoto. Può essere utile ad esempio per stabilire il target della telecamera.
Eccone le principali proprietà:
Proprietà | Descrizione |
---|---|
container | fa riferimento alla viewport che contiene l'oggetto |
parentContainer | l'oggetto contenitore |
x, y e z | per i movimenti nello spazio |
rotationX, rotationY e rotationZ | per ruotare l'angolazione |
scale, scaleX, scaleY, scaleZ | per ridimensionare l'oggetto |
visible | rende visibile o invisibile un oggetto |
parent | ritorna l'oggetto contenitore (DisplayObjectContainer3D ) |
Tra i metodi a disposizione abbiamo:
Metodo | Descrizione |
---|---|
addGeometry(GeometryObject3D) | aggiunge una definizione di geometria all'istanza |
copyPosition() | copia le coordinate dell'oggetto |
copyTransform() | copia le trasformazioni applicate all'oggetto |
distanceTo(DisplayObject3D):Number | calcola la distanza dell'oggetto a |
hitTestObject(DisplayObject3D) | verifica la collisione con un altro oggetto |
lookAt(DisplayObject3D) | vincola la rotazione nella direzione di un altro oggetto |
moveBackward(Number), moveDown(Number), moveForward(Number), moveLeft(Number),moveRight(Number) |
muove l'oggetto in funzione alla sua direzione |
pitch(Number), yaw(Number) | ruota l'oggetto |
translate() | trasla l'oggetto |
tra i metodi estesi da DisplayObjectContainer3D abbiamo:
Metodo | Descrizione |
---|---|
addChild(DisplayObject3D) | aggiunge aggiunge un oggetto come figlio |
removeChild(DisplayObject3D) | rimuove un oggetto figlio |
In genere risulta più funzionale usare le classi che estendono DisplayObject3D
e che ne rendono più facilmente fruibile la gestione, come le primitive e le classi per importare modelli, tutte racchiuse sempre nel package objects
.
Aggiungere un oggetto alla scena
Facciamo un esempio: se vogliamo inserire un cubo nella nostra scena, dobbiamo prima impostare la scena, poi creare un'istanza del cubo (che estende DisplayObjects3D
) ed invine inserire il cubo nella scena tramite addChild
.
var scena = new Scene3D(); var solido:Cube = new Cube( new MaterialsList({all:new ColorMaterial(0x333333)}), 100, 100, 100); scena.addChild(solido);
Oggetti materiali e risoluzione 3D
PaperVision3D ci mette a disposizione alcune "primitive", sono modelli già pronti dei più comuni solidi regolari come il cubo, la sfera, etc. Ne osserveremo le caratteristiche più avanti con maggior dettaglio.
Per ora soffermiamoci alla creazione di un parallelepipedo, possiamo definirne uno decidendone il materiale (per l'esattezza un MaterialsList
) e le dimensioni (larghezza, profondità e altezza). Oltra a ciò possiamo definire la "risouzione", ovvero il livello di dettaglio con il quale l'oggetto sarà modellato e quindi reso.
In questo come in altri casi, si stabilisce il numero di facce le superfici, definendo per ciascun asse il numero di segmenti di cui è composto. Questa caratteristica si rivela molto importante soprattutto quando lavoriamo con le ombre, come vedremo più avanti.
Cube(materials:MaterialsList, width:Number = 500, depth:Number = 500, height:Number = 500, segmentsS:int = 1, segmentsT:int = 1, segmentsH:int = 1, insideFaces:int = 0, excludeFaces:int = 0)
Infine vediamo che possiamo impostare la visibilità delle facce interne e quali sono escluse.
L'unico altro metodo della classe cube è destroy()
. Le proprietà fanno invece riferimento ai vari lati del cubo (ALL
, BACK
, BOTTOM
, FRONT
, LEFT
, NONE
, RIGHT
, TOP
).