Papervision 3D - La mia Guida - parte 3 - Le luci

Autorer: admin
10 Ottobre 2008

Andiamo avanti con la guida, cerchiamo ora di aggiungere un altro importante elemento del mondo 3D: le luci. L’utilizzo delle luci dà ovviamente una maggiore sensazione di realismo alla scena. Inoltre cominceremo a trattare dei MATERIALI che sono necessari per vedere l’effetto luce (con le gabbie WireframeMaterial non sarebbe possibile). Per una più esaustiva trattazione riguardante i materiali consiglio leggere questo articolo in inglese del sempre ben informato John Lindquist.

Il risultato che si vuole raggiungere è questo:

L’interazione col mouse è una semplice aggiunta, ma non è un tema che tratteremo in questo tutorial. Mentre è importante presentare la classe PointLight3D, che costruisce una fonte luminosa, vediamone i parametri.

PointLight3D(showLight:Boolean = false, flipped:Boolean = false);

showLight:Boolean (default = false) — Attivazione delle luci.

flipped:Boolean (default = false) — Indicazione se cambiare rotta alla direzione della luce

Buttiamoci ora dentro il codice, gran parte di esso è già stato descritto nell’articolo precedente, noi ora ci concentrerermo sulle parti nuove:

package {

//autore: www.enricoviola.it/blog
//——————————-
//Guida personale a Papervision3D

import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.MouseEvent;

import org.papervision3d.core.proto.MaterialObject3D;
import org.papervision3d.lights.PointLight3D;
import org.papervision3d.materials.shadematerials.CellMaterial;
import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
import org.papervision3d.materials.shadematerials.GouraudMaterial;
import org.papervision3d.materials.shadematerials.PhongMaterial;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.primitives.*;
import org.papervision3d.view.BasicView;

public class esempio3 extends BasicView {
//solo la funzione “createScene” è da analizzare, le
//altre funzioni sono state già spiegate nell’esempio2.

private static const RAGGIO_ORBITALE:Number = 200;

private var sfera1:Sphere;
private var sfera2:Sphere;
private var sfera3:Sphere;
private var sfera4:Sphere;
private var sferaGroup:DisplayObject3D;
private var luce:PointLight3D;

public function esempio3() {
super(0, 0, true, false);
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
init3D();
createScene();
startRendering();
}

private function init3D():void {
camera.x = -200;
camera.y =  200;
camera.z = -500;
}

private function createScene():void {

//specifichiamo un punto di luce definendo le coordinate
luce = new PointLight3D(true);
luce.x = 400;
luce.y = 1000;
luce.z = -400;

//Realizziamo un nuovo materiale FlatShade, ossia una forma piana per ogni faccia,
//in questa forma è sconsigliabile per una sfera perchè crea un poligono squadrettato.
//FlatShader(light:LightObject3D, lightColor:int = 0xFFFFFF, ambientColor:int = 0×000000),
//il 1° parametro indica quindi l’oggetto luce da utilizzare, il 2° la luce creata nella
//parte illuminata, il 3° la luce circostante.

var flatShadedMaterial:MaterialObject3D = new FlatShadeMaterial(luce, 0xFFFFFF, 0×060433);

//creiamo ed applichiamo la luce alla sfera
sfera1 = new Sphere(flatShadedMaterial, 50, 10, 10);
sfera1.x = -RAGGIO_ORBITALE;

//Realizziamo un nuovo materiale gouraud, ossia quello apllicato alla
//sfera blu. I parametri sono gli stessi della FlatShader.

var gouraudMaterial:MaterialObject3D = new GouraudMaterial(luce, 0×6654FF, 0×060433);
sfera2 = new Sphere(gouraudMaterial, 50, 10, 10);
sfera2.x =  RAGGIO_ORBITALE;

//Realizziamo un nuovo materiale gouraud, ossia quello apllicato alla
//sfera verde. I parametri sono gli stessi della FlatShader, tranne il 3°
//parametro che indica la capacità di riflessione (speculare).

var phongMaterial:MaterialObject3D = new PhongMaterial(luce, 0xFFFFFF, 0×066021, 100);
sfera3 = new Sphere(phongMaterial, 50, 10, 10);
sfera3.z = -RAGGIO_ORBITALE;

//Realizziamo un nuovo materiale CellMaterial, ossia quello apllicato alla
//sfera rossa. I parametri sono gli stessi della FlatShader, tranne il 3°
//parametro che indica i passaggi dalla zona illuminata a quella del colore
//dell’ambiente (maggiori sono, migliore è la resa).

var cellMaterial:MaterialObject3D = new CellMaterial(luce, 0xFFFFFF, 0xB11201, 12);
sfera4 = new Sphere(cellMaterial, 50, 10, 10);
sfera4.z =  RAGGIO_ORBITALE;

//creiamo un oggetto che raggruppi le 4 sfere
sferaGroup = new DisplayObject3D();
sferaGroup.addChild(sfera1);
sferaGroup.addChild(sfera2);
sferaGroup.addChild(sfera3);
sferaGroup.addChild(sfera4);

//aggiungiamo la luce e il raggruppamento alla scena
scene.addChild(sferaGroup);
scene.addChild(luce);
}

override protected function onRenderTick(event:Event=null):void {

sfera1.yaw(-8);
sfera2.yaw(-8);
sfera3.yaw(-8);
sfera4.yaw(-8);

sferaGroup.yaw(3);

//è stata aggiunta anche questa interazione col mouse,
//la luce segue in parte la posizione del mouse.

luce.x = (stage.mouseX - (stage.stageWidth/2))*4;
luce.z = (stage.mouseY - (stage.stageWidth/2))*3;

super.onRenderTick(event);
}
}
}

File sorgenti del progetto

Leave a Reply