jueves, 27 de enero de 2011

Toca seguir...

Hoy he recibido un duro golpe a nivel anímico, pero no pienso hundirme. Sé lo que quiero y sé el camino para conseguirlo y tarde o temprano llegaré.

La única buena noticia es que podré seguir dedicándole tiempo a Telemakhos.

P.D.: Por mis huevos que llegaré.

domingo, 23 de enero de 2011

Sobre shaders, asteroides y tiempo...

Llevo días viendo la mejor forma de diseñar los asteroides del juego. Además he cambiado las texturas del skybox, y he mejorado muchísimo el control de la cámara, ahora puedo desplazarme libremente por el espacio, aunque el movimiento es brusco para usarla en el juego, así que posteriormente tendré que diseñar otro movimiento más suave y que use inercias, para simular lo máximo posible los giros de una nave espacial.

Bueno, vamos al tema: LOS ASTEROIDES

Asteroides reales. NASA.


Primero pensé en hacerlo proceduralmente sobre la CPU: partir de un cubo con 4 vértices por cara, alejar cada uno de esos vértices del origen del eje de coordenadas la misma distancia (r), para generar una esfera a partir de un cubo. Luego aplicar LOD a cada cara del cubo (esfera), generando dinámicamente más subdivisiones dentro de la cara y aportando asi mas detalles. Para la geometría del asteroide, usé valores pseudoaleatorios para modificar las alturas, que no es muy acertado, y tampoco liberaba los vértices creados al acercarse la cámara cuando ésta se aleja. Resultado: un desastre, se procesaba lentamente (puesto que todo el cálculo era sobre la CPU) y el aspecto era feo. Esta claro que fue un primer prototipo y podría mejorarse muchísimo.

La principal mejora en cuanto a rendimiento que pude haber añadido fue el uso de shaders y pasar todo este cálculo a la GPU, y en cuanto a la apariencia del asteroide, una buena idea podría haber sido usar Ruido Perlin, tanto para los mapas de altura como para las texturas. El principal problema que me encontré en este punto, era que para que mi proyecto tuviera asteroides procedurales tendría que aprender a programar los shaders, y aún me falta algo de dominio con los shaders. Y el principal problema que tengo es el tiempo. Se que tendré que aprender a fondo los shaders tarde o temprano, y realmente tengo ganas de empezar con ello. Pero mi juego esta bastante en pañales en algunos aspectos, y si me meto con los shaders no se cuando terminará. Prefiero recurrir a otros métodos y una vez terminado, mejorarlo o tomarlo como punto de partida para un nuevo proyecto que use shaders.

Mi única alternativa factible era generar los asteroides de forma estática con algún programa (Blender) e importarlos dentro del juego. A consecuencia de esto, se que los asteroides no serán tan reales como me gustaría, y que además apenas podré utilizar técnicas de LOD (Level Of Detail), pero a favor tengo que he ganado bastante tiempo de cara al programa.

Los asteroides los estoy diseñando en Blender y uso Ruido Perlin para deformarlos a mi gusto y una textura para envolver todo el asteroide, todo esto desde Blender. A continuación dejo una captura de uno de estos asteroides:


Detalla del asteroide, deseño en Blender usando Ruido Perlin.

En lo siguiente que estoy pensando ahora es cómo colocar en el espacio estos asteroides, y quiero intentar utilizar técnicas de frustum, agrupando espacialmente los asteroides en sectores con forma de cubo, para así poder usar de forma eficiente técnicas de frustum culling.

A continuación muestro un vídeo con algunos de estos asteroides "hechos a mano" rotando en el espacio. En el vídeo, asi como en la imagen anterior se aprecia el fondo nuevo que he puesto.



Pasado, presente y futuro:
Como comienzo no esta mal, dentro de lo que cabe me doy por satisfecho, pero quiero llegar a conseguir asteroides MUCHO más realistas, en cuanto a forma: (cráteres, más detalles al aproximarnos, aplicar técnicas de LOD), sombreado: tanto en el propio asteroide, como proyectadas en otros asteroides), así como: detección de colisiones, choques, fragmentación, etc, etc.

Además me gustaría reorganizar mejor todo el engine, limpiar y optimizar el código todo lo posible.

