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.
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


0