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:
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 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(); } } }
Lascio in allegato lo zip con tutto il lavoro per chi lo vuole 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; } } }
http://www.rossionline.net/tmp/tessere3d/tessere3d.zip


Rispondi quotando