Java - Traslaciones y rotaciones

 
Vista:

Traslaciones y rotaciones

Publicado por elberral (1 intervención) el 15/04/2008 15:07:58
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().setNominalViewingTransform();
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_TRANSFORM_WRITE);
rotarGrupo.setCapability(TransformGroup.ALLOW_TRANSFORM_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 adjuntar pantallazos.
Si alguien puede ayudarme, le enviare las imagenes con las que se entiende enseguida el problema.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder