Sei sulla pagina 1di 4

Panda3D DESARROLLO

CAMPO DE JUEGO VIRTUAL

Mundos 3D con Python y Panda3D

Muchos motores libres para juegos estn disponibles para usuarios de Linux, pero la programacin con ellos suele ser poco intuitiva. Panda3D es un motor muy fcil de usar y accesible para recin llegados, sin dejar de ser lo bastante potente para los profesionales de los estudios Disney. POR OLIVER FROMMEL
os inventores del ratn Mickey y el pato Donald ya haban montado unos cuantos parques temticos en la vida real para cuando decidieron aventurarse en el mundo del entretenimiento virtual de Internet. En el ao 2000, los programadores de los Disney VR Studios empezaron a crear una aplicacin de software para ayudarse a desarrollar su propio juego online en 3d: Toontown. El resultado de este trabajo es Panda3D [1], un motor de juego que soporta el lenguaje de programacin Python. En 2002 Disney public el paquete bajo una licencia libre para facilitar la contribucin de las universidades al proyecto. Un motor de juego como Panda3D saca el trabajo repetitivo (como cargar personajes y sonidos, control bsico del movimiento y algunas otras cosas) de las manos del programador. El hecho de que estas funciones estn programadas bajo

C++ garantiza que el resultado ser lo bastante fino. Los programadores que confen en Panda3D podrn acceder a su infraestructura va Python, mucho ms intuitivo y fcil de usar que C++.

Comenzando
El motor Panda es fcil de instalar, siempre que tengas una distribucin basada en RPM o DPKG. El paquete Debian de la pgina del proyecto tambin es fcil con el ltimo Ubuntu. Todo lo que hizo falta para tener Panda funcionando fue un link simblico de /usr/lib/libssl.so.0.9.8 a /usr/lib/libssl.so.0.9.7. En los dems casos tendrs que instalar Panda a partir del cdigo fuente. Aunque esto no tiene mucha importancia, se lleva un rato, y hay un buen nmero de dependencias en paquetes de desarrollador que cubrir (Open SSL y LibTIFF, por ejemplo). Cambia el directorio a panda3d-1.2.3 para la instalacin, y arranca makepanda/makepanda.py everything. Si se te olvida el

ltimo parmetro, Makepanda har una lista con las diferentes opciones de instalacin. El archivo doc/INSTALL-MK incluye ms detalles. Los mundos virtuales bsicamente consisten en elementos geomtricos simples que resultan ms verosmiles cuando se les aplican ciertas texturas (es decir, imgenes de objetos reales). El realismo no siempre es el objetivo: por

Listado 1: Un sencillo script de Panda


01 import direct.directbase.DirectStart 02 03 panda = loader.loadModel(models/panda ) 04 panda.reparentTo(render) 05 panda.setPos(0,30,-5) 06 07 run()

WWW.LINUX- MAGAZINE.ES

Nmero 25

49

DESARROLLO Panda3D

informtica, se trata de un grfico que contiene y jerarquiza los objetos mostrados en escena. En cualquier caso, toda

Listado 2: Moviendo la cmara


01 import sys 02 import direct.directbase.DirectStart 03 from direct.actor import Actor 04 from direct.showbase import DirectObject 05 06 class Game(DirectObject.DirectObject ): 07 angle = 0 08 distance = 0 09 def __init__(self): 10 self.panda = loader.loadModel(models/panda ) 11 self.panda.reparentTo(render) 12 self.panda.setPos(0, 1000, -100) 13 self.panda.setScale(0.5, 0.5, 0.5) 14 15 self.accept(escape , sys.exit ) 16 self.accept(arrow_right, self.spinCamera, [1]) 17 self.accept(arrow_left, self.spinCamera, [-1]) 18 self.accept(arrow_down, self.zoomCamera, [1]) 19 self.accept(arrow_up, self.zoomCamera, [-1]) 20 21 base.disableMouse() 22 base.camLens.setFar(10000) 23 24 def spinCamera(self, direction): 25 self.angle += direction * 1.0 26 base.camera.setHpr(self. angle, 0, 0) 27 28 def zoomCamera(self, direction): 29 self.distance += direction * 10.0 30 base.camera.setPos(0, self.distance, 0) 31 32 game = Game() 33 run()

Figura 1: Toontown, el juego online de Disney, se implement usando el motor libre Panda3D.

ejemplo, Toontown emplea un estilo de personajes cercano al cmic (ver Imagen 1), aunque esto no influye para nada en la distincin entre geometra y propiedades de la superficie en un modelo 3D. Los modelos suelen estar dibujados en programas especialistas para, posteriormente, convertirlos a un formato que un motor 3D pueda manejar. Hay plugins de exportacin para el formato que usa Panda3D en herramientas profesionales de Windows como Maya, 3dStudio Max y Softimage XS. Milkshape (un programa shareware) ofrece una til alternativa para los usuarios caseros: muchos lo utilizan para editar modelos de Quake. Los usuarios de Linux no tienen mucha eleccin aqu, ya que Blender 3D es la nica opcin a mano. Lamentablemente, no soporta el formato de Panda3D (tambin conocido como Egg) por defecto. Para aadir soporte para Egg, tendrs que instalar uno de los tres plugins que existen para Blender, y todos ellos tienen limitaciones. El ms maduro de todos es Chicken [2], del desarrollador de Peruvia, Daniel Amthauer. Mientras se escriba este artculo, Daniel lanz la versin mejorada 1.0a, que ahora incluye documentacin muy til (Imagen 2). Para instalar Chicken, descomprime el archivo zip en tu directorio .blender/ scripts. Ahora lanza Blender; deberas encontrar la opcin de exportar a Egg en File | Export | Chicken.

ruta de instalacin por defecto de estos archivos es /usr/share/panda3d/models. Un script de Panda3D extremadamente simple carga y muestra un modelo (Listado 1). El resultado de esto se muestra en la Figura 3. El script comienza cargando el modelo bsico de Pyhon direct.directbase.DirectStart, lo cual vuelve disponible un cargador de objetos. El objeto provee el loadModel que finalmente cargar el modelo. Como puedes ver, aqu dejo fuera la extensin .egg, ya que el motor no necesita la extensin para encontrar lo que busca. La funcin de carga devuelve un objeto Python que puede usarse como referencia del modelo cargado a lo largo del programa. El setPos() cambia la posicin del modelo en el espacio 3D. La primera variable representa las coordenadas X, seguidas por Y y Z. De manera similar, setScale() escala el objeto en tres dimensiones: en el sistema de coordenadas de Panda, X puntos a la derecha, Z hacia arriba e Y hacia dentro de la pantalla, desde el punto de vista del usuario. Ahora puedes usar el ratn para rotar, mover y escalar el modelo. Prueba los tres botones. La rotacin puede parecer un poco extraa al principio; la razn para ello es que el eje de rotacin queda fuera del modelo.

El rbol de la Escena
No he explicado todava la Lnea 4 del Listado 1. Se apoya en un concepto bsico de los grficos tridimensionales por ordenador: los grficos de escena. Desde el punto de vista de la ciencia

Creando un Mundo
Los archivos de ejemplo te irn bien para tus primeros pasos en el motor 3D; la

50

Nmero 25

WWW.LINUX- MAGAZINE.ES

Panda3D DESARROLLO

