Crear dummys con Papervision
hola a todos.
Estoy intentando hacer un sistema solar en papervision. He estado mirando el ejemplo que cuelgan en coconnut en el que aparece un planeta y una luna girando alrededor, mediante un dummy (movimiento referente a un objeto).
he intentado colocar mas planetas para probar, pero resulta que no he conseguido ningun resultado. ahora giran mis planetas pero no lo hacen entorno a un sol (en el caso de un planeta) o de un planeta (en el caso de un satelite).
Os dejo el código para que lo mireis por si me he equivocado (seguro que si jejej).
package jel.com.pv3d
<code>{
import flash.display.GradientType;
import flash.display.Sprite;
import flash.events.Event;
import flash.filters.GlowFilter;
import flash.geom.Matrix;
import jel.com.main.CanvasFlash;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.events.FileLoadEvent;
import org.papervision3d.materials.BitmapFileMaterial;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.Sphere;
import org.papervision3d.scenes.MovieScene3D;
import org.papervision3d.materials.BitmapColorMaterial;
public class EjemploA extends CanvasFlash
{
private var escenario3D:MovieScene3D;
private var camara:Camera3D;
private var tierra:Sphere;
private var esfera:Sphere;
private var atmosfera:Sphere;
private var neptuno:Sphere;
//private var dummy:DisplayObject3D;
public function EjemploA(_width:Number, _height:Number) {
this.width = _width;
this.height = _height;
//Creamos un fondo de estrellas, 400 para ser más exactos.
creaFondoEstrellas(400);
//creamos un sprite y se lo asignamos al escenario3D
//hay que centrarlo en pantalla, dando la mitad del ancho y el alto de la misma.
//de no hacer esto, los objetos aparecerían en la esquina superior izquierda de la pantalla
var contenedor_spt:Sprite = new Sprite();
contenedor_spt.x = 0.5*_width;
contenedor_spt.y = 0.5*_height;
this.addChild(contenedor_spt);
escenario3D = new MovieScene3D(contenedor_spt);
//creamos la cámara y definimos su zoom y la distancia a la que está el objetivo
camara = new Camera3D(DisplayObject3D.ZERO);
camara.zoom = 3;
camara.focus = 80;
//movemos la cámara hacia atrás y arriba para mirar al mundo desde un ángulo ligeramente picado
camara.moveBackward(1000);
camara.moveUp(900);
//creacion de la variable para el giro de los dos planetas conjuntamente
//dummy = new DisplayObject3D();
//escenario3D.addChild(dummy);
//creamos un material con la textura de la superficie de la Tierra, que cargamos de la carpeta imagenes
var materialSol:BitmapFileMaterial = new BitmapFileMaterial("imagenes/sol.jpg");
//creamos una esfera para simular el globo terráqueo
tierra = new Sphere(materialSol, 350, 20, 16);
escenario3D.addChild(tierra);
//creamos una esfera de un radio mayor para simular la atmósfera
atmosfera = new Sphere(new ColorMaterial(0xeeeeff, 0.1), 360, 20, 16);
escenario3D.addChild(atmosfera);
//creamos una esfera mas pequeña en el espacio y su textura
var materialLuna:BitmapFileMaterial = new BitmapFileMaterial("imagenes/luna.jpg");
esfera = new Sphere(materialLuna, 80, 20, 16);
esfera.x = 1000;
esfera.y = -300;
//dummy.addChild(esfera);
escenario3D.addChild(esfera);
//creo un nuevo planeta mas lejano que el resto
var materialTierra:BitmapFileMaterial = new BitmapFileMaterial("imagenes/mundo.jpg");
neptuno = new Sphere(materialTierra,250,20,16);
neptuno.x = 1500;
neptuno.y = -500;
escenario3D.addChild(neptuno);
//metemos en el escenario el dummy
//dummy.addChild(esfera);
//dummy.addChild(neptuno);
//aplicamos un filtro glow a las esferas para simular el aspecto gaseoso de la atmósfera
tierra.container.filters = [new GlowFilter(0xeeeeff, 0.50, 50, 50, 2.0, 1.0, false)];
atmosfera.container.filters = [new GlowFilter(0xeeeeff, 0.50, 50, 50, 1.5, 1.0, false)];
//declaramos esta clase como oyente del evento ENTER_FRAME
//esto hace que el método onEnterFrame sea llamado 25 veces por segundo (el frameRate de reproducción de la aplicación)
this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
//método que dibuja estrellas aleatoriamente en el fondo
private function creaFondoEstrellas(num:uint):void {
var fondoEstrellas:Sprite = new Sprite();
fondoEstrellas.graphics.clear();
fondoEstrellas.graphics.beginFill(0x000000, 1.0);
fondoEstrellas.graphics.drawRect(0,0, this.width, this.height);
fondoEstrellas.graphics.endFill();
var radio:Number;
for (var i:uint=0; i<num;i++) {
radio = 1.5*Math.random();
fondoEstrellas.graphics.beginFill(0xffffff, 0.7);
fondoEstrellas.graphics.drawCircle(this.width*Math.random(), this.height*Math.random(), radio);
fondoEstrellas.graphics.endFill();
};
this.addChild(fondoEstrellas);
}
//este método es llamado cada 1/25 de segundo (cada vez que se produce un evento ENTER_FRAME)
private function onEnterFrame(evt:Event):void {
//rotamos las esferas y renderizamos el escenario para que se actualice la vista
//dummy.rotationY = 5;
tierra.rotationY -= 2;
esfera.rotationY -= 2;
neptuno.rotationY -= 3;
escenario3D.renderCamera(camara);
}
}
</code>muchas gracias de antemano!
Ventd'Aval
Una recomendacion (sobre este y otros posts ^^)... aisla y/o sintetiza un poco tu problema... y coge el codigo justo y necesario para revisar lo que pueda estar fallando... es que revisar un chorizo asi de largo es btt tedioso ^^