Allora...
...capito che biogna prima creare un PhongShader e poi combinare il MovieMaterial con esso per creare il materiale soggetto alla luce.
e fin qui ora ci sono. 
nel mio test ho un cubo con 6 lati che dovrebbero essere tutti e 6 shadedmaterial object, e una luce.
problema 1:
non riesco a assegnare una materialList dove ogni faccia sia un ShadedMaterial, quando lo passo al cubo mi da errore
problema 2:
non riesco a domare la luce, vorrei fare una cosa di questo tipo: la luce parte da lontano e quindi il mio cubo resta nell'oscurità poi quando la luce arriva il cubo si illumina e si vede bene... non so nemmeno se questo si può effettivamente fare. ma qui la luce è veramente ridotta, non so se si può giocare sull'intensità della luce dell'hotspot, non so nemmeno se è una luce direzionale o omnidirezionale, e perchè con un parantro pointLight.z = 120; la luce mi va dietro al cubo e me lo illumina comunque mentre se è davanti (es z=-120) non è illuminato (lo capite bene dal sorgente più sotto).
problema 3:
la luce influenza il materiale che è lo stesso per i 4 lati quindi quando giro il cubo crea un brutto effetto non realitisco.
ma forse è meglio postare nel dettaglio tutto quello che ho fatto così è più chiaro:
questo è il risultato:
http://www.rossionline.net/tmp/tessere3d/
e questo è il sorgente:
codice:
package {
import flash.display.*;
import flash.events.*;
import org.papervision3d.materials.*
import org.papervision3d.lights.PointLight3D;
import org.papervision3d.objects.primitives.Cube;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.materials.shaders.PhongShader;
import org.papervision3d.materials.shaders.ShadedMaterial;
import org.papervision3d.view.BasicView;
import caurina.transitions.Tweener;
public class Tessere3D extends MovieClip {
public var viewport:BasicView;
public var tessera:Cube;
private var faceArray:Array = new Array("00.jpg", "01.jpg", "02.jpg", "03.jpg");
private var arrFinaleFaccia:Array;
private var pagina:Number = 0;
private var pointLight:PointLight3D;
private var listaMateriali:MaterialsList;
//costruttrice
public function Tessere3D() {
init();
}
/**/
public function init():void {
//inizializzo il viewport
viewport = new BasicView(900, 600, false, true, "FREECAMERA3D");
viewport.camera.zoom = 11;
addChild(viewport);
// crea luce e la posiziono in prospettiva
pointLight= new PointLight3D(true, true);
pointLight.z = 120;
viewport.scene.addChild(pointLight);
//carico i jpeg delle facce definiti nell'array;
caricaFace(faceArray);
//creo il materiale finale
creoMateriali(arrFinaleFaccia);
tessera = new Cube(listaMateriali, 170, 170, 100, 1, 1, 1);
viewport.scene.addChild(tessera);
//listener per i 2 pulsanti che girono la tessera
avanti_btn.addEventListener(MouseEvent.CLICK, avanti);
indietro_btn.addEventListener(MouseEvent.CLICK, indietro);
//evento per il rendering della scena
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
/*Carico le facce e le unisco alla luce creando prima un PhongShader e poi un ShadedMaterial*/
private function caricaFace(arr:Array) {
arrFinaleFaccia = new Array();
for (var i:Number = 0; i < arr.length; i++) {
//l'oggetto faccia è un estensione di movieclip (vedere Faccia.as)
var tempFace:Faccia = new Faccia(this);
tempFace.name = "faccia" + i;
tempFace.foto = arr[i];
//creo l'oggetto movie material
var mm:MovieMaterial = new MovieMaterial(tempFace);
mm.smooth = true;
mm.animated = true;
//prima aggiungo la luce ad un oggetto PhongShader
var shader:PhongShader = new PhongShader(pointLight, 0xFFFFFF,0x000000, 100)
//poi unisco l'oggetto moviematerial con quello PhongShader
var shadedMaterial:ShadedMaterial = new ShadedMaterial(mm, shader);
//popolo l'array che mi contiene le facce
arrFinaleFaccia.push(shadedMaterial);
}
}
/**/
private function creoMateriali(arr:Array) {
var mFacciaVuota:FacciaVuota = new FacciaVuota();
var facciaVuota:MovieMaterial = new MovieMaterial(mFacciaVuota);
facciaVuota.animated = true;
// IN TEORIA SAREBBE COSI'!!! MA NON VA!!! MI DA ERRORE?!?
/*
listaMateriali = new MaterialsList( { front:arr[0],
left:arr[1],
right:arr[2],
top:facciaVuota,
bottom:facciaVuota,
back:arr[3] } );
*/
//per fare una prova metto tutti i materiali uguali
listaMateriali = new MaterialsList( { all:arr[0] } );
}
/**/
private function avanti(e:MouseEvent) {
pagina++;
Tweener.addTween(tessera, { rotationY:(90 * pagina), time:1, transition:"easeInOutBack" } );
}
/**/
private function indietro(e:MouseEvent) {
pagina--;
Tweener.addTween(tessera, { rotationY:(90 * pagina), time:1, transition:"easeInOutBack" } );
}
/**/
private function movimentoLuce() {
var xDist:Number = mouseX - stage.stageWidth * 0.5;
var yDist:Number = mouseY - stage.stageHeight * 0.5;
pointLight.x -= xDist * 0.005;
pointLight.y += yDist * 0.005;
}
/**/
protected function onEnterFrame( e:Event ):void {
movimentoLuce();
viewport.singleRender();
}
}
}
per conoscenza posto anche la casse Faccia.as ma non è utile ai fini della discussione (giusto se uno vuol testare)
codice:
package {
import flash.display.*;
import flash.events.*;
import flash.system.*;
import flash.net.URLRequest;
import flash.utils.*;
public class Faccia extends MovieClip {
private var _foto:String;
private var _sessione:String = "img/";
private var richiestaJpg:URLRequest;
private var loaderJpg:Loader;
private var fullImg:Bitmap;
private var _fla:MovieClip;
public function Faccia(fla:MovieClip) {
_fla = fla;
init();
}
/**/
private function init() {
//
this.areaHit_btn.addEventListener(MouseEvent.ROLL_OVER,sopraPulsante);
this.areaHit_btn.addEventListener(MouseEvent.ROLL_OUT,fuoriPulsante);
this.areaHit_btn.addEventListener(MouseEvent.CLICK, vai);
}
private function vai(e:MouseEvent) {
trace("ok");
}
private function sopraPulsante(e:MouseEvent) {
trace("over");
}
private function fuoriPulsante(e:MouseEvent) {
trace("out");
}
/**/
private function caricamento() {
richiestaJpg = new URLRequest(_sessione + _foto);
loaderJpg=new Loader();
loaderJpg.contentLoaderInfo.addEventListener(Event.OPEN,iniziaCaricamentoJpg);
loaderJpg.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,inCaricamentoJpg);
loaderJpg.contentLoaderInfo.addEventListener(Event.COMPLETE, completatoJpg);
loaderJpg.load(richiestaJpg);
}
/**/
private function iniziaCaricamentoJpg(e:Event):void {
//
}
/**/
private function inCaricamentoJpg(e:ProgressEvent):void {
var percentualeBg:uint=(e.bytesLoaded/e.bytesTotal)*100;
var avanzamento:Number = 0.95 * percentualeBg;
}
/**/
private function completatoJpg(e:Event):void {
fullImg = loaderJpg.content as Bitmap;
foto_mc.addChild(fullImg);
}
// valore del file da caricare;
public function set foto(valore:String){
_foto = valore;
caricamento();
}
public function get foto():String{
return this._foto;
}
}
}
Lascio in allegato lo zip con tutto il lavoro per chi lo vuole testare.
http://www.rossionline.net/tmp/tessere3d/tessere3d.zip