yen su posicin en la escena, el ngulo de uno o de los tres ejes, la distancia del foco y otras muchas cosas. El ejemplo en el Listado 2 muestra cmo mover la cmara para cambiar la visin del modelo en uso en pantalla. Al mismo tiempo, Figura 2: El plugin Chicken de Blender exporta modelos al formato el ejemplo demuestra Egg de Panda. cmo Panda3D procesa las teclas que el esta teora no viene al caso para este usuario pulsa. Dado que es ms sencillo asunto; an as, trata de imaginarte un de manejar si tu programa Panda est rbol de la escena. basado en una clase que provea mtodos El modelo de un humano puede reprede teclado adecuados, este ejemplo est sentarse en un rbol de escena de tal orientado a objetos, al contrario que el modo que el trasero est en la raz del anterior. rbol, los brazos y piernas son las ramas, Para que las cosas sigan siendo senciy pies y manos son brotes. La ventaja de llas, la funcin completa reside en la este sistema es que los modelos con clase Game, dentro del objeto DirectObestructuras jerrquicas son ms fciles ject.DirectObject de Panda (Lnea 6). Para de mover en un cdigo. En nuestro ejemque esto pueda ocurrir, la Lnea 4 plo, si el cdigo de Python mueve el traimporta el mdulo requerido. El cdigo, sero, los miembros del modelo humano que previamente se ha listado al final del se movern, siguindolo, de manera script, mueve ahora la clase de construcautomtica. cin de Game __init__. A partir de este El mismo principio se aplica a los atrimomento, cuando un nuevo objeto butos de renderizado, que describen la Game sea creado mediante una llamada apariencia de la superficie del modelo. a Game() en la lnea 32, Python recurrir Por defecto, los elementos ms abajo en automticamente al constructor. el rbol heredan las propiedades de los Tras cargar, posicionar y escalar el nodos de que proceden. Por ejemplo, te modelo, necesitaremos algunas instrucbasta con definir el color del trasero para ciones para hacer que funcione la que se aplique el mismo color a los entrada de teclado. El mtodo accept() miembros. Siempre puedes cambiar la que ofrece el DirectObject se preocupa de apariencia y la subordinacin de los esto. Como la clase Game se deriva de nodos como t quieras. aqu, el mtodo es una instancia que Para asegurarte de que Panda3D mospuede ser direccionada mediante la trar los modelos que cargues, debes misma palabra clave. El primer parmeinsertarlos en la posicin bajo el objeto tro que solicita es una lnea con el nomde renderizado en el rbol de la escena. bre de la tecla que est pulsada. A esto le Y exactamente eso es lo que hace la sigue la funcin que queremos que Lnea 4 del Listado 1. Al final del script Panda3D ejecute cuando el usuario prepuedes ver una instruccin run(), que sione la tecla. Adems, la lnea 15 apaga comienza el bucle de evento; es un bucle el programa cuando se pulse [Esc]. infinito en el cual el programa funciona, Cmara actualiza la pantalla, procesa las teclas pulsadas, etc. Las siguientes cuatro lneas encargan el movimiento de la cmara a los cursores. Las Teclas y claves flechas izquierda y derecha utilizan el spinLa cmara muestra la apariencia de una Camera() (girar la cmara); arriba y abajo, escena en pantalla. Por supuesto es un zoomCamera() (acercar o alejar el punto de objeto virtual como todos los dems, vista). Cuando esta funcin pasa gracias al pero de todos modos tiene propiedades accept(), Panda puede aadir unos cuantos similares a una cmara real. stas incluparmetros ms para poder realizarla.

En el Listado 2, el nico parmetro que la cmara puede definir es la direccin del movimiento (1 y -1). En cualquier caso, an hace falta anotar el listado con corchetes. El disableMouse() (Desactivar ratn) con el mtodo Init apaga el movimiento automtico de la cmara. La ltima instruccin, base.camLens, utiliza la lente para definir el punto de superposicin (a partir del cual Panda3D ocultar las partes de los objetos que correspondan) a un valor de 10.000. Es igual de fcil usar la lente para modificar el foco, por ejemplo. Las funciones para mover y rotar la cmara se controlan con facilidad. Angle y distance (ngulo y distancia) se multiplican por un factor de correccin, y entonces se aaden (o se restan, dependiendo de la direccin) al valor actual. setHpr() y setPos() asigna el valor resultante a la cmara por defecto (a la cual puedes referirte en tus script como base.camera).

Movimiento
En nuestro ltimo ejemplo, movamos la cmara alrededor del oso panda, pero el oso en s estaba quieto. Se puede aadir ms accin con dos opciones que se complementan a la perfeccin entre s: mover el modelo a travs de la escena y moverlo solo.

Listado 3: Trabajo con fases de movimiento


01 def __init__(self): 02 self.panda = Actor.Actor(models/panda-mode l,{walk:models/panda-walk4 }) 03 ... 04 self.panda. reparentTo(render) 05 ... 06 07 self.accept(a, self. animate_start) 08 self.accept(s, self. animate_stop) 09 ... 10 11 def animate_start(self): 12 self.panda.loop(walk) 13 14 def animate_stop(self): 15 self.panda.stop()

WWW.LINUX- MAGAZINE.ES

Nmero 25

51

DESARROLLO Panda3D

Figura 3: Panda3D mostrando un modelo terminado, conseguido con slo 5 lneas de Python (Listado 1).

Figura 4: Rotacin y movimiento del panda. Una sola lnea de cdigo lanza el texto de ayuda (Listado 4).

