Papervision: Almacenar variables en elementos 3D

Etiquetas: InteractiveScene3DEvent InteractiveColorMaterial extra interactiveSceneManager renderCamera

Los elementos que heredan de displayObject3D, tiene una propiedad llamada extra en la que podemos almacenar variables por medio de un objeto. Por ejemplo si tenemos varios planos en 3D y queremos saber sobre cuál estamos haciendo click, creamos un objeto para cada uno, lo almacenamos en su propiedad "extra", y después en la función que recoge el evento click, accedemos a la variable que hemos guardado. Aquí vá un ejemplo de como hacerlo:

package {
 
	import flash.display.*;
	import flash.events.*;
	import org.papervision3d.cameras.*;
	import org.papervision3d.objects.*;
	import org.papervision3d.scenes.*;
	import org.papervision3d.materials.*;
	import org.papervision3d.events.*;
	import org.papervision3d.utils.*;
 
	public class GuardarVariables extends Sprite {
 
		var contenedor:Sprite;
		var scene:InteractiveScene3D;
		var camera:FreeCamera3D;
		var contenedor3D:DisplayObject3D = new DisplayObject3D();
		var plane:DisplayObject3D;
		var ism:InteractiveSceneManager;
 
		public function GuardarVariables() {
			crearEscenario();
			crearElementos();
		}
		function crearEscenario() {
			contenedor = new InteractiveSprite(); 
			contenedor.x=200;
			contenedor.y=200;
			addChild(contenedor);
			scene = new InteractiveScene3D( contenedor );
			camera=new FreeCamera3D  ;
			camera.z=-700;
			camera.zoom=2;
			//Este es el controlador de Eventos en 3D. Asocio el evento CLICK a la función mostrarColorPlano
			//y luego recojo el objeto presionado con el atributo displayObject3D del evento. 
			ism = scene.interactiveSceneManager;
			InteractiveSceneManager.SHOW_DRAWN_FACES = false;
			ism.enableMouse = true;
			ism.buttonMode = true;								
			ism.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, mostrarColorPlano);
			addEventListener(Event.ENTER_FRAME,Renderizar);
		}
		function crearElementos():void {
			for(var i:uint = 0; i < 10; i++){
				var color:uint = Math.random() * 0xffffff;
				var material:InteractiveColorMaterial = new InteractiveColorMaterial(color);
				material.oneSide=false;
				plane=new Plane(material,200,200,1,1);
				plane.z = i * 100-500
				plane.y = Math.cos(Math.PI * .2 * i)*200
				plane.x = Math.sin(Math.PI * .2 * i)*200
				//Para almacenar variables en objetos, creo una variable de tipo Object donde almaceno todas las variables del objeto3D.
				//Después almaceno esta variable de tipo Object dentro de la propiedad extra del objeto 3D.
				var obj:Object = new Object();
				obj.id = i;
				obj.color = color.toString(16);
				plane.extra = obj;
				contenedor3D.addChild(plane);
			}
			scene.addChild(contenedor3D);
		}
		function Renderizar(event:Event):void {
			contenedor3D.rotationY+= (mouseX/10 - 20) - contenedor3D.rotationY / 10;
			scene.renderCamera(camera);
		}
		//Esta es la función que se ejecuta al hacer click sobre uno de los planos. Por medio del atributo displayObject3D podemos
		//detectar sobre que elemento se ha pulsado
		private function mostrarColorPlano(e:InteractiveScene3DEvent):void{
			var c = e.displayObject3D;
			var raiz = parent;
			raiz.Pulsado_txt.text = "ID plano: " + c.extra.id + " Color: " + c.extra.color
		}
	}
}

Comentarios:
rubelux dijo:
Gracias por tu trabajo, disfruto mucho con tus tutoriales, son claros y muy interesantes.
esedeerre dijo:

Gracias!!! Está muy bien ver que a alguien le sirve todo esto.

Eliphas dijo:
Sencillamente sublime. Por supuesto que sirve. TEngo un problema con la funcion renderCamera. Al compilarlo me dice que no está definida... ¿Dónde stá esa función? Puede ser cosa de la versión del paper? Tengo la última de google. MIllón de gracias por todo.
esedeerre dijo:

Si tienes la última versión, es que tienes Papervision GreatWhite. Este ejemplo está en 1.7 y tú tienes la 2.

Puedes ver algunos ejemplos de tu versión aquí:

http://www.esedeerre.com/portada/10/papervision-greatwhite-flash-ejemplos-tutoriales-actionscript3.0

Eliphas dijo:
Joder macho!!! qué tío, qué velocidad! Efectivamente creo que por ahí andan los problemas, creo que en la 2.0, que tal como dices, es la que tengo ahy algo de freeCamera o algo así. Ceno y lo miro. Mil gracias, si puedo ayudarte en algo, no lo dudes, mi correo, supongo que lo tienes, si no te lo pongo en otro comentRIO.
Victor dijo:
muy buenos los ejemplos que muestras, en realidad animan para seguir aprendiendo. No he podido encontrar la version 1.7 de Papervision y con la 2, no me funcionan los ejemplos que tienes en esta seccion. Tienes algun enlace para descargarla? Gracias!!
esedeerre dijo:

Hola Victor, la versión 1.7 de Papervision está en el repositorio de Papervision

Concretamente, en la carpeta "as3/tags/" (también está la versión 1.5

Victor dijo:
Gracias por el link! Ahora que logre bajar la version 1.7 veo el gran trabajo que hacen estos tutoriales.
Isma dijo:
Oye, esto no funciona con bitmaps, no? Es decir, que si pongo un bitmap en el plano el interative del plano no funciona, o si?
Isma dijo:
Pues si, si que se puede, en vez de InteractiveColorMaterial, con un InteractiveMovieMaterial ya tienes la imagen en el plano y siendo interactivo.
Dejar un comentario:
Tu nombre (obligatorio):

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

Web: