Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Introduccion Desarrollo Juegos Celulares
Introduccion Desarrollo Juegos Celulares
Sistema de coordenadas
El sistema de coordenadas es totalmente diferente al que se usa para las imgenes bidimensionales. Para empezar, cada punto de este se representa con tres valores (X, Y, Z), adems el origen (0, 0, 0) se encuentra ahora en el centro de la pantalla y el eje Z se incrementa hacia fuera de la pantalla y disminuye hacia el interior de esta, como puede verse en la Figura 1 (haciendo la abstraccin de que el eje Z se encuentra a 90 de los otros dos, es decir, atraviesa la pantalla).
Y g
g
X g g
Z g g Figura 1 Cabe destacar que los valores de cada eje no son int como los pxeles 2D, sino que sern float.
Vectores
Para evitar complicaciones matemticas, simplemente se dir que un vector ser un arreglo de nmeros float de tres (3) posiciones (X, Y, Z); los valores que tengan las casillas representan la direccin, sentido y magnitud del vector, y pueden operarse matemticamente para generar resultados tiles en juegos ms avanzados, por ahora slo basta con saber que es un vector, en este contexto. Para las personas que tienen mayores conocimientos en lgebra Lineal y operaciones con vectores, se tienen los mtodos void vectorNormalize(float vector[]) y void vectorCrossProduct(float vector1[], float vector2[], float vectorResultado[]) los cuales normalizan un vector (reduce su longitud a 1) y realizan el producto cruz entre dos vectores (genera otro a 90 de los dos operados), respectivamente.
Adems de estos, se han desarrollados otros 3 mtodos para obtener la posicin determinada por una transformacin dentro de un vector (void obtenerPosicin(Transform transformacin, float [] arreglo)), para obtener la direccin en la que apunta la transformacin, tambin dentro de un arreglo de 3 casillas (void obtenerDireccin(Transform transformacin, float [] arreglo)) y para llevar una transformacin a un punto exacto indicado por un arreglo de 3 casillas (void posicionar(Transform transformacin, float [] arreglo)).
Hay que hacer tres aclaraciones en el cdigo. La primera es que el color se escribe en formato de nmero hexadecimal, para ello se escribe 0xRRGGBB en donde RR es el componente rojo del color, GG el verde y BB el azul, estos valores pueden verse en la ventana de seleccin de colores de Gimp en la de Microsoft Paint, solo que este ltimo los da en valor entero (formato decimal), por lo que estos nmeros deben pasarse a hexadecimal, lo cual puede hacerse con la calculadora de Windows. La segunda aclaracin es en el parmetro del mtodo setIntensity(), pues al final tiene una f, esto simplemente indica que el valor escrito es un float. Finalmente se tiene un componente Graphics3D (llamado graficador), el cual contiene los elementos de una escena 3D y los dibuja en la pantalla, si es preciso. Segn se avance se ir viendo cmo se agregan y dibujan los componentes 3D con este.
Figura 2
El siguiente fragmento de cdigo, que se encuentra en el archivo Juego3D.java crea una cmara con un Campo de Vista de 45, un Aspect Ratio que cubre toda la pantalla, un Plano Cercano de 0.1, un Plano Lejano de 1000 y una ubicacin en el punto (0f, -1.5f, 1f), debido a que cuando se crea una transformacin, esta tiene su ubicacin inicial en el origen, as que la primera translacin que se le haga la lleva al punto que se indica en el mtodo postTranslate(), luego de ello, para ubicar una transformacin en un punto especfico debe usarse el mtodo posicionar().
public void iniciar(){ //Crea una nueva cmara cmara = new Camera(); cmara.setPerspective(45.0f, (float)ancho/ (float)alto, 0.1f, 1000.0f); transformacinCmara = new Transform(); transformacinCmara.postTranslate(0f, 0f, 1.5f); graficador.setCamera(cmara, transformacinCmara);
Componente Graphics3D
Como ya se ha visto, es el que contiene elementos esenciales para visualizar la escena 3D (la cmara y la luz) y como se ve en el mtodo dibujar() es el que se encarga de dibujar (en el caso de modelos 3D se le conoce mejor como Render, no como dibujar) los componentes grficos 3D que se tengan. Para hacer este Render se cuenta con dos mtodos: void render(World mundo3D): se usa cuando se tienen todos los elementos (cmara, luz, modelos 3D, etc.) dentro de un solo archivo .M3G, es decir la escena se prepar completamente en una herramienta modeladora 3D, y se les quiere dar un manejo conjunto a todos, a esto se le conoce como Retained Mode Rendering. No es el caso de este juego. void render(Node nodo, Transform transformacin): posiciona un nodo (una malla o un grupo) en la pantalla, de acuerdo a la transformacin dada. Se usa cuando los modelos 3D o los grupos vienen de diferentes archivos o se les quiere dar un manejo individual a la hora de hacer el render, es por eso que se pide la transformacin como parmetro, a esto se le conoce como Inmediate Mode Rendering. En el siguiente tutorial se explicar que es una malla y un grupo. Otros mtodos del graficador usados en dibujar() son: bindTarget() separa al componente Graphics para que se dedique a recibir los objetos 3D, clear() usa un componente Background (fondo) para limpiar la pantalla poniendo este encima de lo anterior, similar al que se pona en el juego Frogger (en este caso es un fondo negro) y finalmente releaseTarget() se asegura que el componente Graphics dibuje los elementos 3D a los que se les haga Render y lo libera para que pueda dibujar otros elementos 2D.
Al ejecutar el proyecto se ver una pantalla negra, como la que se ve en la Figura 3. En la prxima gua se mostrar cmo agregar modelos 3D a la escena.
Figura 3
Ejercicio Propuesto:
El componente Background tambin puede limpiar la pantalla poniendo una imagen (PNG) como fondo, en lugar de un color fijo. Esta imagen no se mover ni tendr ninguna otra modificacin, sin importar que es lo que se haga en la escena. Esta imagen debe ser del tipo Image2D (no confundir con Image), puede cargarse usando el mtodo Image2D cargarImage2D(String ruta) y se asigna como fondo invocando el mtodo setImage(Image2D imagen) de Background. Se propone entonces buscar una imagen y ponerla como fondo del juego.