Utilizar materiales interactivos en Papervision GreatWhite

Etiquetas: InteractiveScene3DEvent BasicRenderEngine Viewport3D displayObject3D

Para utilizar eventos de ratón sobre objetos en Papervision GreatWhite, tenemos que hacer tres cosas:

-Crear un objeto Viewport3D con el atributo interactive = true

-Crear un objeto y poner el atributo interactive de su material = true

-Añadir los eventos al objeto

El código comentado, tras el salto.

package{
 
	import flash.display.*
 
	public class Materiales extends MovieClip{
 
		import flash.events.Event;
		import flash.text.*;
 
		import org.papervision3d.view.Viewport3D;
    	import org.papervision3d.cameras.Camera3D;
		import org.papervision3d.scenes.Scene3D;
		import org.papervision3d.render.BasicRenderEngine;
		import org.papervision3d.materials.*;
		import org.papervision3d.objects.primitives.Sphere;
		import org.papervision3d.events.InteractiveScene3DEvent;
 
		var escena:Scene3D;
		var renderer:BasicRenderEngine;
		var camara:Camera3D;
		var viewport:Viewport3D;
 
		var esfera:Sphere;
 
		public function Materiales(){
			crear3D();
			crearObjeto();
		}
 
		public function crear3D():void{
			escena = new Scene3D();
			renderer = new BasicRenderEngine();
			camara = new Camera3D();
			//El cuarto parámetro que paso en el constructor es para la propiedad interactive de viewPort. 
			//Si se van a utilizar eventos de ratón, hay que pasar 'true' (por defecto 'false')
			viewport = new Viewport3D(500,500,false,true);
			addChild(viewport);
			camara.z = -500;
			addEventListener(Event.ENTER_FRAME, renderizar);
		}
 
		public function crearObjeto():void{
			var material:MovieAssetMaterial = new MovieAssetMaterial("MaterialBiblioteca");
			//El material usado en el objeto interactivo debe tener interactive = true (por defecto 'false')
			material.interactive = true;
			esfera = new Sphere(material, 200, 10, 10);
			//Por último, se añaden los eventos
			esfera.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS,esferaPresionada);
			esfera.addEventListener(InteractiveScene3DEvent.OBJECT_OVER,esferaOver);
			esfera.addEventListener(InteractiveScene3DEvent.OBJECT_OUT,esferaOut);
			escena.addChild(esfera);
		}
 
		private function esferaPresionada(e:InteractiveScene3DEvent):void{
			//La función recoge el parámetro e, que tiene el atributo displayObject3D;
			Texto_txt.text = "Click sobre la esfera " +  e.displayObject3D;
		}
 
		private function esferaOver(e:InteractiveScene3DEvent):void{
			Texto_txt.text = "Over sobre la esfera";
		}
 
		private function esferaOut(e:InteractiveScene3DEvent):void{
			Texto_txt.text = "Out sobre la esfera";
		}
 
		private function renderizar(e:Event):void{
			esfera.yaw(1);	
			renderer.renderScene(escena, camara, viewport);
		}
 
	}
}

Comentarios:
bishoport dijo:
Muy buenas, mil gracias por tu web, doy clases en una academia y uso tus ejemplos para las clases porque son muy didácticos. Tengo un problema con la interactividad. Este ejemplo funciona perfectamente, pero si creo una clase a parte para crear la esfera y paso como parametro el material, (extiendo esta clase de DisplayObject3D), la esfera sale pero se pierde la interactividad. ¿Se te ocurre algo? Gracias
Dejar un comentario:
Tu nombre (obligatorio):

E-mail (obligatorio, no se mostrará):

Web: