Abr 18

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]:

This movie requires Flash Player 8

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);
		}
	}
}
Abr 16

Desde que comencé a desarrollar mis primeras aplicaciones en Papervision siempre encontré particularmente difícil el manejo del movimiento de un objeto o cámara a través de una trayectoria en el espacio.

Particularmente me inicie consultando los siguientes blogs:

“The search for the perfect bezier tweening syntax” 1st Reference

“Tweening along the path” 2nd Reference

Los cuales me impulsaron a aproximar una mejor solución, o al menos esa fue mi intención:La primera aproximación es colocar una secuencia de puntos y recorrerlos con Tweener por ejemplo pero el resultado es una transición en zigzag Ejemplo [click here to the sample]:

This movie requires Flash Player 8

Una aproximación mas elegante parecería ser utilizar curvas de Bezier para obtener un camino curvo pero tienen una desventaja fundamental: Las curvas de bezier generalmente no pasan por los puntos de poco sirve tal aproximación ademas resulta dificil de manipular o utilizar [1st Reference] Ejemplo [click here to the sample]

This movie requires Flash Player 8

Por lo que resulta mas conveniente utilizar la formulación Catmull-Rom que es una extensión teórica de las lineas de bezier que pasan por los puntos de control [2nd Reference] y obtenemos un resultado bastante satisfactorio, además como el planteo esta generalizado a un punto de n dimensiones ( en nuestro caso 3 ) podemos realizar una implementación de la siguiente manera:

1) Demo con y=Constante (Y=k=0) [click here to the sample]

This movie requires Flash Player 8

2) Demo con y=variable [click here to the sample]

This movie requires Flash Player 8

Pronto tratare de re-escribir mi source code para hacerlo mas legible y publicarlos.

Seria muy de mi agradado que el staff de papervision las evalúe y me permita incluirlas como librerías de utileria dentro de algun paquete,pero eso es solo una expresion de deseo…Espero sus criticas y opiniones