Próximamente más.

domingo, 12 de diciembre de 2010

Skybox

Para hacer un juego/simulador espacial, es un requisito obligatorio que al moverte y girar sientas que estas sumergido en el espacio, dicho de otra forma: tienes que ver estrellas, nebulosas, y todas esas entidades espaciales que esperamos ver.

Una posible técnica es usando un skybox, la cual consiste en colocar todo el contenido de tu juego/simulador dentro de un cubo y texturizar sus caras interiores con imágenes del espacio, como a modo de decorado. Esta técnica parece algo pobre, pero los resultados que se obtienen al elegir cuidadosamente las texturas de sus caras interiores, son realmente buenos.

Skybox reducido en tamaño y con caras numeradas a modo de ejemplo.

Para tener una idea de cómo quedaría pongo un video que capturé a modo de ejemplo. Actualmente no estoy usando las mismas texturas del ejemplo.

martes, 30 de noviembre de 2010

Recapitulación

He estado llenándome los ojos de vídeos de otros proyectos muchísimo más ambiciosos que el mio, y junto con lecturas que he hecho sobre fractales, concretamente sobre generación de terreno fractal, mi mente esta como loca ideando asteriores fractales..., mundos fractales..., universos fractales... Y veo que si sigo así, me perderé por los cerros de Úbeda.

Llegado a este punto tengo dos opciones, o sigo adelante probando cosas nuevas, o recapitulo y amarro bien lo que tengo conseguido hasta ahora.

Hasta ahora los temas que debería terminar y pulir son:

  • Inicialización del API (DirectX 9).
  • Inicialización del Engine 
  • La cámara, mejorar muchísimo su uso.
  • Añadir interacción con periféricos: Teclado, Ratón, Pad
  • Generalizar la lectura de objetos desde X3D, cerrando ya este tema.
  • Generar un formato propio que me permita englobar en un mismo archivo todo lo necesario para representar un objeto.
  • Generalizar las luces en el engine a través del API.
  • Generalizar la parte de render, embeber dentro de los objetos las instrucciones para renderizarlos.
Y más cosas que seguro que me dejo atrás.

Sólo una vez que tenga todas estas partes básicas podré ir más allá, y también empezar a darle forma al juego definitivo.

También tengo que seguir con la acotación del juego, puesto que mi meta es terminar algo, aunque sea una demo de algo más grande.

Actualizacion: Es buena idea hacer un programa visualizados/conversor/agrupador, para ver los modelos hechos en Blender, añadirle texturas y demás, ver como queda y almacenarlo en un formato propio.

domingo, 28 de noviembre de 2010

Progresos con Telemakhos III: Texturas

Hecho!

Aunque aún me faltan muchísimos conocimientos sobre texturas, me siento muy satisfecho de conseguir hacer funcionar las DirectX 9 con alguna textura.

Después de muchos cambios en las rutinas de lectura de ficheros .X3D por fin conseguí echar a andarlas en DirectX. El principal problema que me encontré fue que yo utilizaba hasta el ahora vértices indexados, de esta forma una misma esquina de un triángulo podía estar compartida entre varios triángulos.

Ahora bien, para implementar texturas, cada vértice del objeto deberá contener dos coordenadas (u, v) que indicarán que parte de la textura será proyectada. Esto provoca que para mapear objetos algo complejos, los vértices del mismo no podrán compartir coordenadas (u, v), puesto que los más probable es que las texturas para objetos complejos esten compuestas de varias subtexturas separadas entre si dentro del archivo gráfico.

Ejemplo de textura fragmentada.
El mayor problema de esto es el mayor gasto de memoria al tener que almacenar un mayor número de vértices.

Para este ejemplo utilicé el mismo objeto .X3D de esta ahora, y como textura usé una imagen cuadrada con una de las caras del famoso cubo de Hellraiser.



En mi ordenador la animación es muy fluida y la calidad muy buena, aunque al generar el video se pierda mucha calidad. En fin, aqui dejo el video:



Bueno, hasta ahora he avanzado mucho, incluso más que nunca, puesto que con opengl nunca llegué a mostrar textura alguna. Y verlo funcionando es realmente emocionante.