Algunos movimientos, como andar, saltar, etc., se crean mejor en un modelador 3D como Blender. Deberas usarlo para disear las fases del movimiento y asignar armaduras al modelo para representar los huesos de un ser vivo. Tras hacer esto puedes animarlo a travs de puntos de movimiento individuales, igual que si fuera una marioneta. Tras exportar tus secuencias con Chicken, carga las fases de movimiento para mejorar el modelo bsico. Panda3D te ofrece la clase Actor con este propsito; esta clase reacciona ms o menos como un modelo normal, pero procesa, adems, fases de movimiento. El Listado 3 muestra un extracto de un programa que utiliza esta posibilidad. El primer parmetro de Actor, que especifica el modelo bsico, es seguido por un diccionario Python cuyas claves definen la fase del movimiento (walk) y cuyos valores corresponden a las secuencias del modelo (models/panda-walk4). Puedes entonces comenzar la animacin mediante el loop() habitual y repetirlo infinitas veces (Lnea 12). La funcin stop() detiene el movimiento: en nuestro ejemplo, las Lneas 7 y 8 asignan las teclas [A] y [S] a estas funciones. El movimiento en escena puede implementarse usando la funcin setPos() de la que antes hablbamos. En todo caso, Panda te ofrece una opcin mucho ms potente: los intervalos. Los intervalos dan a los programadores la posibilidad de, sencillamente, especificar valores de principio y fin y la duracin de las animaciones (es decir, posiciones, etc). Panda3D se encarga automticamente de los valores intermedios. El Listado 4 demuestra cmo puedes usar un intervalo para rotar el modelo cargado sobre su propio eje.

El primer parmetro del hprInterval especifica la duracin del movimiento en segundos. ste va seguido por el punto final y el principio del movimiento; en este caso, el ngulo de rotacin es de 360. Adems, el Listado 4 muestra, en la funcin createmenu(), cmo mostrar un texto de ayuda con una sencilla lnea de cdigo (Figura 4). Las tareas son otra de las caractersticas de Panda que ahorran trabajo al programador. El motor ejecutar cualquier tarea que registres en el gestor general de tareas de objetos, taskMgr; tanto da que se deba ejecutar en el momento o posponerla utilizando el comando doMethodLater(). Slo mencionar un par de posibilidades ms de Panda; todas ellas son bastante complejas. Por ejemplo, el programa tiene una funcin bsica de deteccin de colisiones para prevenir superposiciones poco realistas en modelos 3D en pantalla. Incluso tiene su propio motor fsico, el cual conforma la base de un comportamiento realista de los objetos asignndoles una masa. Las funciones

GUI que permiten crear mens tambin estn disponibles. Panda3D tiene, adems, un shader (funcin para dibujar sombras) que se ha vuelto bastante popular, aunque de hecho slo soporte el lenguaje de Nvidia Cg (preferible al standard de OpenGL, GLSL). Por desgracia, presenta un importante fallo para los fans del software libre: su motor de sonido interno. Panda3D utiliza FMOD, que no est disponible bajo este tipo de licencia. Por otro lado, Panda3D trabaja bien con otros frameworks; por ejemplo, puedes reemplazar la funcin de sonido con el paquete libre Pygame.

Mejora Garantizada
Si prefieres no usar lenguajes compilados como C++, podrs construir modelos 3D utilizando el potente y til motor Panda3D, que te librar de dolores de cabeza en tus primeros pasos en el modelado 3D. Con unas cuantas lneas de Python podrs cargar y animar modelos. La documentacin del sitio web incluye un simple tutorial y un manual que explica los conceptos y funciones ms importantes. Por contra, las referencias de clase y mtodo dejan mucho que desear. Afortunadamente, dado que Panda3D tiene una enorme comunidad de usuarios, las preguntas inteligentes se responden muy I rpido en el foro de la web.

Listado 4: Trabajo con intervalos


01 def rotate(self): 02 hprInterval = self.panda. hprInterval(4, Point3(360,0,0), startHpr=Point3(0,0,0)) 03 hprInterval.start() 04 05 def createmenu(self): 06 text = OnscreenText(text = a: animate, s: stop, r: rotate, esc: exit, pos 07 = (-0.8, 0.9), scale = 0.07)

RECURSOS
[1] Panda 3D: http://www.panda3d.org [2] Chicken, el exportador a Egg para Blender: http://damthauer.byethost32. com/panda [3] Pygame: http://www.pygame.org

52

Nmero 25

WWW.LINUX- MAGAZINE.ES

Potrebbero piacerti anche