# JMonkey Engine

jMonkey Engine (abreviado jME) es un motor de videojuegos libre orientado al desarrollo moderno de videojuegos en tres dimensiones. jME es uno de los engines 3D más completos escritos en Java.
jME es una API basada en árbol de nodos. La mayoría de la inspiración de jME proviene de David Eberly y su libro 3D Game Engine Design. Usando una capa de abstracción permite cualquier API de renderizado, adosable en forma de plugin. Actualmente LWJGL y JOGL ya son compatibles.
jME es completamente de código abierto, y se publica bajo la licencia BSD.
Fue creado por Mark Powell en 2003 mientras investigaba OpenGL. Después de descubrir LWJGL, decidió que Java (su lenguaje preferido) sería perfecto para crear sus propias aplicaciones gráficas. Estas herramientas pronto se convertirían en un motor primitivo. Después de leer el libro 3D Game Engine Design de David Eberly, implementó la arquitectura de grafo de escenas (árbol de nodos). Fue entonces cuando jME empezó a formar parte del repositorio de software Sun en Java.net. jME captó a desarrolladores que ampliaban sus funciones. Poco a poco jME adquirió modernos efectos gráficos y se convirtió en una plataforma estable para el desarrollo de videojuegos. Joshua empezó a formar parte de jME a finales de 2003 y se convirtió en uno de los programadores principales de jMonkey Engine.

## Características

jME está basado en una arquitectura de escenas de tipo árbol. Esto permite la organización de los datos del juego en un grafo de nodos, donde un nodo padre puede contener cualquier número de nodos hijos, pero un nodo hijo sólo contiene un único padre. Estos nodos están organizados espacialmente para permitir sencillamente descartar ramas de la estructura.
Por ejemplo, si se construye un grafo donde todos los objetos en una habitación comparten el mismo padre ("habitación") y todas las habitaciones comparten un padre ("planta"), donde todas las plantas comparten el padre "edificio". Los personajes están en la habitación 1 de la primera planta. Podemos fácilmente descartar el nodo de la planta 2 (y por lo tanto todas las habitaciones de la planta 2, y sus objetos hijos). Podemos entonces procesar la rama del grafo: planta 1. Todas las habitaciones que no sean habitación 1 serán descartadas, incluyendo todos los objetos en esas habitaciones. Procesando únicamente habitación 1 y sus objetos hijos.
Descartar puede significar un montón de cosas, pero la más importante en el desarrollo gráfico es hacer culling. El sistema de cámaras de jME usa la técnica culling para saber qué está fuera de la escena, y qué ramas no son visibles. Esto permite que escenas complejas sean renderizadas rápidamente sin renderizar todo aquello que no es visible.
Los nodos hojas (es decir, los nodos que se encuentran en los extremos de las ramas del árbol y que no tienen nodos hijos), son la geometría que se renderiza en pantalla. Pueden usarse muchos tipos de geometrías, como: líneas, puntos, modelos (Milkshape, MD2, ASE, OBJ, etc), terrenos, niveles de detalles y más. También se puede hacer uso de muchos efectos de alto nivel como: renderizado en textura, mapeo del entorno, lentes, tintado, sistema de partículas, etc.
jME provee al usuario de clases potentes y a la vez fáciles de usar para construir su aplicación.