Hi!
Estoy haciendo el proyecto de fin de carrera, utilizando para el diseño Java3D.
Consiste en simular el movimiento de peces según diferentes comportamientos.
Tengo un problema a la hora de hacer diversas rotaciones y traslaciones seguidas, sobre un transformGroup modificado.
Aquí esta el codigo de un programa de prueba:
SimpleUniverse universo = new SimpleUniverse(canvas3d);
Pez pez = new Pez();
pez.imagPez = pez.creaPez();
universo.getViewingPlatform().setNominalViewingTra nsform();
pez.TrasladaPez(new Vector3f(0.3f,0.5f,0.0f),(float)(Math.PI));
universo.addBranchGraph(pez.imagPez);
pez.TrasladaPez(new Vector3f(-0.5f,-0.5f,0.0f),(float)( Math.PI/2));
universo.addBranchGraph(pez.imagPez);
//Aquí la llamada a TrasladaPez
public void TrasladaPez(Vector3f vec, float angle){
Transform3D rotar = new Transform3D();
rotar.rotZ(angle);
rotar.setTranslation(vec);
System.out.println(rotar);
TransformGroup rotarGrupo = new TransformGroup(rotar);
rotarGrupo.getTransform(rotar);
rotarGrupo.setCapability(TransformGroup.ALLOW_TRAN SFORM_WRITE);
rotarGrupo.setCapability(TransformGroup.ALLOW_TRAN SFORM_READ);
this.imagPez.detach();
Node nodo =this.imagPez.getChild(1);
this.imagPez.removeChild(1);
rotarGrupo.addChild(nodo);
this.imagPez.addChild(rotarGrupo);
}
básicamente lo que hago en este programa de prueba es hacer una llamada a la funcion TrasladaPez(), con parámetros el vector sobre el que se va a hacer la traslación y el angulo sobre el que se quiere rotar este.
Pues bien, la primera llamada la hace bien,
pez.TrasladaPez(new Vector3f(0.3f,0.5f,0.0f),(float)(Math.PI));
Pero en la segunda llamada el pez hace un movimiento indeseado:
pez.TrasladaPez(new Vector3f(-0.5f,-0.5f,0.0f),(float)( Math.PI/2));
Es como si se rotara toda la pantalla en vez de solo el pez, el problema ha de estar al aplicar la rotacion, ya que al pasar como parámetro este codigo:
pez.TrasladaPez(new Vector3f(-0.5f,-0.5f,0.0f),(float)(0.0));
El pez se mueve bien.
Para que se entienda algo mejor adjunto algunas pantallas con los parámetros correspondientes:
(Sin llamadas a TrasladaPez())
Coord.(0.0,0.0,0.0);
(Con una sola llamada a TrasladaPez())
pez.TrasladaPez(new Vector3f(0.3f,0.5f,0.0f),(float)(Math.PI));
Coord.(0.3,0.5,0.0);
(2 transformaciones seguidas, sin modificar el angulo en la 2ª)
pez.TrasladaPez(new Vector3f(0.3f,0.5f,0.0f),(float)(Math.PI));
pez.TrasladaPez(new Vector3f(-0.3f,-0.8f,0.0f),(float)(0.0));
Coord.(0.0,-0.3,0.0);
(2 transformaciones seguidas, modificando el angulo en la 2ª)
pez.TrasladaPez(new Vector3f(0.3f,0.5f,0.0f),(float)(Math.PI));
pez.TrasladaPez(new Vector3f(-0.3f,-0.8f,0.0f),(float)( Math.PI/2));
Coord. aprox(-0.4,-0.4,0.0); dibujo 1-> MAL
Coord. Deberian ser: Coord.(0.0,-0.3,0.0); dibujo 2->BIEN
No me deja meter los pantallazos!!
Si alguien puede ayudarme le enviare las imagenes, con las que se entiende rapidamente el problema.
Gracias de antemano!