lunes, 5 de mayo de 2008

Programa tu 3D engine

JKS [jksware@gmail.com]

Ahora que dispongo de tiempo libre – digo suficiente tiempo libre como para escribir del tema que les muestro a continuación – desde que me decidí finalmente a leer una de las páginas de la entonces “única” revista GiGA que por allá por el 2002-2003 (¿quién se acuerda, hasta internet se podía proxiar por sld.cu?) conformó lo que sin duda fue para mí un artículo clave e introductorio a lo que es el vasto (y universalmente remoto para el resto de los seres humanos ajenos al tema) mundo del 3d, me resumo a explicarles mis experiencias en la realización de un “motor” de renderización de 3D mediante algoritmos básicos.


Para entrar en materia podría decir que el artículo que leí en aquel tiempo hace referencia a lo que se podría llamar “construya su propio motor 3d” o más bien, es algo más parecido a “aquí les doy una herramienta matemática, rómpanse la cabeza tratando de adivinar dónde va…”. Me refiero al artículo publicado en GiGA número 6 año 2002 titulado “Dentro de la tubería gráfica” de Eduardo Lago Aguilar de la UCLV.

ABSTRACT

Para comenzar, debería dar una introducción a lo que se le nombra llanamente 3D: para la mayoría de los casos (y de los usos) esto no es más que la representación por medio de una proyección vectorial bidimensional de lo que es en sí un conjunto de valores gráficamente representables que se hacen ubicar en una matriz arreglada de tres ejes fundamentales (x, y, z). En otras palabras, a lo que llamamos “mira el 3D de ese juego” no es más que una mera proyección (y vuelvo con el término: dibujo o representación) de lo que verdaderamente hace verse la imagen en nuestras pantallas, un grandísimo conjunto de puntos (vértices) que en parejas forman líneas (aristas) y en tríos forman triángulos (polígonos) que conforman cada una de las imágenes que se pueden generar por simulación computarizada.

¿Por qué digo simulación, si en definitiva se está “viendo” el 3D? Es porque el simple hecho de ser arrojadas sobre una pantalla no concede al ojo toda la información visual que necesita para pasársela al cerebro y poder conformar una verdadera imagen tridimensional de lo que se está viendo.

¿Pero si los ojos humanos ven igual de bien a través de un monitor común o LCD que en la vida real? Si por ver se define que es la calidad de lo que se está viendo, con respecto a la cantidad de elemento por separado (píxeles) u otros factores quizá coincida con el que formule la pregunta, pero no es el caso. Sin entrometerme mucho en el área de los optometristas, les dejo caer a aquellos que no tengan idea del fenómeno, que la visión por medio de ambos ojos no recoge dos sino tres valores de posición del objeto que sea centro de atención de los mismos, uno de ellos es la profundidad, por lo tanto podemos decir que todo aquel que tenga ambos ojos sanos puede apreciar en tres reales dimensiones lo que sea objeto de observación.

Para no continuar haciendo del artículo un FAQ, paso a decirles que existen varias maneras de llevar esta realidad tridimensional al pobre mundo bidimensional de nuestros monitores. Claro que existen laboratorios en el mundo (como aquellos magníficos modelos de realidad virtual que se alojan como proyectos de física en el MIT – Massachusetts Institute of Technology) que acogen monitores que son capaces de simular con aún más realismo, o de por qué no, llevar al plano físico en que vivimos una escena en tres dimensiones creada por ordenador, pero no es el caso de todo lo que probablemente cada uno de nosotros veamos en al menos un par de años.

La manera más antigua de hacer este tipo de representaciones se la podemos atribuir a los ingenieros civiles y pintores que han legado en Europa al resto del mundo la manera más eficaz de por aquellos tiempos “renderizar” una escena determinada. Me estoy dirigiendo a lo que no por coincidencia aprendemos (mal que bien) a hacer en secundaria básica y que llaman los profesores de las asignaturas técnicas de “dibujo” de algunas de nuestras carreras de ingeniería “representación isométrica”.

Este es el modelo más fácil de llevar a la realidad y nuevamente no es coincidencia sea en el que se basan todos los juegos de estrategias habidos y por haber de antes de la era del Warcraft 3 (incluso nuestro emblemático Starcraft usa este tipo de gráficos). En pos del espacio no me refiero más a las proyecciones isométricas, sino a sus primas hermanas que devinieron con el consenso de lo que se “parece” más a la realidad, las proyecciones en “perspectiva”.

La proyección perspectiva concede el don a la isométrica (de cuyo nombre se deriva que todo objeto de iguales dimensiones que se represente en cualquier punto tenga iguales medidas a otro idéntico en otro punto) de aprecia la lejanía de un objeto en el espacio. Esto hace que dos objetos iguales no sean observados por igual (de igual tamaño aparente) cuando se encuentran a diferentes distancias del observador. Con sólo mirar el horizonte creo que acierto el punto. xD

THREE-DIMENSIONAL ENGINE

Cuando al principio del artículo me refería a un motor de renderización, quizá pasé por alto un par de asuntos importantes a tener en cuenta, y aunque no creo que desilusione a los más entusiastas, si puede hacerlos pensar por un momento.

Cuando hablamos de un motor (o un 3D engine por su original en inglés) me refiero no a lo que hace que en un juego se disparen los tiros, se oiga el sonido de alguien hablando, se mueva la cámara o se acelere un automóvil tuneado, sino a lo que está detrás de todo la interface de usuario del juego y que es por lo general un motor de representación; hace que la “cámara” se “vea” en nuestro monitor, que las ruedas del automóvil se las vea moviéndose o que aún mejor, nuestros cuadros por segundo (FPS – Frames per Second) se sientan drásticamente reducidos a 12 cuando estamos contemplando efectos de partículas, como smog, tierra, chispas, humo, agua, o cualquier otra cosa que atente contra nuestro GPU (Graphic Processor Unit) en grandes cantidades.

Entonces sacar a relucir que el mundo de los engine está realmente avanzado a hace un par de años, que pasó de caminar a la velocidad de una locomotora de vapor de la época de los 80 a un tren bala de 400 km/h con juegos como Call of Duty (CoD) 4 o Crysis, no está realmente aportando nada nuevo al asunto. Así que si ve que por mucho que programe incluso delante de un engine más que probado como DirectX, no obtiene los mismos resultados que en un súper-comercial Halo 3 no se desilusione, cálmese, y tómese un té con tío Linus, o mejor aún, mándele un mail a los de Frets on Fire (juego de guitarra GNU programado en Python nativo para Linux, pero que ha sido migrado a Windows y que utiliza a OpenGL de motor), y pregúntenle como les ha ido a ellos con los frame-drop.

THAT´S ALL FOR TODAY

Dependiendo del impacto directo que tengan estas informaciones en los lectores, y de la retroalimentación (feedback suena mucho mejor) que tengan estos en nuestros correos electrónicos, me dispondré a entrar en la verdadera materia (tortura diría para abreviar) de cómo hacer la programación de una sencilla representación tridimensional sobre un plano en Object Pascal (para todos los casos Delphi).
Lo mismo sucederá con unos artículos que le debo a la comunidad acerca del Dual Boot, que dependiendo de la cantidad de correos que se reciban en “nuestros servidores” alegando la reclamación del tema llegaré o no a completarlos.



Artículos relacionados


No hay comentarios: