Inicio > Programación > Agua animada con Blender y Java 3D (parte 2)

Agua animada con Blender y Java 3D (parte 2)

En la primera parte se explica cómo crear superficies de agua en Blender y exportarlas como archivos .obj apropiados para utilizar con Java 3D. En esta parte se explica cómo importar archivos .obj en Java 3D y utilizarlos para hacer una animación de una superficie de  agua.

Debo aclarar que todo lo que está a continuación no es más que la adaptación del ejemplo Morphing, que se encuentra incluido entre los ejemplos disponibles en la parte 1. La clase MorphingBehavior, que debe incluirse en el proyecto, también está incluida en ese ejemplo, NO es alguna clase que yo haya hecho, sólo la utilizo. El ejemplo terminado (como proyecto de NetBeans) se encuentra aquí:

Agua.zip

Toda la explicación siguiente se basa en el método crearAgua() de la clase Agua, por lo que recomiendo descargar el ejemplo, abrir el archivo Agua.java en su editor favorito y buscar el método mencionado. El código está muy bien comentado (según lo que entendí del ejemplo original).

¿List@? Muy bien. En primer lugar, el método crearAgua() retorna un objeto BranchGroup porque este tipo de objeto permite ser “compilado”. Java 3D lo compila y lo almacena en caché, con el propósito de mejorar el rendimiento. Sin embargo, esto evita que el objeto devuelto pueda ser modificado, aunque no veo por qué debería hacerse. En todo caso, con un poco de experiencia en Java es posible modificarlo de modo que el objeto devuelto sea un TransformGroup.

De manera general, éstos son los pasos que componen el método:

  1. Se declara e instancia el BranchGroup que se va a devolver.
  2. Se definen las transformaciones necesarias para que el agua se “ajuste” a nuestro universo (creado en el constructor). Estas transformaciones consisten en aplicar una escala ya sea para agrandar o reducir la superficie (según convenga); y rotar toda la superficie 90º sobre el eje x, para que la superficie sea horizontal. De lo contrario es como si el agua se viera desde arriba, y lo que es peor, no sería lógico en el sistema de coordenadas del universo, al tener una superficie de agua vertical.
  3. Se crea una esfera para limitar la aplicación de la iluminación y el fondo de la escena. También se usa para indicar cuándo debe activarse el objeto Behavior de la animación.
  4. Se carga una imagen y se utiliza como fondo para simular el cielo. Esto es opcional.
  5. Se definen las luces ambiental y direccional. La primera es para que el material de la superficie de agua refleje su color y la segunda para acentuar las olas con sombras y reflejos. Yo diría que esto es necesario, de lo contrario el agua se vería como un simple plano.
  6. Se declaran e instancian distintos vectores de objetos de Java 3D para contener y manipular las superficies distintas en distintas “etapas” desde que se cargan, hasta ser unidas en una animación.
  7. Se cargan las superficies y se manipulan en los vectores definidos en el paso anterior.
  8. Se define un objeto Appearance para el agua. Aquí se establecen el color y la brillantez de la misma.
  9. La apariencia anterior, junto con uno de los vectores, se utiliza para crear un objeto Morph que permite transformar las distintas geometrías contenidas en el vector, una en otra.
  10. Se crea el objeto Alpha que controlará la velocidad de la animación.
  11. El objeto Morph y el objeto Alpha se utilizan para instanciar un objeto MorphingBehavior (la única clase que debe copiarse al proyecto). Esta clase une la transformación de las geometrías con el tiempo para que sea realizada. Y se agrega directamente al BranchGroup que se retornará.
  12. Cuando la superficie de agua se ve “de lado”, muchos polígonos desaparecen. Lo único que hay además del agua es el fondo, por lo que sólo se ven un montón de olas que más parecen gaviotas volando. Recomiendo comentar la línea 182 para comprender a qué me refiero. Lo que hice para solucionar esto fue crear un objeto Box que actúa como un fondo extra, para evitar que se vea el fondo de cielo. Al final esta caja resulta siendo una parte considerable del agua. Por eso es que se crea un nuevo objeto Appearance para darle a la caja un color azul. Y obviamente también se crea la caja. También se le aplican transformaciones para ubicarla donde debe quedar y completar el efecto deseado.
  13. Finalmente se compila y se retorna la rama.

Con esto es suficiente para poder utilizar agua en cualquier proyecto con Java 3D que se desee, basta con copiar el método. Pero esa no es la gracia tampoco. Además del método crearAgua() lo único que hay en la clase Agua es su constructor y el método main(). En el constructor se configura el layout de la ventana y se crea un Canvas3D para dibujar allí el universo, que también se instancia allí. Hay unas líneas que configuran el punto de vista del universo para que el agua se vea ligeramente desde arriba, y por último se agrega la rama del agua al universo llamando al método crearAgua(). En el método main() sólo se agrega el Applet devuelto por el constructor a un MainFrame para verlo en una ventana.

Ésta es una muestra del resultado final (la animación real es mucho más fluida y no se ve tan rítmica, pero sólo es para darse una idea):

Agua

Y con esto finalmente termina esta explicación para crear agua animada en Java 3D con la ayuda de Blender. Espero que sea de utilidad.

Anuncios
Categorías:Programación Etiquetas: , , , ,
  1. Alexander
    16 marzo, 2009 en 13:50
  2. Santiago
    20 diciembre, 2010 en 00:00

    Hola- Eh visto tu trabajo acerca del uso de Blender con Java 3d, desafortunadamente la ruta de descarga para tu ejemplo en Netbeans.. ya no esta… podrias subir la nueva ruta..

    Desde luego gracias…

    • 20 diciembre, 2010 en 11:29

      Ya actualicé el enlace, gracias por avisar.

  3. Santiago
    21 diciembre, 2010 en 00:38

    Muchas gracias Camarada:
    Eh podido descargar satisfactoriamente el archivo .Zip; voy a checar el codigo- estoy trabajando en la simulacion de una mano Robot; hay poca informacion al respecto, pero andamos probando, Muchas Gracias por tu apoyo.

    Saludos.

  4. f3rn4d0n
    8 diciembre, 2011 en 11:08

    Excelente programa, la verdad me sirvió mucho para una aplicación de un ajedrez en j3d

  5. Camilo Beabides
    15 mayo, 2012 en 10:53

    que tengo que tener en netbeans o que herramienta debo tener de 3d para poder correrlo con exito ! Agradesco me pueda colaborar

    • 15 mayo, 2012 en 22:14

      Para poder ejecutar el ejemplo se necesita el JRE o JDK y los binarios de Java 3D para el sistema operativo.

  6. Cami
    10 noviembre, 2015 en 17:14

    Hola Jorge Lu, ¿cómo estas?
    Quisiera saber si de nuevo podrías subir el ejemplo Agua.zip… Desafortunadamente no me descarga.
    Gracias (Y)

  7. 7 septiembre, 2017 en 11:45

    Gracias , me ha servido de ayuda !!

  1. 21 febrero, 2015 en 01:00

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: