6 sept 2004

6/9/04: Trabajando duro

Diario de Guerra de Alejandro González, Alias "WaaghMan". Vigesimonovena anotación:



Hoy ha sido un día de trabajo duro en el que he hecho muchas cosas, unas más fáciles que otras.



Como dije ayer, comenzé por programar la clase móvil, que fue una pijada muy simple, como lo era en la asignatura de Física en la ESO :).



Después le tocó el turno a la clase DetectorColisiones, que no tuvo demasiadas dificultades porque fue simplemente adaptar el código feo del LittleEngine original a la versión super-chula-orientada-muy-bien-a-objetos del nuevo motor.



Se supone que tendré que añadirle lo de las elipses, pero por el momento lo dejo así.



Después, le tocó el turno a la clase Texto, que también fue simple de hacer cogiendo gran parte del código del LE original.



Tras eso, y con un programa muy chulo llamado Bitmap Font Builder, me monté una fuente bastante guapa, y hice unas cuantas pruebas de las cosas a ver si tiraba.



Entonces, me dio por visitar la web del autor de ese programa, y encontré un juego en OpenGL llamado disasteroids 3D, con código fuente incluido. Lo descargué a ver si veía alguna técnica chula que pudiese aplicar en el motor, y vi que el juego era basurilla en cuanto a jugabilidad, pero los efectos gráficos estaban bien conseguidos.



Mirando el código vi que gran parte se conseguían simplemente deformando y coloreando texturas, cosa que se puede hacer sin problemas en mi motor, y utilizando iluminaciones.



Así pues, decidí hacer mi motor compatible con la iluminación :).



Esto no es tan fácil como parece, y tras programar durante un buen rato las cosas, al probarlas no funcionaba bien. Tras pelearme otro buen rato y encontrar el motivo, me di cuenta de que la iluminación no funcionaba como debería. Es decir, funcionaba como debería en un juego 3D, pero no en uno 2D.



La cosa es simple: La iluminación se basa en que partes de una oscuridad total, y vas iluminando zonas aplicando fuentes de luz.



En el caso de las texturas, si haces esto muchas de ellas quedarán muy desmejoradas al no tener volumen, y la cosa no sería bonita. Tras mucho romperme la cabeza con la interminable lista de parámetros y variables, llegué a una solución parcial: La escena comienza iluminada a tope (más fácil de decir que de hacer), y las luces lo que hacen es proyectar sombras de los colores que no poseen (es decir, una luz roja lo que hace es proyectar sombras verdes y azules).



Esto también es costoso, y sigue sin ser del todo efectivo, porque al iluminar sobre un color oscuro no se ilumina, sino que se oscurece aún más. Pero en general es suficiente.



Otro fallo es que como una textura son sólo dos triángulos, la iluminación es mucho más efectiva en los bordes que en el centro, porque en el centro no hay vértices. Podria programar las texturas para que tuviesen más vértices y así la iluminación sería mejor, pero entonces requerirían al menos 4 veces más triángulos para mostrarse :S.



Así que por el momento así queda. Tenéis el diagrama UML aquí y el programa de ejemplo, que me da unos 800 fps, aquí



Ahora marcho a cenar. Toy cansado pero contento :).

No hay comentarios: