13.1. En el directorio Prueba3D
de las plantillas
de la sesión podemos encontrar un ejemplo de aplicación M3G. En
ella podemos ver un ejemplo de modo inmediato y otro de modo retained.
Consultar el código y probar el ejemplo. Para poderlo probar necesitaremos
al menos WTK 2.5.
Una vez probada la aplicación, vamos a realizar una serie de modificaciones
en la parte del modo retained (Visor3DRetained
). Se pide:
a) Realizar una función recursiva que explore e imprima en la consola todos los elementos del grafo de escena cargado. Deberá mostrarse para cada elemento el nombre de la clase a la que pertenece y la lista de sus hijos. De cada uno de estos hijos deberá mostrarse la misma información, y así recursivamente hasta explorar todo el arbol.
b) Hacer que la aplicación cargue el contenido del fichero mundo.m3g
que se encuentra entre los recursos de la aplicación, en lugar de caja.m3g
.
Comprobar que la nueva escena se visualiza correctamente.
c) La escena se ve algo oscura. Añadir luz ambiente con intensidad 0.8
para mejorar la visibilidad. Para ello se deberá añadir el correspondiente
objeto Light
al grafo de la escena.
d) Dar la posibilidad de navegar por el mundo de forma subjetiva, utilizando para ello las teclas del cursor. Para hacer esto deberemos objeter la cámara activa del mundo, y transformar su posición según las pulsaciones de las teclas. Para girar la cámara deberemos hacerlo alrededor del eje Y, ya que este eje es la altura en el mundo 3D y esto nos hará girar a la izquierda o a la derecha.
RECOMENDACIÓN: Será conveniente tener nuestro ángulo actual
almacenado en un campo de nuestra clase. Podemos inicializar la cámara
con ángulo 0º alrededor de Y, utilizando para ello el método
setOrientation
. Cada vez que se pulsen los cursores izquierdo o
derecho, se modificará el ángulo actual, y se establecerá
este ángulo en la cámara utilizando ese mismo método.
Para avanzar o retroceder, deberemos hacerlo en la dirección en la que
estemos mirando. Para ello se deberán utilizar las funciones cos
y sin
de la clase Math
sobre nuestro ángulo
actual, para avanzar la correspondiente distancia en los ejes X y Z.
NOTA: Se debe llevar cuidado, ya que la función setOrientation
trabaja con ángulos en grados, mientras que cos
y sin
lo hacen en radianes. Se deberán utilizar los métodos toRadians
y/o toDegrees
de la clase Math
para convertir entre
ambas unidades.
e) En lugar de manejar la cámara subjetiva, vamos a hacer que lo que
se maneje mediante los cursores sea el coche que aparece en la escena. El grupo
de objetos que componen el coche está almacenado en el fichero M3G con
el identificador 101. Podemos localizar un determinado elemento mediante su
identificador utilizando el método find
del mundo.
Localizar el objeto del coche, y hacer que las transformaciones se apliquen a este objeto, en lugar de a la cámara activa, para conseguir de esta forma que lo que se mueva sea el coche.
NOTA: Es posible que haya que intercambiar las funciones sin
y
cos
y sus signos para que el coche se mueva en la dirección
y sentido correctos, ya que la orientación con la que está almacenado
el coche en el fichero es diferente de la de la cámara.
f) El grupo del coche, a parte de las piezas que lo componen, incorpora una cámara con la que se ve el coche desde detrás. Vamos a hacer que la cámara siga el coche conforme lo movemos. Para ello estableceremos como cámara activa la cámara del coche. Esta cámara tiene un identificador 102.
g) Al movernos por el mundo podemos ver que el plano de corte posterior de
la cámara es demasiado cercano, y esto produce que los objetos sólo
aparezcan cuando nos acercamos lo suficiente. Hacer que el plano de corte posterior
sea más lejano (utilizando el método setPerspective
de la cámara), para que podamos ver los tres molinos al mismo tiempo
desde un punto lo suficientemente lejano.
h) Cambiar el fondo del mundo por un fondo de color anaranjado.