Papervision 2.0: GreatWhite.Plantilla básica

Papervision 2.0: GreatWhite.Plantilla básica

Etiquetas: Viewport3D BasicRenderEngine Scene3D Camera3D MovieMaterial MaterialList DisplayObject Viewport3D Vertex3D

Imagen en reemplazo de flash
Hace tiempo que está disponible la versión 2.0a de Papervision, bajo el nombre de Greatwhite. Hay algunos cambios respecto a la versión anterior, y ya han empezado a surgir tutoriales donde se explica como utilizar las nuevas clases y como se recomienda dividir los bloques de código. Esta es una plantilla básica de Papervision 2.0. En este caso creo un cubo y creo sobre él un efecto de "fluidez". Para que funcione hay que tener descargadas las clases de Papervision 2.0a, y haber indicado a Flash donde están guardadas.

Puedes verlo a pantalla completa aquí

  1. //////////////////////////////////////////////////////////////////////////////////////
  2. //CLASES
  3.  
  4. import org.papervision3d.view.Viewport3D;
  5. import org.papervision3d.cameras.*;
  6. import org.papervision3d.scenes.Scene3D;
  7. import org.papervision3d.render.BasicRenderEngine;
  8. import org.papervision3d.objects.primitives.Cube;
  9. import org.papervision3d.materials.MovieMaterial;
  10. import org.papervision3d.materials.utils.MaterialsList;
  11. import org.papervision3d.core.geom.renderables.Vertex3D
  12. import org.papervision3d.objects.DisplayObject3D;
  13. import flash.display.BitmapData;
  14.  
  15.  
  16. //////////////////////////////////////////////////////////////////////////////////////
  17. //VARIABLES
  18.  
  19. var viewport:Viewport3D;
  20. var renderer:BasicRenderEngine;
  21. var escena:Scene3D;
  22. var camara:Camera3D;
  23. var movieMaterial:MovieMaterial;
  24. var listaMateriales:MaterialsList = new MaterialsList();
  25. var cubo:DisplayObject3D;
  26. var ref_object3D:DisplayObject3D;
  27. var count:Number = 0;
  28. var calidad = 40;
  29. var contador:Number = 0;
  30. var xIni:Array = new Array();
  31. var yIni:Array = new Array();
  32. var zIni:Array = new Array();
  33. stage.quality = StageQuality.LOW;
  34. //////////////////////////////////////////////////////////////////////////////////////
  35. //FUNCIONES
  36. //Esta función es la que invocamos al comenzar. Sería la constructora de la escena
  37. function Empezar(vpWidth:Number = 700, vpHeight:Number = 400):void {
  38. 	CrearPapervision(vpWidth, vpHeight);
  39. 	CrearObjetos();
  40. 	Crear3D();
  41. 	GuargarXIni();
  42. 	CrearEventos();
  43. }
  44.  
  45. //Crea los elementos necesarios de la escena PPV
  46. function CrearPapervision(vpWidth:Number, vpHeight:Number):void {
  47. 	//Este va a ser el "contenedor" que nos va a permitir visualizar la escena. Es el 
  48. 	//objeto a través del cual visualizamos la escena 3D. Hay que especificarle un ancho y un alto. 
  49. 	viewport = new Viewport3D(vpWidth, vpHeight);
  50. 	addChild(viewport);
  51. 	//El renderer es el objeto que se encarga de renderizar la escena. Cada vez que se produce un cambio 
  52. 	//Hay que volver a renderizar. Esto se hace en la funcion "Renderizar". 
  53. 	renderer = new BasicRenderEngine();
  54. 	escena = new Scene3D();
  55. 	camara = new Camera3D();
  56. 	camara.zoom = 3
  57. }
  58.  
  59. //En esta función se añaden todos los objetos 3d a la escena
  60. function Crear3D():void {
  61. 	escena.addChild(cubo);
  62. }
  63.  
  64. //Crea todos los objetos que queremos añadir a la escena (en este caso un cubo). 
  65. function CrearObjetos() {
  66. 	//Creo un material a partir de un clip que hay en el escenario
  67. 	var material:MovieMaterial = new MovieMaterial( Skin_mc, true, false, false );
  68. 	material.oneSide = false;
  69. 	//Creo una lista de materiales para hacer el cubo a partir del material que he creado. 
  70. 	listaMateriales = new MaterialsList();
  71. 	listaMateriales.addMaterial(material,"top");
  72. 	listaMateriales.addMaterial(material,"bottom");
  73. 	listaMateriales.addMaterial(material,"front");
  74. 	listaMateriales.addMaterial(material,"back");
  75. 	listaMateriales.addMaterial(material,"left");
  76. 	listaMateriales.addMaterial(material,"right");
  77. 	//Creo el cubo
  78. 	cubo =  new Cube( listaMateriales, 500, 500, 500, 8, 8, 8);
  79. }
  80.  
  81. //En esta función se realizan los movimientos de objetos de la escena antes de renderizar. 
  82. //En este caso muevo todos los vertices del cubo para generar el efecto de fluidez
  83. function Mover() {
  84. 	contador+= 0.5
  85. 	var count = 0;
  86. 	for each (var vertex:Vertex3D in cubo.geometry.vertices) {
  87. 		cubo.geometry.vertices[count].x = xIni[count] + (0.5-Math.sin((count + contador)/4)) * count/20
  88. 		cubo.geometry.vertices[count].y = yIni[count] + (0.5-Math.sin((count + contador)/8)) * count/5
  89. 		cubo.geometry.vertices[count].z = zIni[count] + (0.5-Math.sin((count + contador)/4)) * count/15
  90. 		count++;
  91. 	}
  92. 	cubo.rotationY += ((mouseX - 300) - cubo.rotationY)/9;
  93. 	cubo.rotationX += ((mouseY - 300) - cubo.rotationX)/9;
  94. }
  95.  
  96. //Añade los eventos necesarios a la escena. 
  97. function CrearEventos():void {
  98. 	addEventListener(Event.ENTER_FRAME, Renderizar);
  99. }
  100.  
  101. //Esta función la he hecho para guardar las coordenadas iniciales de todos los puntos del 
  102. //cubo que he creado para el efecto. 
  103. function GuargarXIni(){
  104. 	var count = 0;
  105. 	for each (var vertex:Vertex3D in cubo.geometry.vertices) {
  106. 		xIni.push(cubo.geometry.vertices[count].x);
  107. 		yIni.push(cubo.geometry.vertices[count].y);
  108. 		zIni.push(cubo.geometry.vertices[count].z);
  109. 		count++;
  110. 	}
  111. }
  112.  
  113. //Hace los cambios necesarios en la escena a través de la función mover, y después
  114. //renderiza la escena. 
  115. function Renderizar(e:Event):void {
  116. 	Mover();
  117. 	renderer.renderScene(escena, camara, viewport);
  118. }
  119.  
  120. ////////////////////////////////////////////////////////////////////////////////////////
  121. //Empezamos
  122.  
  123. Empezar();

Descargar archivos

Comentarios
    • Autor
    • eliphas
    Por favor, una pregunta. Cual es la mejor opción para hacer una "foto navegable en plan QTVR"? PApervision?, Actionscrip directamente....u otra, cuál? Saludos y gracias de natemano.
    • Autor
    • esedeerre
    te refieres a algo como esto??? http://www.papervision3d.org/
    • Autor
    • DAC
    Me dice que el Skin_mc no lo encuentra y hago un movieclip con el nombre de Skin_mc pero no me carga.
    • Autor
    • DAC
    ya me sale bien, tenia un problema pero no supe que era, hice otro archivo y ya.
    • Autor
    • marc
    muchisimas gracias! buscando y rebuscando documentación de actionscript 3.0 llegué a la tuya, y suerte que he tenido! Muy buena página y ejemplos. Gracias de nuevo por iluminar el camino en los oscuros principios!
    • Autor
    • Santiago
    Hola muy bueno el tutorial estoy empezando con el PV3D, quería realizar un ejercicio de sembrar con array, usando como base su código arriba escrito pero tengo un problema y es que al momento de de renderizar la escena no obtengo nada, estoy utilizando la versión 2.0 de PV3D mi escenario queda vacio...y no encuentro que puede estar mal...si me pueden ayudar se los agradeceria... el codigo: package{ import flash.display.MovieClip; import flash.display.Sprite; import flash.events.Event; import flash.display.StageQuality; import org.papervision3d.* import org.papervision3d.view.Viewport3D; import org.papervision3d.cameras.*; import org.papervision3d.scenes.Scene3D; import org.papervision3d.render.BasicRenderEngine; import org.papervision3d.objects.primitives.Cube; import org.papervision3d.materials.*; import org.papervision3d.materials.MovieMaterial; import org.papervision3d.materials.utils.MaterialsList; import org.papervision3d.core.geom.renderables.Vertex3D import org.papervision3d.objects.DisplayObject3D; import flash.display.BitmapData; public class battle extends MovieClip { //definiciones de variables globales var viewport:Viewport3D; var renderer:BasicRenderEngine; var escena:Scene3D; var camara:Camera3D; var movieMaterial:BitmapFileMaterial; var ml:MaterialsList = new MaterialsList(); var cubo:DisplayObject3D; var ref_object3D:DisplayObject3D; var g__field:Array = [ [1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,1,1], [1,0,1,1,1,1,1,1,1,0], [1,0,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,0,1,1,1], [1,1,0,1,1,0,1,1,1,1], [1,1,1,1,0,1,1,1,1,1], [1,0,1,0,1,1,1,1,1,1], [1,1,0,1,1,1,1,1,1,1] ]; //fin de variables globales public function battle(){} public function init(vpWidth:Number = 800, vpHeight:Number = 800):void{ trace ("empezamos"); this.BuildPapervision(vpWidth, vpHeight); this.BuildObjetcs(); this.Build3D(); this.addEventEscena(); for(var index1:String in g__field){ for(var index2:String in g__field[index1]){ this.fieldFill(g__field[index1][index2]); } } } public function BuildPapervision(vpWidth:Number, vpHeight:Number):void{ viewport = new Viewport3D(vpWidth, vpHeight); addChild(viewport); renderer = new BasicRenderEngine(); escena = new Scene3D(); camara = new Camera3D(); camara.zoom = 0; trace("construimos la escena"); } public function BuildObjetcs(){ var material:BitmapFileMaterial = new BitmapFileMaterial("materiales/skull.jpg"); material.interactive = true; material.oneSide = false; ml = new MaterialsList(); ml.addMaterial(material,"top"); ml.addMaterial(material,"bottom"); ml.addMaterial(material,"front"); ml.addMaterial(material,"back"); ml.addMaterial(material,"left"); ml.addMaterial(material,"right"); cubo = new Cube(ml, 20, 20, 20, 4, 4, 4); trace("construimos los objetos"); } public function Build3D():void { this.escena.addChild(cubo); trace("colocamos los objetos en la escenes"); } public function fieldFill(fill:String):void{ switch(fill){ case "0": trace("vacio"); case "1": trace("cesped"); break; default: trace("cesped"); break; } } public function addEventEscena():void { this.addEventListener(Event.ENTER_FRAME, Render); } public function Render(e:Event):void { this.renderer.renderScene(escena, camara, viewport); trace("renderizamos la escena"); } } }
Dejar un comentario
Tu nombre (obligatorio):

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

Web:

Comentario: