Una de las nuevas caracteristicas del papervision3d Great white branche es la opcion de utilizar materiales que reaccionan con luz dinamicas he aqui un ejemplo [click here to see in a new window]:
Este es el source code:
package{
//papervision3d 2.0.a
import flash.display.*;
import flash.events.*;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.objects.primitives.Sphere;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.Viewport3D;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.objects.primitives.Cube;
import org.papervision3d.materials.*;
import org.papervision3d.materials.utils.*;
import org.papervision3d.materials.special.CompositeMaterial;
import org.papervision3d.materials.shadematerials.*;
import org.papervision3d.lights.*;
public class DinamicyLight extends Sprite{
private var scene:Scene3D;
private var viewport:Viewport3D;
private var camera:Camera3D;
private var renderer:BasicRenderEngine;
//Objetos
private var objCube:Cube;
private var objSphere:Sphere;
private var light:PointLight3D;
private var radius:Number;
private var angle:Number = 0;
public function DinamicyLight(){
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.quality = StageQuality.MEDIUM;
init3D();
}
private function init3D():void{
//Agregamos un visor o perspectiva
viewport = new Viewport3D(0,0,true);
viewport.opaqueBackground = 0x222222;
addChild(viewport);
//Este objeto PointLight3D es un foco
light = new PointLight3D();
light.x = light.y = light.z = 500;
light.z = -100;
//render
renderer = new BasicRenderEngine();
//camara
camera = new Camera3D();
camera.z = -500;
camera.focus = 250;
camera.zoom = 1;
//scena 3d
scene = new Scene3D();
//Determinacion del radio como distancia al eje Z
radius = Math.sqrt(Math.pow((light.x-0),2)+Math.pow((light.y-0),2));
//Materiales
var colorMat:ColorMaterial = new ColorMaterial( 0x006699, 1 );
var wireMat:WireframeMaterial = new WireframeMaterial( 0x0099cc );
var compoMat:CompositeMaterial = new CompositeMaterial();
compoMat.addMaterial(colorMat);
compoMat.addMaterial(wireMat);
compoMat.doubleSided = true;
//Cubo
objCube = new Cube(new MaterialsList( { all:new GouraudMaterial(light) } ),400,400, 400);
//Sphere
var s_colorMat:ColorMaterial = new ColorMaterial( 0xFFFFFF, 1 );
var s_wireMat:WireframeMaterial = new WireframeMaterial( 0x0099cc );
var s_compoMat:CompositeMaterial = new CompositeMaterial();
s_compoMat.addMaterial(s_colorMat);
s_compoMat.addMaterial(s_wireMat);
s_compoMat.doubleSided = true;
objSphere = new Sphere(s_compoMat, 50,16,12);
objSphere.x = light.x;
objSphere.y = light.y;
objSphere.z = light.z;
scene.addChild(objCube);
scene.addChild(objSphere);
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(event:Event):void {
angle += 1;
angle = angle % 360;
//objCube.rotationX += 2;
objCube.rotationY += 2;
var y:Number = Math.sin(angle * (Math.PI / 180)) * radius;
var x:Number = Math.cos(angle * (Math.PI / 180)) * radius;
light.x = x;
light.y = y;
objSphere.x = light.x;
objSphere.y = light.y;
objSphere.z = light.z;
renderer.renderScene(scene,camera,viewport);
}
}
}