Finora abbiamo visto come creare delle forme primitive, per esempio cubi (Box) e sfere (Sphere), sui quali abbiamo utilizzato gli interpolatori e applicato delle skin. Ora vedremo come utilizzare le luci e i filtri di colore per rendere più accattivante e realistico l'aspetto dei nostri oggetti. Per prima cosa impareremo ad utilizzare le luci.
Prima di proseguire, è possibile scaricare i file di esempio relativi a questa parte.
La luce nel mondo di Sandy
Per una panoramica sul funzionamento delle luci in Sandy, può essere utile l'articolo "Understaning lights in Sandy", scritto dall'autore stesso di Sandy.
Possiamo riassumere che in Sandy c'è una fonte di luce di default, impostata come "infinita", ovvero con raggi di luce paralleli. La direzione e l'intensità di tale luce possono essere modificate tramite actionscript. Tale luce è bianca e i corpi 3D non sono in grado di ricreare le ombre, in quanto Sandy non prevede raytracing. Nell'oggetto World3D questa luce è posizionata sull'asse Z e con una intensità di 50 e di default non è attiva; per attivarla su di una skin dobbiamo usare il comando:
skin.setLightingEnable( true )
Abbiamo già utilizzato questa luce nella sezione relativa alle forme primitive, nell'esempio della piramide.
Direzionare la luce
La fonte di luce può essere creata utilizzando un'istanza dell'oggetto Light3D da passare come variabile alla funzione setLight()
di World 3D, in questo modo:
Listato 36. Crea la fonte di luce
var direction = new Vector(0,0,1);
var intensity = 50;
var light:Light3D = new Light3D( direction, intensity );
world.setLight( light );
Sarà possibile accedere in ogni momento a questa luce utilizzando la funzione getLight
; per cambiarne la direzione possiamo sfruttare setDirection
, che come parametro richiede un vettore. Per quanto riguarda l'intensità, possiamo variarla con la funzione setPower
, passando un valore tra 0 e 150.
Creiamo allora un esempio dove l'intensità della luce viene regolata tramite uno slider e la direzione viene invece modificata cliccando sullo stage. Per prima cosa creiamo la funzione createScene
:
Listato 37. Crea la scena con la luce
function createScene( bg:Group ):Void {
var cube:Object3D = new Box( 50, 50, 50, 'quad' );
skin = new MixedSkin( 0xF28F35, 100, 0, 0, 0 );
// Enable the default light source on the skin
skin.setLightingEnable( true );
cube.setSkin( skin );
bg.addChild( cube );
}
Notiamo come sia stato utilizzato il comando setLightingEnable
per attivare la luce sulla skin del cubo.
Realizziamo ora la funzione init()
, dove sposteremo la telecamera in modo da visualizzare il cubo in maniera consona all'analisi dell'illuminazione, e imposteremo la variabile che useremo per eseguire le modifiche alla fonte di luce:
Listato 38. Crea una telecamera che verrà spostata
function init( Void ):Void {
screen = new ClipScreen( this.createEmptyMovieClip('screen', 1), 200, 200 );
cam = new Camera3D( 800, screen );
cam.setPosition(150,200,-500);
cam.lookAt( 0, 0, 0 );
world.addCamera( cam );
light = world.getLight();
var bg:Group = new Group();
world.setRootGroup( bg );
createScene( bg );
createCoordinateSystem( bg, false, 1 );
setUpControls();
world.render();
}
La variabile light
è globale, per cui potremo accedervi da ogni gestore di eventi.
"© Petit Publications 2006" - diritti riservati