Papervision: Almacenar variables en elementos 3D

Papervision: Almacenar variables en elementos 3D

Etiquetas: InteractiveScene3DEvent InteractiveColorMaterial extra interactiveSceneManager renderCamera

Imagen en reemplazo de flash
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:

  1. package {
  2.  
  3. 	import flash.display.*;
  4. 	import flash.events.*;
  5. 	import org.papervision3d.cameras.*;
  6. 	import org.papervision3d.objects.*;
  7. 	import org.papervision3d.scenes.*;
  8. 	import org.papervision3d.materials.*;
  9. 	import org.papervision3d.events.*;
  10. 	import org.papervision3d.utils.*;
  11.  
  12. 	public class GuardarVariables extends Sprite {
  13.  
  14. 		var contenedor:Sprite;
  15. 		var scene:InteractiveScene3D;
  16. 		var camera:FreeCamera3D;
  17. 		var contenedor3D:DisplayObject3D = new DisplayObject3D();
  18. 		var plane:DisplayObject3D;
  19. 		var ism:InteractiveSceneManager;
  20.  
  21. 		public function GuardarVariables() {
  22. 			crearEscenario();
  23. 			crearElementos();
  24. 		}
  25. 		function crearEscenario() {
  26. 			contenedor = new InteractiveSprite(); 
  27. 			contenedor.x=200;
  28. 			contenedor.y=200;
  29. 			addChild(contenedor);
  30. 			scene = new InteractiveScene3D( contenedor );
  31. 			camera=new FreeCamera3D  ;
  32. 			camera.z=-700;
  33. 			camera.zoom=2;
  34. 			//Este es el controlador de Eventos en 3D. Asocio el evento CLICK a la función mostrarColorPlano
  35. 			//y luego recojo el objeto presionado con el atributo displayObject3D del evento. 
  36. 			ism = scene.interactiveSceneManager;
  37. 			InteractiveSceneManager.SHOW_DRAWN_FACES = false;
  38. 			ism.enableMouse = true;
  39. 			ism.buttonMode = true;								
  40. 			ism.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, mostrarColorPlano);
  41. 			addEventListener(Event.ENTER_FRAME,Renderizar);
  42. 		}
  43. 		function crearElementos():void {
  44. 			for(var i:uint = 0; i < 10; i++){
  45. 				var color:uint = Math.random() * 0xffffff;
  46. 				var material:InteractiveColorMaterial = new InteractiveColorMaterial(color);
  47. 				material.oneSide=false;
  48. 				plane=new Plane(material,200,200,1,1);
  49. 				plane.z = i * 100-500
  50. 				plane.y = Math.cos(Math.PI * .2 * i)*200
  51. 				plane.x = Math.sin(Math.PI * .2 * i)*200
  52. 				//Para almacenar variables en objetos, creo una variable de tipo Object donde almaceno todas las variables del objeto3D.
  53. 				//Después almaceno esta variable de tipo Object dentro de la propiedad extra del objeto 3D.
  54. 				var obj:Object = new Object();
  55. 				obj.id = i;
  56. 				obj.color = color.toString(16);
  57. 				plane.extra = obj;
  58. 				contenedor3D.addChild(plane);
  59. 			}
  60. 			scene.addChild(contenedor3D);
  61. 		}
  62. 		function Renderizar(event:Event):void {
  63. 			contenedor3D.rotationY+= (mouseX/10 - 20) - contenedor3D.rotationY / 10;
  64. 			scene.renderCamera(camera);
  65. 		}
  66. 		//Esta es la función que se ejecuta al hacer click sobre uno de los planos. Por medio del atributo displayObject3D podemos
  67. 		//detectar sobre que elemento se ha pulsado
  68. 		private function mostrarColorPlano(e:InteractiveScene3DEvent):void{
  69. 			var c = e.displayObject3D;
  70. 			var raiz = parent;
  71. 			raiz.Pulsado_txt.text = "ID plano: " + c.extra.id + " Color: " + c.extra.color
  72. 		}
  73. 	}
  74. }

Descargar archivos

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

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

    • Autor
    • Eliphas
    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.
    • Autor
    • esedeerre

    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

    • Autor
    • Eliphas
    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.
    • Autor
    • Victor
    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!!
    • Autor
    • esedeerre

    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

    • Autor
    • Victor
    Gracias por el link! Ahora que logre bajar la version 1.7 veo el gran trabajo que hacen estos tutoriales.
    • Autor
    • Isma
    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?
    • Autor
    • Isma
    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:

Comentario: