14.04.2013 Views

13.3.4 Movimiento en Java 3D

13.3.4 Movimiento en Java 3D

13.3.4 Movimiento en Java 3D

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Java</strong> <strong>3D</strong><br />

Autores:<br />

Carlos de Tapia Miguel del Corral<br />

Aníbal Chehayeb Morán


Tabla de Cont<strong>en</strong>idos<br />

13.1 INTRODUCCIÓN ........................................................................................................5<br />

13.1.1 ¿Qué es <strong>Java</strong> <strong>3D</strong>? .............................................................................................5<br />

13.1.2 Objetivos..............................................................................................................5<br />

13.1.3 Cómo ver un objeto <strong>en</strong> <strong>3D</strong> sigui<strong>en</strong>do un grafo .........................................6<br />

13.1.4 Paradigma de programación..........................................................................7<br />

13.1.4.1 Modelo de programación del grafo de esc<strong>en</strong>a .............................. 7<br />

13.1.4.2 Aplicaciones y applets..................................................................... 7<br />

13.1.5 Explicación de la estructura de trabajo.......................................................8<br />

13.2 CONCEPTOS GENERALES..................................................................................10<br />

13.2.1 Objetos del grafo de esc<strong>en</strong>a.........................................................................11<br />

13.2.1.1 Objetos de la superestructura del grafo de esc<strong>en</strong>a .................... 12<br />

13.2.1.2 Objetos de agrupación de nodos.................................................. 13<br />

13.2.1.3 Objetos nodos hoja........................................................................ 14<br />

13.2.2 Otros objetos implicados..............................................................................16<br />

13.2.3 Construcción de un árbol .............................................................................17<br />

13.2.3.1 Grafos de esc<strong>en</strong>a ilegales ............................................................. 18<br />

13.2.4 Sistema de coord<strong>en</strong>adas...............................................................................19<br />

13.2.4.1 Coord<strong>en</strong>adas de alta resolución................................................... 20<br />

13.2.5 Modos de r<strong>en</strong>derización ................................................................................21<br />

13.2.6 Paquetes <strong>Java</strong> <strong>3D</strong>............................................................................................23<br />

13.3 MODELO DE CONTENIDOS .................................................................................24<br />

13.3.1 Sistemas de coord<strong>en</strong>adas y paquete javax.vecmath ............................24<br />

13.3.2 Formas geométricas.......................................................................................26<br />

13.3.2.1 Formas geométricas predefinidas ................................................ 27<br />

13.3.2.2 Construcción de elem<strong>en</strong>tos geométricos .................................... 28<br />

13.3.2.3 Texto 2D y <strong>3D</strong>.................................................................................. 33<br />

13.3.2.4 Ayudas a la construcción de figuras geométricas...................... 34<br />

13.3.2.5 Cargadores de esc<strong>en</strong>as <strong>3D</strong> ........................................................... 35<br />

13.3.3 Modificación de la apari<strong>en</strong>cia ......................................................................37<br />

13.3.3.1 Concepto de límite ......................................................................... 37<br />

13.3.3.2 Configuración del fondo................................................................ 38<br />

13.3.3.3 Apari<strong>en</strong>cia....................................................................................... 39<br />

13.3.3.3.1 Atributos g<strong>en</strong>erales..........................................................................40<br />

13.3.3.4 Luces............................................................................................... 42<br />

13.3.3.4.1 Modelos implicados.........................................................................42<br />

13.3.3.4.2 Fu<strong>en</strong>tes de luz ...................................................................................45<br />

13.3.3.4.3 Clase Material ....................................................................................46<br />

13.3.3.4.4 Influ<strong>en</strong>cia de las fu<strong>en</strong>tes de luz ....................................................47<br />

13.3.3.5 Texturas .......................................................................................... 47<br />

2


13.3.3.5.1 Clases es<strong>en</strong>ciales de texturado....................................................49<br />

<strong>13.3.4</strong> <strong>Movimi<strong>en</strong>to</strong> <strong>en</strong> <strong>Java</strong> <strong>3D</strong>..................................................................................52<br />

<strong>13.3.4</strong>.1 Conceptos básicos ........................................................................ 52<br />

<strong>13.3.4</strong>.1.1 Traslaciones y rotaciones <strong>en</strong> <strong>Java</strong> <strong>3D</strong> ........................................52<br />

<strong>13.3.4</strong>.1.2 Concepto de capacidad ..................................................................53<br />

<strong>13.3.4</strong>.1.3 Comportami<strong>en</strong>tos .............................................................................53<br />

<strong>13.3.4</strong>.2 Interacción con el usuario............................................................. 56<br />

<strong>13.3.4</strong>.2.1 Interacción a través del teclado....................................................57<br />

<strong>13.3.4</strong>.2.2 Gestión del ratón ..............................................................................58<br />

<strong>13.3.4</strong>.2.3 Discriminación de objetos .............................................................58<br />

<strong>13.3.4</strong>.3 Animación <strong>en</strong> <strong>Java</strong> <strong>3D</strong> ................................................................... 60<br />

13.4 MODELO DE VISUALIZACIÓN.............................................................................68<br />

13.4.1 Justificación .....................................................................................................68<br />

13.4.2 Influ<strong>en</strong>cia del <strong>en</strong>torno físico <strong>en</strong> la vista ....................................................69<br />

13.4.2.1 Sistema montado <strong>en</strong> la cabeza ..................................................... 69<br />

13.4.2.2 Sistema montado <strong>en</strong> una habitación ............................................ 70<br />

13.4.3 Separación de físico y virtual.......................................................................70<br />

13.4.3.1 El mundo virtual ............................................................................. 70<br />

13.4.3.2 El mundo físico............................................................................... 71<br />

13.4.4 Objetos que defin<strong>en</strong> la vista.........................................................................71<br />

13.4.5 ViewPlatform: Un lugar <strong>en</strong> el mundo virtual ............................................73<br />

13.4.6 El sistema de coord<strong>en</strong>adas ..........................................................................74<br />

13.4.6.1 Sistema de coord<strong>en</strong>adas “montados <strong>en</strong> habitación” ................. 74<br />

13.4.6.1.1 Sistemas de coord<strong>en</strong>adas virtuales ............................................74<br />

13.4.6.1.2 Sistemas de coord<strong>en</strong>adas físicos ................................................75<br />

13.4.6.2 Sistemas de coord<strong>en</strong>adas “montados <strong>en</strong> cabeza” ..................... 75<br />

13.5 RESUMEN .................................................................................................................76<br />

13.6 CONCLUSIONES .....................................................................................................78<br />

13.7 BILIOGRAFÍA Y RECURSOS................................................................................79<br />

3


Índice de Tablas<br />

TABLA 1 - ESCALA DE LAS COORDENADAS DE ALTA RESOLUCIÓN .................................................................... 20<br />

TABLA 2 - REGLAS DE GENERACIÓN DE COLOR EN PRESENCIA DE UN OBJETO MATERIAL ................................. 47<br />

TABLA 3 - REGLAS DE GENERACIÓN DE COLOR EN AUSENCIA DE UN OBJETO MATERIAL .................................. 47<br />

TABLA 4 - TABLAS DE MOVIMIENTOS PREDEFINIDOS EN JAVA <strong>3D</strong> .................................................................... 57<br />

Índice de figuras<br />

FIGURA 1 - IMAGEN <strong>3D</strong> VISTA SIGUIENDO UNA ESTRUCTURA DE ÁRBOL ............................................................. 6<br />

FIGURA 2 - NOTACIÓN EMPLEADA EN LOS GRAFOS DE ESCENA ......................................................................... 11<br />

FIGURA 3 - ESTRUCTURA GENERAL DE UN GRAFO DE ESCENA........................................................................... 12<br />

FIGURA 4 - GRAFO DE ESCENA ILEGAL .............................................................................................................. 18<br />

FIGURA 5 - POSIBLE CORRECCIÓN DEL GRAFO DE ESCENA ILEGAL .................................................................... 19<br />

FIGURA 6 - TIPOS DE SISTEMAS DE COORDENADAS............................................................................................ 19<br />

FIGURA 7 - JERARQUÍA DE CLASES DEL PAQUETE JAVAX.VECMATH .................................................................. 25<br />

FIGURA 8 - JERARQUÍA DE CLASES PARA LAS FIGURAS GEOMÉTRICAS PREDEFINIDAS ....................................... 27<br />

FIGURA 9 - JERARQUÍA DE CLASES PARA LA CLASE GEOMETRY ........................................................................ 29<br />

FIGURA 10 - EJEMPLO DE CREACIÓN DE UN CUBO EMPLEANDO CLASES INDEXADAS ......................................... 32<br />

FIGURA 11 - JERARQUÍA DE CLASES DE DEFINICIÓN GEOMÉTRICA INDEXADAS ................................................. 33<br />

FIGURA 12 - ORIENTACIÓN Y ALINEACIÓN DE UN TEXTO <strong>3D</strong>............................................................................. 34<br />

FIGURA 13 - LUZ (L), VECTOR NORMAL A LA SUPERFICIE (N) Y VECTOR DIRIGIDO AL OBSERVADOR (E) ......... 42<br />

FIGURA 14 - ESFERA SOMBREADA..................................................................................................................... 43<br />

FIGURA 15 - EL VECTOR DE LUZ PERMANECE CONSTANTE PARA UNA FUENTE DE TIPO DIRECTIONALLIGHT..... 43<br />

FIGURA 16 - VARIACIÓN DEL VECTOR DIRIGIDO AL OBSERVADOR (E) ............................................................... 44<br />

FIGURA 17 - MÉTODOS FLAT Y GOURAUD EMPLEADOS PARA SOMBREAR UNA ESFERA..................................... 45<br />

FIGURA 18 - COMBINACIÓN DE TEXTURA Y COLOR ........................................................................................... 51<br />

FIGURA 19 - GRAFO DE ESCENA QUE INCORPORA UN COMPORTAMIENTO.......................................................... 55<br />

FIGURA 20 - CLASES DE COMPORTAMIENTO IMPLICADAS EN LA INTERACCIÓN CON EL USUARIO ...................... 56<br />

FIGURA 21 - DISCRIMINACIÓN DE UN OBJETO VISUAL MEDIANTE EL MECANISMO PICK RAY .............................. 59<br />

FIGURA 22 - JERARQUÍA DE CLASES BEHAVIOR INVOLUCRADAS EN LA ANIMACIÓN ......................................... 60<br />

FIGURA 23 - PULSO DE TIEMPO GENERADO POR UN OBJETO ALPHA................................................................... 61<br />

FIGURA 24 - FORMAS ALTERNATIVAS DE ONDA GENERADAS POR UN OBJETO ALPHA ....................................... 62<br />

FIGURA 25 - SUAVIZADO DEL PULSO DE TIEMPO GENERADO POR UN OBJETO ALPHA ........................................ 62<br />

FIGURA 26 - RESULTADOS DE SUAVIZAR UN PULSO DE TIEMPO DE UN OBJETO ALPHA...................................... 63<br />

FIGURA 27 - JERARQUÍA DE CLASES DE LOS INTERPOLADORES.......................................................................... 63<br />

FIGURA 28 - PARES KNOT/VALOR Y CRITERIO DE SELECCION DE UN KNOT ........................................................ 64<br />

4


13.1 INTRODUCCIÓN<br />

13.1.1 ¿Qué es <strong>Java</strong> <strong>3D</strong>?<br />

La API (Application Program Interface) <strong>Java</strong> <strong>3D</strong> es una interfaz de programación de<br />

aplicación utilizada para escribir aplicaciones y applets con gráficos <strong>en</strong> tres dim<strong>en</strong>siones.<br />

Proporciona a los desarrolladores constructores de alto nivel para crear y manipular<br />

geometrías <strong>3D</strong> y para construir las estructuras utilizadas <strong>en</strong> el r<strong>en</strong>derizado de dichas<br />

geometrías. Se pued<strong>en</strong> describir grandes mundos virtuales utilizando estos constructores,<br />

que proporcionan a <strong>Java</strong> <strong>3D</strong> la sufici<strong>en</strong>te información como para r<strong>en</strong>derizar dichos mundos<br />

de forma efici<strong>en</strong>te.<br />

<strong>Java</strong> <strong>3D</strong> proporciona a los desarrolladores de gráficos <strong>3D</strong> la principal característica<br />

de <strong>Java</strong>: “escribe una vez y ejecútalo donde sea”. <strong>Java</strong> <strong>3D</strong> es parte del conjunto de APIs<br />

<strong>Java</strong>Media, lo cual hace que esté disponible <strong>en</strong> un gran número de plataformas. También,<br />

se integra correctam<strong>en</strong>te con Internet ya que tanto los applets como las aplicaciones escritas<br />

utilizando <strong>Java</strong> <strong>3D</strong> ti<strong>en</strong><strong>en</strong> acceso al conjunto completo de clases de <strong>Java</strong>.<br />

La API <strong>Java</strong> <strong>3D</strong> parte de otras APIs gráficas exist<strong>en</strong>tes así como de las nuevas<br />

tecnologías disponibles. Las construcciones gráficas de bajo nivel de <strong>Java</strong> <strong>3D</strong> sintetizan las<br />

mejores ideas <strong>en</strong>contradas <strong>en</strong> otras APIs de bajo nivel como Direct<strong>3D</strong>, Op<strong>en</strong>GL,<br />

QuickDraw<strong>3D</strong> y XGL. Del mismo modo, sus construcciones de alto nivel integran las<br />

mejores características proporcionadas por varios sistemas de esc<strong>en</strong>as basados <strong>en</strong> grafos.<br />

Además, <strong>Java</strong> <strong>3D</strong> introduce algunos conceptos que no se consideran habitualm<strong>en</strong>te como<br />

parte de los <strong>en</strong>tornos gráficos, como el sonido espacial <strong>3D</strong>. Las posibilidades de sonido de<br />

<strong>Java</strong> <strong>3D</strong> permit<strong>en</strong> proporcionar una experi<strong>en</strong>cia más realista al usuario.<br />

13.1.2 Objetivos<br />

<strong>Java</strong> <strong>3D</strong> ha sido diseñado t<strong>en</strong>i<strong>en</strong>do <strong>en</strong> cu<strong>en</strong>ta difer<strong>en</strong>tes objetivos; prestando especial<br />

at<strong>en</strong>ción <strong>en</strong> el bu<strong>en</strong> r<strong>en</strong>dimi<strong>en</strong>to. Se tomaron difer<strong>en</strong>tes decisiones relativas al diseño de tal<br />

forma que las implem<strong>en</strong>taciones de <strong>Java</strong> <strong>3D</strong> proporcionaran el mejor r<strong>en</strong>dimi<strong>en</strong>to posible a<br />

las aplicaciones de usuario. En particular, cuando se realizan distribuciones, se elige la<br />

alternativa que permite obt<strong>en</strong>er mejores prestaciones <strong>en</strong> tiempo de ejecución.<br />

Otros objetivos importantes de <strong>Java</strong> <strong>3D</strong> son:<br />

Proporcionar un amplio conjunto de utilidades que permitan crear mundos <strong>en</strong> <strong>3D</strong><br />

interesantes. También se tuvo <strong>en</strong> cu<strong>en</strong>ta no incluir características no es<strong>en</strong>ciales u<br />

oscuras. No se incluyeron características que podrían colocarse directam<strong>en</strong>te sobre<br />

<strong>Java</strong> <strong>3D</strong>.<br />

5


Proporcionar un paradigma de programación ori<strong>en</strong>tado a objetos de alto nivel para<br />

permitir a los desarrolladores g<strong>en</strong>erar sofisticadas aplicaciones y applets de forma<br />

rápida.<br />

Proporcionar soporte a cargadores <strong>en</strong> tiempo de ejecución. Esto permite que <strong>Java</strong><br />

<strong>3D</strong> se adapte a un gran número de formatos de ficheros, como pued<strong>en</strong> ser formatos<br />

específicos de distintos fabricantes de CAD, formatos de intercambio o VRML 1.0<br />

(Virtual Reality Modelling Language) y VRML 2.0.<br />

13.1.3 Cómo ver un objeto <strong>en</strong> <strong>3D</strong> sigui<strong>en</strong>do un grafo<br />

<strong>Java</strong> <strong>3D</strong> distribuye la información necesaria para repres<strong>en</strong>tar objetos y esc<strong>en</strong>as <strong>en</strong> tres<br />

dim<strong>en</strong>siones <strong>en</strong> una estructura de grafo. Sigui<strong>en</strong>do dicha estructura desde el nodo raíz hasta<br />

los distintos nodos hoja, se van vi<strong>en</strong>do las distintas operaciones que se realizan para crear la<br />

esc<strong>en</strong>a final que se quiere conseguir. En dicho grafo se incluy<strong>en</strong> tanto los distintos<br />

elem<strong>en</strong>tos que forman parte de la esc<strong>en</strong>a como las transformaciones que se les aplica. Del<br />

mismo modo, se insertan <strong>en</strong> el mismo grafo (aunque <strong>en</strong> otra rama distinta) difer<strong>en</strong>tes<br />

elem<strong>en</strong>tos que ti<strong>en</strong><strong>en</strong> que ver con el punto de vista del usuario.<br />

La Figura 13. 1 repres<strong>en</strong>ta cómo se puede crear una imag<strong>en</strong> compleja mediante la<br />

unión de difer<strong>en</strong>tes elem<strong>en</strong>tos unidos por las correspondi<strong>en</strong>tes relaciones.<br />

Figura 1 - Imag<strong>en</strong> <strong>3D</strong> vista sigui<strong>en</strong>do una estructura de árbol<br />

6


En esta figura puede apreciarse cómo, para componer la figura final (el circuito), es<br />

necesario modelar previam<strong>en</strong>te las distintas partes que la forman. Alguna de las partes<br />

puede, a su vez, ser dividida <strong>en</strong> otras partes que también necesitan ser modeladas.<br />

De esta forma, para llegar a obt<strong>en</strong>er la imag<strong>en</strong> global, hay que recorrer las distintas ramas<br />

g<strong>en</strong>eradas, desde las hojas hasta la raíz, formándose así los distintos elem<strong>en</strong>tos que<br />

converg<strong>en</strong> <strong>en</strong> la creación del objeto final.<br />

Al igual que <strong>en</strong> la figura, el árbol necesario para g<strong>en</strong>erar imág<strong>en</strong>es <strong>en</strong> <strong>Java</strong> <strong>3D</strong> va formando<br />

los distintos elem<strong>en</strong>tos de las mismas de manera progresiva, añadi<strong>en</strong>do <strong>en</strong> las difer<strong>en</strong>tes<br />

ramas del árbol las características propias de la imag<strong>en</strong> que se g<strong>en</strong>era. Por otro lado, la<br />

distribución de los elem<strong>en</strong>tos que forman la esc<strong>en</strong>a <strong>en</strong> una estructura jerárquica permite<br />

aislar conv<strong>en</strong>i<strong>en</strong>tem<strong>en</strong>te unos aspectos de otros para poder trabajar con ellos de forma más<br />

indep<strong>en</strong>di<strong>en</strong>te.<br />

13.1.4 Paradigma de programación<br />

<strong>Java</strong> <strong>3D</strong> es una API ori<strong>en</strong>tada a objetos. Las aplicaciones construy<strong>en</strong> los distintos elem<strong>en</strong>tos<br />

gráficos como objetos separados y los conectan unos con otros mediante una estructura <strong>en</strong><br />

forma de árbol d<strong>en</strong>ominada grafo de esc<strong>en</strong>a. La aplicación manipula los difer<strong>en</strong>tes objetos<br />

utilizando los métodos de acceso, de modificación y de unión definidos <strong>en</strong> su interfaz.<br />

13.1.4.1 Modelo de programación del grafo de esc<strong>en</strong>a<br />

El modelo de programación basado <strong>en</strong> el grafo de esc<strong>en</strong>a de <strong>Java</strong> <strong>3D</strong> proporciona un<br />

mecanismo s<strong>en</strong>cillo y flexible para repres<strong>en</strong>tar y r<strong>en</strong>derizar esc<strong>en</strong>as. El grafo de esc<strong>en</strong>a<br />

conti<strong>en</strong>e una descripción completa de la esc<strong>en</strong>a o universo virtual. Esta descripción incluye<br />

datos sobre la geometría, información de los distintos atributos, así como información de<br />

visualización necesaria para r<strong>en</strong>derizar la esc<strong>en</strong>a desde un punto de vista <strong>en</strong> particular.<br />

La API <strong>Java</strong> <strong>3D</strong> mejora algunas APIs previas eliminando algunas de las serias<br />

dep<strong>en</strong>d<strong>en</strong>cias impuestas por éstas. <strong>Java</strong> <strong>3D</strong> permite al programador diseñar su esc<strong>en</strong>a <strong>en</strong><br />

base a objetos geométricos y no considerando triángulos. Le permite c<strong>en</strong>trarse <strong>en</strong> la esc<strong>en</strong>a<br />

y <strong>en</strong> su composición y no <strong>en</strong> cómo escribir el código para r<strong>en</strong>derizar efici<strong>en</strong>tem<strong>en</strong>te la<br />

esc<strong>en</strong>a <strong>en</strong> cuestión.<br />

13.1.4.2 Aplicaciones y applets<br />

<strong>Java</strong> <strong>3D</strong> ni anticipa ni soporta directam<strong>en</strong>te cualquier necesidad posible de <strong>3D</strong>. En cambio,<br />

proporciona la base necesaria para añadir nuevas funcionalidades utilizando código <strong>Java</strong>.<br />

Objetos definidos utilizando un sistema de CAD o de animación se pued<strong>en</strong> incluir <strong>en</strong> una<br />

aplicación basada <strong>en</strong> <strong>Java</strong> <strong>3D</strong>. Algunos paquetes de modelados ti<strong>en</strong><strong>en</strong> distintos formatos<br />

externos que son, <strong>en</strong> muchos casos, propietarios. Los diseñadores pued<strong>en</strong> exportar<br />

geometrías a fichero utilizando modeladores externos. <strong>Java</strong> <strong>3D</strong> puede utilizar toda esa<br />

información geométrica, pero sólo si la aplicación proporciona un método para leer y<br />

traducir la información del modelador <strong>en</strong> primitivas <strong>Java</strong> <strong>3D</strong>.<br />

7


De forma similar, cargadores VRML analizarán y traducirán ficheros VRML y<br />

g<strong>en</strong>erarán los objetos <strong>Java</strong> <strong>3D</strong> apropiados y el código <strong>Java</strong> necesario para poder utilizar el<br />

cont<strong>en</strong>ido de los ficheros.<br />

Navegadores. Los navegadores actuales pued<strong>en</strong> aceptar cont<strong>en</strong>ido <strong>3D</strong> pasando<br />

información a visores <strong>3D</strong> (plugins) que la r<strong>en</strong>derizan d<strong>en</strong>tro de su propia v<strong>en</strong>tana.<br />

Con el tiempo, serán los propios navegadores los que se <strong>en</strong>cargu<strong>en</strong>, directam<strong>en</strong>te,<br />

de la gestión de los elem<strong>en</strong>tos <strong>3D</strong>.<br />

Juegos. Los desarrolladores de software para juegos <strong>3D</strong> siempre han int<strong>en</strong>tado<br />

aprovechar, <strong>en</strong> la medida de lo posible, hasta el límite las posibilidades del<br />

hardware disponible. Históricam<strong>en</strong>te han utilizado optimizaciones específicas del<br />

hardware y, por su puesto, no portables. De esta forma trataban de lograr el mejor<br />

r<strong>en</strong>dimi<strong>en</strong>to posible. Por esta razón, la programación típica de juegos se realizaba a<br />

un nivel de abstracción m<strong>en</strong>or que el s<strong>en</strong>cillo nivel de <strong>Java</strong> <strong>3D</strong>. Sin embargo, la<br />

t<strong>en</strong>d<strong>en</strong>cia actual <strong>en</strong> la creación de juegos <strong>3D</strong> es usar aceleradores hardware <strong>3D</strong> de<br />

propósito g<strong>en</strong>eral y utilizar m<strong>en</strong>os “trucos” para la r<strong>en</strong>derización.<br />

Así pues, aunque <strong>Java</strong> <strong>3D</strong> no fue explícitam<strong>en</strong>te diseñado para satisfacer las<br />

expectativas de los desarrolladores de juegos, sus sofisticadas técnicas de implem<strong>en</strong>tación<br />

proporcionan un r<strong>en</strong>dimi<strong>en</strong>to más que sufici<strong>en</strong>te para realizar distintas aplicaciones para<br />

juegos. Puede criticarse, de cualquier forma, que las aplicaciones escritas con una API<br />

g<strong>en</strong>eral, como puede ser <strong>Java</strong> <strong>3D</strong>, pued<strong>en</strong> t<strong>en</strong>er una ligera p<strong>en</strong>alización <strong>en</strong> cuanto a<br />

r<strong>en</strong>dimi<strong>en</strong>to <strong>en</strong> comparación con otras que utilic<strong>en</strong> técnicas no portables. Sin embargo,<br />

otros factores como la propia portabilidad, el tiempo de desarrollo y el coste pued<strong>en</strong><br />

también t<strong>en</strong>erse <strong>en</strong> cu<strong>en</strong>ta para contrarrestar ese pequeño déficit de r<strong>en</strong>dimi<strong>en</strong>to.<br />

13.1.5 Explicación de la estructura de trabajo<br />

En este docum<strong>en</strong>to se han tratado de explicar los conceptos básicos de <strong>Java</strong> <strong>3D</strong> parti<strong>en</strong>do<br />

de unos ciertos conocimi<strong>en</strong>tos previos (no demasiados) del mundo de la informática<br />

gráfica. Se han abordado las distintas ideas c<strong>en</strong>trales de <strong>Java</strong> <strong>3D</strong> sin profundizar demasiado,<br />

pero dando sufici<strong>en</strong>tes refer<strong>en</strong>cias a manuales y ejemplos como para permitir una<br />

investigación posterior más exhaustiva.<br />

El trabajo comi<strong>en</strong>za con la explicación s<strong>en</strong>cilla de los conceptos más g<strong>en</strong>erales para<br />

profundizar posteriorm<strong>en</strong>te, primero <strong>en</strong> la parte relativa a la rama de cont<strong>en</strong>ido del grafo de<br />

esc<strong>en</strong>a (los distintos elem<strong>en</strong>tos que se pued<strong>en</strong> utilizar para componer una esc<strong>en</strong>a) y,<br />

posteriorm<strong>en</strong>te, <strong>en</strong> la rama de visualización (<strong>en</strong> la que se explican las distintas opciones de<br />

visualización que proporciona <strong>Java</strong> <strong>3D</strong>.<br />

No se han añadido fragm<strong>en</strong>tos de código ya que, aunque podrían resultar<br />

aclaratorios, alargarían demasiado el pres<strong>en</strong>te docum<strong>en</strong>to (para comp<strong>en</strong>sar la aus<strong>en</strong>cia de<br />

8


código, se incluye una sección de recursos <strong>en</strong> la que se pued<strong>en</strong> <strong>en</strong>contrar tanto manuales y<br />

docum<strong>en</strong>tación como variados ejemplos).<br />

9


13.2 CONCEPTOS GENERALES<br />

Un universo virtual de <strong>Java</strong> <strong>3D</strong> se crea a partir de un grafo de esc<strong>en</strong>a.<br />

Una definición habitual de grafo es una estructura de datos compuesta de nodos y<br />

arcos. Un nodo es un elem<strong>en</strong>to de datos y un arco es una relación <strong>en</strong>te elem<strong>en</strong>tos de datos.<br />

Los nodos del grafo de esc<strong>en</strong>a se correspond<strong>en</strong> con instancias de clases <strong>Java</strong> <strong>3D</strong>. Los arcos<br />

repres<strong>en</strong>tan dos tipos de relaciones <strong>en</strong>tre las instancias de <strong>Java</strong> <strong>3D</strong>. La relación más habitual<br />

es la relación padre-hijo. Un nodo grupo puede t<strong>en</strong>er varios hijos, pero sólo un padre. Un<br />

nodo hoja puede t<strong>en</strong>er un padre, pero no hijos. La otra relación es la refer<strong>en</strong>cia. Una<br />

refer<strong>en</strong>cia asocia un objeto del tipo NodeCompon<strong>en</strong>t con un nodo del grafo de esc<strong>en</strong>a. Los<br />

objetos NodeCompon<strong>en</strong>t defin<strong>en</strong> tanto la geometría como los atributos de apari<strong>en</strong>cia que se<br />

utilizan para r<strong>en</strong>derizar los objetos visuales. Los grafos de esc<strong>en</strong>a de <strong>Java</strong> <strong>3D</strong> se construy<strong>en</strong><br />

utilizando objetos Node unidos por relaciones padre-hijo formando una estructura de árbol.<br />

En una estructura de árbol, un nodo es la raíz. Se puede acceder al resto de los nodos del<br />

árbol sigui<strong>en</strong>do los arcos que part<strong>en</strong> del nodo raíz. Los arcos de un árbol no forman ciclos.<br />

Un grafo de esc<strong>en</strong>a está formado por árboles cuya raíz se sitúa <strong>en</strong> los objetos Locale. Los<br />

NodeCompon<strong>en</strong>t y los arcos de refer<strong>en</strong>cia no forman parte, realm<strong>en</strong>te, del árbol del grafo de<br />

esc<strong>en</strong>a. Existe sólo un camino desde la raíz de un árbol hasta cada una de las hojas, de igual<br />

forma, sólo hay un camino desde la raíz de un grafo de esc<strong>en</strong>a hasta cada uno de los nodos<br />

hoja. El camino desde la raíz de un grafo de esc<strong>en</strong>a hasta un nodo hoja <strong>en</strong> particular se<br />

llama el camino de esc<strong>en</strong>a de ese nodo hoja. Por lo tanto, t<strong>en</strong>i<strong>en</strong>do <strong>en</strong> cu<strong>en</strong>ta la propiedad<br />

antes descrita, cada nodo hoja ti<strong>en</strong>e sólo un camino de grafo de esc<strong>en</strong>a. Cada camino de<br />

grafo de esc<strong>en</strong>a <strong>en</strong> <strong>Java</strong> <strong>3D</strong> especifica completam<strong>en</strong>te la información del estado de su hoja.<br />

La información del estado incluye datos como la localización, ori<strong>en</strong>tación y tamaño de un<br />

objeto visual. Por lo tanto, los atributos de cada objeto visual dep<strong>en</strong>d<strong>en</strong> directam<strong>en</strong>te de su<br />

camino de grafo de esc<strong>en</strong>a. El r<strong>en</strong>derizador de <strong>Java</strong> <strong>3D</strong> utiliza esta propiedad y r<strong>en</strong>deriza<br />

las hojas <strong>en</strong> el ord<strong>en</strong> que él determina que es más efici<strong>en</strong>te. El programador de <strong>Java</strong> <strong>3D</strong> no<br />

ti<strong>en</strong>e control sobre el ord<strong>en</strong> <strong>en</strong> que se r<strong>en</strong>derizan los distintos objetos.<br />

Las repres<strong>en</strong>taciones gráficas de los grafos de esc<strong>en</strong>a sirv<strong>en</strong> como herrami<strong>en</strong>ta de<br />

desarrollo así como de docum<strong>en</strong>tación para los programas de <strong>Java</strong> <strong>3D</strong>. Los grafos de esc<strong>en</strong>a<br />

se crean utilizando la simbología mostrada <strong>en</strong> la Figura 13.2. Los programas de <strong>Java</strong> <strong>3D</strong><br />

pued<strong>en</strong> t<strong>en</strong>er muchos más objetos que los que se muestran <strong>en</strong> el grafo de esc<strong>en</strong>a. Para<br />

diseñar un universo virtual de <strong>Java</strong> <strong>3D</strong> se dibuja un grafo de esc<strong>en</strong>a utilizando el conjunto<br />

habitual de símbolos. Una vez el programa se ha escrito, el grafo de esc<strong>en</strong>a creado es la<br />

repres<strong>en</strong>tación precisa del programa siempre y cuando se hayan seguido las<br />

especificaciones indicadas por el mismo.<br />

10


Figura 2 - Notación empleada <strong>en</strong> los grafos de esc<strong>en</strong>a<br />

Los símbolos de la columna de la izquierda repres<strong>en</strong>tan los distintos objetos que se<br />

usan <strong>en</strong> el grafo de esc<strong>en</strong>a. Los dos primeros se correspond<strong>en</strong> con objetos de clases<br />

específicas: VirtualUniverse y Locale. Los tres símbolos sigui<strong>en</strong>tes repres<strong>en</strong>tan objetos de<br />

las clases Group, Leaf y NodeCompo<strong>en</strong>t. Estos tres símbolos suel<strong>en</strong> llevar anotaciones para<br />

indicar la subclase a la que pert<strong>en</strong>ece el objeto <strong>en</strong> cuestión. El último símbolo de la<br />

izquierda se utiliza para repres<strong>en</strong>tar cualquier otro tipo de objeto.<br />

Por otro lado, los símbolos de la derecha repres<strong>en</strong>tan los arcos que indican la<br />

exist<strong>en</strong>cia de relaciones. La flecha conv<strong>en</strong>cional repres<strong>en</strong>ta una relación padre-hijo <strong>en</strong>tre<br />

dos objetos. Y, la flecha sombreada, refer<strong>en</strong>cia otro objeto. Los objetos que son<br />

refer<strong>en</strong>ciados se pued<strong>en</strong> compartir <strong>en</strong>tre difer<strong>en</strong>tes ramas del grafo de esc<strong>en</strong>a.<br />

13.2.1 Objetos del grafo de esc<strong>en</strong>a<br />

En la Figura 13.3, aparece el esqueleto g<strong>en</strong>eral de un grafo de esc<strong>en</strong>a básico. En él aparec<strong>en</strong><br />

prácticam<strong>en</strong>te todos los elem<strong>en</strong>tos que se utilizan para crear un grafo de esc<strong>en</strong>a. Dichos<br />

elem<strong>en</strong>tos se <strong>en</strong>umeran a continuación y se explicarán con más detalle <strong>en</strong> los sigui<strong>en</strong>tes<br />

apartados del trabajo.<br />

11


Figura 3 - Estructura g<strong>en</strong>eral de un grafo de esc<strong>en</strong>a<br />

13.2.1.1 Objetos de la superestructura del grafo de esc<strong>en</strong>a<br />

<strong>Java</strong> <strong>3D</strong> define dos objetos de superestructura del grafo de esc<strong>en</strong>a, VirtualUniverse y<br />

Locale, que se utilizan para cont<strong>en</strong>er los distintos subgrafos que forman el grafo de esc<strong>en</strong>a.<br />

Objeto VirtualUniverse. Un objeto VirtualUniverse consiste <strong>en</strong> una lista de objetos<br />

Locale que conti<strong>en</strong><strong>en</strong> una serie de nodos del grafo de esc<strong>en</strong>a que exist<strong>en</strong> <strong>en</strong> el<br />

universo. Normalm<strong>en</strong>te, las aplicaciones sólo necesitan un universo virtual, incluso<br />

las bases de datos virtuales muy grandes. Las operaciones sobre este objeto incluy<strong>en</strong><br />

la <strong>en</strong>umeración de los distintos objetos Locale que conti<strong>en</strong>e.<br />

Objeto Locale. El objeto Locale conti<strong>en</strong>e un conjunto de subgrafos del grafo de<br />

esc<strong>en</strong>a cuya raíz se corresponde con un nodo del tipo BranchGroup. Un objeto<br />

Locale también define la localización del universo virtual utilizando coord<strong>en</strong>adas de<br />

alta resolución (HiResCoord) para especificar la posición. El HiResCoord se utiliza<br />

como el orig<strong>en</strong> de todos los objetos del grafo de esc<strong>en</strong>a cont<strong>en</strong>idos <strong>en</strong> el Locale. Un<br />

objeto Locale no ti<strong>en</strong>e padre <strong>en</strong> el grafo de esc<strong>en</strong>a, pero se une de forma implícita a<br />

un universo virtual cuando se construye. Un objeto Locale puede refer<strong>en</strong>ciar un<br />

número arbitrario de nodos BranchGroup, pero no ti<strong>en</strong>e hijos explícitos. Las<br />

coord<strong>en</strong>adas de todos los objetos del grafo de esc<strong>en</strong>a son relativas al HiResCoord<br />

del Locale <strong>en</strong> el que se <strong>en</strong>cu<strong>en</strong>tran. Las operaciones del objeto Locale incluy<strong>en</strong><br />

establecer y obt<strong>en</strong>er el HiResCoord y añadir y eliminar subgrafos.<br />

12


13.2.1.2 Objetos de agrupación de nodos<br />

Los nodos de agrupación son los elem<strong>en</strong>tos de unión que se utilizan para construir un grafo<br />

de esc<strong>en</strong>a. Todos los nodos de agrupación pued<strong>en</strong> t<strong>en</strong>er un número variable de nodos hijos<br />

incluy<strong>en</strong>do otros nodos de agrupación y nodos hoja. Estos hijos ti<strong>en</strong><strong>en</strong> un índice asociado<br />

que permite realizar operaciones sobre un hijo <strong>en</strong> particular. Sin embargo, salvo que se<br />

utilice alguno de los nodos de agrupación ord<strong>en</strong>ados especiales, el r<strong>en</strong>derizador de <strong>Java</strong> <strong>3D</strong><br />

puede r<strong>en</strong>derizar los hijos de un nodo de agrupación <strong>en</strong> el ord<strong>en</strong> que considere más<br />

oportuno (incluso puede r<strong>en</strong>derizar varios hijos <strong>en</strong> paralelo).<br />

Nodos Group. Los objetos Group son nodos de agrupación de propósito g<strong>en</strong>eral.<br />

Ti<strong>en</strong><strong>en</strong> un solo padre y un número arbitrario de hijos. Entre las operaciones que<br />

proporciona este objeto están las de añadir, eliminar y <strong>en</strong>umerar los hijos del grupo.<br />

Las subclases de este objeto añad<strong>en</strong> semánticas adicionales.<br />

Nodos BranchGroup. Un nodo BranchGroup es la raíz de un subgrafo de una<br />

esc<strong>en</strong>a que puede compilarse como una unidad, unirse a un universo virtual o<br />

incluirse como hijo de un nodo de agrupación <strong>en</strong> otro subgrafo.<br />

Un subgrafo, cuya raíz sea un nodo de este tipo puede imaginarse como una unidad<br />

de compilación a la que se le pued<strong>en</strong> realizar las sigui<strong>en</strong>tes acciones:<br />

o Se puede compilar invocando a su método de compilación. Esta operación hará<br />

que se compile el subgrafo completo así como cualquier otro nodo de tipo<br />

BranchGroup cont<strong>en</strong>ido <strong>en</strong> dicho subgrafo (además de todos sus desc<strong>en</strong>di<strong>en</strong>tes).<br />

o Se puede insertar d<strong>en</strong>tro de un universo virtual conectándolo con un objeto<br />

Locale. Entonces se dice que el subgrafo completo está vivo.<br />

o Se puede desconectar el BranchGroup del subgrafo al que está cont<strong>en</strong>ido <strong>en</strong><br />

tiempo de ejecución, siempre y cuando se d<strong>en</strong> las condiciones necesarias para<br />

poderlo hacer (las capacidades se analizan <strong>en</strong> el apartado Concepto de límite).<br />

También se le puede cambiar de padre.<br />

Si un BranchGroup se <strong>en</strong>cu<strong>en</strong>tra d<strong>en</strong>tro de un subgrafo, como hijo de algún otro<br />

nodo de agrupación, no se puede unir a un Locale.<br />

Nodos TransformGroup. Los nodos TransformGroup especifican una<br />

transformación espacial s<strong>en</strong>cilla utilizando un objeto Transform<strong>3D</strong> que puede<br />

colocar, ori<strong>en</strong>tar y escalar todos sus hijos. La transformación especificada ti<strong>en</strong>e que<br />

ser tal que se pueda realizar <strong>en</strong> los objetos <strong>en</strong> los que se va a aplicar. Si un nodo<br />

TransformGroup se utiliza como antecesor de un nodo ViewPlatform <strong>en</strong> el grafo de<br />

esc<strong>en</strong>a, <strong>en</strong>tonces la transformación ti<strong>en</strong>e que ser congru<strong>en</strong>te, es decir, sólo se<br />

pued<strong>en</strong> realizar rotaciones, traslaciones y escalados uniformes <strong>en</strong> un camino directo<br />

desde un Locale hasta un nodo ViewPlatform. De todas formas, si se int<strong>en</strong>ta realizar<br />

13


una transformación no permitida, se g<strong>en</strong>eraría una excepción del tipo<br />

BadTransformException.<br />

Los efectos de las transformaciones <strong>en</strong> el grafo de esc<strong>en</strong>a son acumulativos. La<br />

concat<strong>en</strong>ación de las transformaciones de cada TransformGroup <strong>en</strong> un camino<br />

directo desde el Locale hasta un nodo hoja define un modelo de transformación que<br />

toma los puntos de las coord<strong>en</strong>adas locales del nodo hoja y los transforma <strong>en</strong><br />

coord<strong>en</strong>adas de mundo virtual. Este modelo de transformación se utiliza para<br />

transformar puntos, normales y distancias <strong>en</strong> coord<strong>en</strong>adas de mundo virtual.<br />

13.2.1.3 Objetos nodos hoja<br />

Los nodos hoja (Leaf) forman una clase abstracta para todos los nodos del grafo de esc<strong>en</strong>a<br />

que no ti<strong>en</strong><strong>en</strong> hijos. Proporcionan <strong>en</strong>laces espaciales y capacidades de instanciación para<br />

compartir grafos de esc<strong>en</strong>a. Proporcionan también una plataforma de visión para colocar y<br />

ori<strong>en</strong>tar los objetos <strong>en</strong> un punto de vista d<strong>en</strong>tro del mundo virtual.<br />

Nodos Shape<strong>3D</strong>. La clase Shape<strong>3D</strong> da soporte a la creación de objetos geométricos.<br />

Conti<strong>en</strong>e dos compon<strong>en</strong>tes: una refer<strong>en</strong>cia a la forma geométrica y a su compon<strong>en</strong>te<br />

de apari<strong>en</strong>cia. El objeto de geometría define los datos geométricos de la forma,<br />

mi<strong>en</strong>tras que el objeto de apari<strong>en</strong>cia especifica los atributos de apari<strong>en</strong>cia del objeto<br />

como pued<strong>en</strong> ser color, material, textura, etc.<br />

Nodos ViewPlatform. Los nodos ViewPlatform defin<strong>en</strong> una plataforma de<br />

visualización que se refer<strong>en</strong>cia mediante un objeto View. La posición, ori<strong>en</strong>tación y<br />

escala de las transformaciones desde el grafo de esc<strong>en</strong>a hasta el nodo ViewPlatform<br />

especifican la localización del punto de vista y hacia qué dirección está ori<strong>en</strong>tado.<br />

Un observador puede deambular por una esc<strong>en</strong>a cambiando las transformaciones <strong>en</strong><br />

la jerarquía del grafo de esc<strong>en</strong>a por <strong>en</strong>cima del ViewPlatform.<br />

Nodos Behavior. Los nodos hoja Behavior permit<strong>en</strong> que una aplicación modifique<br />

el grafo de esc<strong>en</strong>a <strong>en</strong> tiempo de ejecución. Behavior es una clase abstracta que<br />

define propiedades comunes a todos los objetos de comportami<strong>en</strong>to de <strong>Java</strong> <strong>3D</strong>.<br />

Hay varios comportami<strong>en</strong>tos predefinidos que son subclases de Behavior. Además,<br />

el usuario puede redefinir estos objetos si lo considera preciso.<br />

Nodo BoundingLeaf. Define una región limitada que puede ser refer<strong>en</strong>ciada por<br />

otros nodos para definir una región de influ<strong>en</strong>cia (nodos Fog y Light), una región de<br />

activación (nodos de Background, Clip y SoundScape) o una región de planificación<br />

(nodos Sound y Behavior). La región limitada se define <strong>en</strong> el sistema de<br />

coord<strong>en</strong>adas local del nodo BoundingLeaf. Se puede utilizar una refer<strong>en</strong>cia a este<br />

nodo <strong>en</strong> lugar de a los límites de un objeto de alguno de los nodos antes<br />

m<strong>en</strong>cionados.<br />

Este nodo permite a la aplicación especificar una región limitada <strong>en</strong> un sistema de<br />

coord<strong>en</strong>adas difer<strong>en</strong>te del sistema de coord<strong>en</strong>adas local del objeto que refer<strong>en</strong>cia los<br />

14


límites. Es decir si, por ejemplo, <strong>en</strong> una habitación hay varias luces, los límites<br />

aplicados a las distintas luces se corresponderán siempre con la habitación,<br />

indep<strong>en</strong>di<strong>en</strong>tem<strong>en</strong>te del movimi<strong>en</strong>to de las propias luces. Así, utilizando un objeto<br />

de este tipo, no es necesario aplicar coord<strong>en</strong>adas de límites distintas para cada<br />

objeto de iluminación (ya que cada uno t<strong>en</strong>dría su propio sistema de coord<strong>en</strong>adas),<br />

sino que todos los límites se aplicarían <strong>en</strong> función del objeto BoundingLeaf.<br />

Nodo Background. Este nodo define un fondo para la aplicación. Este fondo puede<br />

ser, bi<strong>en</strong> un color fijo o una imag<strong>en</strong> que se utiliza para rell<strong>en</strong>ar la v<strong>en</strong>tana utilizada.<br />

También especifica a la aplicación la región <strong>en</strong> que el nodo Background está activo.<br />

Un nodo de este tipo está activo cuando la región de la aplicación intersecta con el<br />

volum<strong>en</strong> de activación del ViewPlatform. Si hay varios nodos Background activos,<br />

se utiliza el que esté más cercano al ojo, y si no hay ninguno activo, el fondo de la<br />

v<strong>en</strong>tana se pinta de negro.<br />

Nodo Fog. Se trata de una clase abstracta que define un conjunto de atributos<br />

comunes que controlan la niebla de la esc<strong>en</strong>a. Entre dichos atributos se <strong>en</strong>cu<strong>en</strong>tran<br />

el color de la niebla y un objeto de límites que especifica la región de la influ<strong>en</strong>cia<br />

del nodo de niebla. Todos los objetos que intersectan con la región de influ<strong>en</strong>cia del<br />

objeto de niebla modifican su color (para aplicarle la niebla) una vez aplicadas las<br />

luces y texturas.<br />

o Nodo Expon<strong>en</strong>tialFog. Exti<strong>en</strong>de el nodo Fog añadiéndole una d<strong>en</strong>sidad de<br />

niebla que se usa como expon<strong>en</strong>te de la ecuación de niebla. La d<strong>en</strong>sidad se<br />

define <strong>en</strong> el sistema de coord<strong>en</strong>adas local del nodo, aunque la ecuación de<br />

niebla se referirá a las coord<strong>en</strong>adas del ojo.<br />

o Nodo LinearFog. Exti<strong>en</strong>de el nodo Fog añadi<strong>en</strong>do un par de valores de<br />

distancia <strong>en</strong> el eje z que indican el punto <strong>en</strong> que la niebla debe com<strong>en</strong>zar a<br />

oscurecer la esc<strong>en</strong>a y <strong>en</strong> el que debe oscurecerla completam<strong>en</strong>te.<br />

Nodo Light. Es una clase abstracta que define las propiedades comunes a todos los<br />

nodos de luz. Cada luz ti<strong>en</strong>e asociado un color, un estado (<strong>en</strong>c<strong>en</strong>dida o apagada) y<br />

un objeto de límites que especifica la región de influ<strong>en</strong>cia de la luz. El modelo de<br />

iluminación de <strong>Java</strong> <strong>3D</strong> se basa <strong>en</strong> un subconjunto del modelo de iluminación de<br />

Op<strong>en</strong>GL. Sobre el tema de luces se vuelve <strong>en</strong> el apartado Luces.<br />

Nodo Sound. Es también una clase abstracta que define las propiedades comunes de<br />

todos los nodos de sonido. Un grafo de esc<strong>en</strong>a puede cont<strong>en</strong>er varios elem<strong>en</strong>tos de<br />

sonido. Cada nodo de sonido conti<strong>en</strong>e una refer<strong>en</strong>cia a los datos de sonido, un factor<br />

de escala de amplitud, un flag que indica si el sonido asociado con el objeto debe<br />

reproducirse hasta que se acaba o sólo hasta que se desactive el objeto, el número de<br />

veces que debe repetirse, un estado (si está activado o no), una región de influ<strong>en</strong>cia,<br />

una prioridad, etc. Siempre que el usuario se <strong>en</strong>cu<strong>en</strong>tre d<strong>en</strong>tro de los límites de<br />

influ<strong>en</strong>cia del sonido, este será pot<strong>en</strong>cialm<strong>en</strong>te audible.<br />

15


o Nodo BackgroundSound. Define una fu<strong>en</strong>te de sonido sin at<strong>en</strong>uación que no<br />

ti<strong>en</strong>e ni posición ni dirección. Ti<strong>en</strong>e los mismos atributos que el nodo Sound. Se<br />

utilizan como sonidos de ambi<strong>en</strong>te y puede haber varios activos a la vez.<br />

o Nodo PointSound. Define un sonido cuyas ondas se emit<strong>en</strong> <strong>en</strong> todas las<br />

direcciones desde su localización. Se añad<strong>en</strong> a los parámetros del nodo Sound,<br />

la localización y el grado de at<strong>en</strong>uación con la distancia.<br />

o Nodo ConeSound. Define un nodo PointSound cuyo sonido está dirigido a lo<br />

largo de un vector <strong>en</strong> el espacio. El sonido se at<strong>en</strong>úa tanto a lo largo como <strong>en</strong> un<br />

cierto ángulo también definido.<br />

Nodo Morph. Este nodo permite que una aplicación realice morphings <strong>en</strong>tre<br />

difer<strong>en</strong>tes matrices de geometría. Este nodo conti<strong>en</strong>e un único nodo de apari<strong>en</strong>cia y<br />

una matriz de matrices de geometría, con un peso para cada una. El nodo Morph<br />

combina todas estas matrices <strong>en</strong> una forma mezcla de todas <strong>en</strong> función del peso<br />

asignado a cada una.<br />

Nodo Link. Este nodo permite que la aplicación refer<strong>en</strong>cia un subgrupo compartido,<br />

cuya raíz es un nodo SharedGroup, d<strong>en</strong>tro de una rama del grafo de esc<strong>en</strong>a. Varios<br />

nodos Link pued<strong>en</strong> referirse a un mismo nodo SharedGroup.<br />

Las nieblas, el sonido y el morphing no son objeto de este trabajo, ya que se trata de<br />

elem<strong>en</strong>tos que se pued<strong>en</strong> considerar avanzados d<strong>en</strong>tro del mundo <strong>3D</strong>. Para conocer más<br />

sobre estos aspectos acudir a (Sun Microsystems, 1999).<br />

13.2.2 Otros objetos implicados<br />

Los objetos del grafo de esc<strong>en</strong>a analizados hasta ahora son los que realm<strong>en</strong>te se consideran<br />

parte de dicho grafo de esc<strong>en</strong>a. Pero, además de estos nodos, exist<strong>en</strong> otros que permit<strong>en</strong><br />

incluir información adicional y es<strong>en</strong>cial <strong>en</strong> dicha estructura de árbol.<br />

El primer grupo de estos elem<strong>en</strong>tos son los que permit<strong>en</strong> configurar la rama de<br />

visualización y que se un<strong>en</strong> al objeto ViewPlatform. Estos objetos son Canvas<strong>3D</strong>,<br />

Scre<strong>en</strong><strong>3D</strong>, View, PhysicalBody y PhysicalEnvironm<strong>en</strong>t. De forma breve, ya que se<br />

describirán con más detalle <strong>en</strong> el apartado 4, se com<strong>en</strong>tan a continuación:<br />

View. Este es el objeto principal de visualización ya que es el que determina toda la<br />

información necesaria para g<strong>en</strong>erar la esc<strong>en</strong>a <strong>3D</strong>. Conti<strong>en</strong>e difer<strong>en</strong>tes elem<strong>en</strong>tos del<br />

estado de visualización.<br />

Canvas<strong>3D</strong>. Es la versión <strong>3D</strong> del objeto Canvas de AWT. Repres<strong>en</strong>ta una v<strong>en</strong>tana <strong>en</strong><br />

la que <strong>Java</strong> <strong>3D</strong> dibujará las imág<strong>en</strong>es. Conti<strong>en</strong>e una refer<strong>en</strong>cia a un objeto Scre<strong>en</strong><strong>3D</strong><br />

e información que describe el tamaño forma y localización d<strong>en</strong>tro del objeto<br />

Scre<strong>en</strong><strong>3D</strong> del objeto Canvas<strong>3D</strong>.<br />

16


Scre<strong>en</strong><strong>3D</strong>. Es un objeto que conti<strong>en</strong>e información relativa a las propiedades físicas<br />

de la pantalla. <strong>Java</strong> <strong>3D</strong> separa la información relativa a la pantalla <strong>en</strong> un objeto<br />

indep<strong>en</strong>di<strong>en</strong>te para evitar la duplicación de información sobre la pantalla, <strong>en</strong> caso de<br />

que varios objetos Canvas<strong>3D</strong> compartan una sola pantalla.<br />

PhysicalBody. Se trata de un objeto que conti<strong>en</strong>e información de calibración relativa<br />

al cuerpo físico del usuario.<br />

PhysicalEnvironm<strong>en</strong>t. Este objeto conti<strong>en</strong>e información de calibración del mundo<br />

físico.<br />

El segundo grupo de objetos adicionales son los objetos NodeCompon<strong>en</strong>t. Estos<br />

objetos no formar parte de la estructura de árbol, pero son es<strong>en</strong>ciales para g<strong>en</strong>erar<br />

cont<strong>en</strong>idos. De hecho, son los responsables, <strong>en</strong>tre otras cosas, de que una figura t<strong>en</strong>ga una<br />

cierta geometría bajo una cierta apari<strong>en</strong>cia (color, textura...) Los objetos NodeCompon<strong>en</strong>t<br />

se asocian a través de relaciones de refer<strong>en</strong>cia con objetos Leaf para los cuales define la<br />

apari<strong>en</strong>cia y la geometría. Las características de estos nodos se analizan con más detalle <strong>en</strong><br />

los apartados Construcción de elem<strong>en</strong>tos geométricos y Modificación de apari<strong>en</strong>cia.<br />

13.2.3 Construcción de un árbol<br />

Las subclases del objeto Sc<strong>en</strong>eGraph son los elem<strong>en</strong>tos que se un<strong>en</strong> para formar los grafos<br />

de esc<strong>en</strong>a. El procedimi<strong>en</strong>to básico para desarrollar un programa <strong>en</strong> <strong>Java</strong> <strong>3D</strong> consiste <strong>en</strong><br />

siete pasos:<br />

1. Crear un objeto Canvas<strong>3D</strong>.<br />

2. Crear un objeto VirtualUniverse.<br />

3. Crear un objeto Locale y unirlo al objeto VirtualUniverse.<br />

4. Construir la rama de visualización del grafo.<br />

a. Crear un objeto View.<br />

b. Crear un objeto ViewPlatform.<br />

c. Crear un objeto PhysicalBody.<br />

d. Crear un objeto PhysicalEnvironm<strong>en</strong>t.<br />

e. Unir los objetos ViewPlatform, PhysicalBody, PhysicalEnvironm<strong>en</strong>t y<br />

Canvas<strong>3D</strong> al objeto View.<br />

5. Construir la(s) rama(s) de cont<strong>en</strong>ido del grafo.<br />

6. Compilar la(s) rama(s) del punto anterior.<br />

7. Insertar los distintos subgrafos <strong>en</strong> el Locale.<br />

Aunque no profundiza demasiado, esta receta sí refleja el concepto fundam<strong>en</strong>tal de<br />

la programación <strong>en</strong> <strong>Java</strong> <strong>3D</strong>: el grueso de la programación consiste <strong>en</strong> la creación de las<br />

distintas ramas del grafo de esc<strong>en</strong>a.<br />

17


13.2.3.1 Grafos de esc<strong>en</strong>a ilegales<br />

Se pued<strong>en</strong> crear grafos de esc<strong>en</strong>a ilegales, un ejemplo de ello es la Figura 13.4. Dicho grafo<br />

de esc<strong>en</strong>a es ilegal porque hay dos objetos TransformGroup que ti<strong>en</strong><strong>en</strong> un mismo objeto<br />

hoja Shape<strong>3D</strong> como hijo. Un objeto hoja sólo puede t<strong>en</strong>er un padre, sólo puede haber un<br />

camino desde un objeto Locale hasta un objeto hoja.<br />

Puede parecer que <strong>en</strong> la estructura de la figura se defin<strong>en</strong> tres objetos del universo<br />

virtual. Si consideramos que el objeto Shape<strong>3D</strong> se reutiliza, el grafo de esc<strong>en</strong>a puede<br />

definir dos objetos visuales. Sin embargo, no es un árbol legal porque los arcos de relación<br />

padre-hijo no forman un árbol.<br />

Figura 4 - Grafo de esc<strong>en</strong>a ilegal<br />

En la Figura 13. 5 se muestra una posible corrección a la estructura de árbol ilegal.<br />

18


Figura 5 - Posible corrección del grafo de esc<strong>en</strong>a ilegal<br />

Un programa <strong>en</strong> <strong>Java</strong> <strong>3D</strong> que define un grafo de esc<strong>en</strong>a ilegal puede compilarse,<br />

pero la imag<strong>en</strong> que define no puede g<strong>en</strong>erarse. Cuando se ejecuta un programa <strong>Java</strong> <strong>3D</strong> que<br />

conti<strong>en</strong>e un grafo de esc<strong>en</strong>a ilegal, el sistema de <strong>Java</strong> <strong>3D</strong> detecta el problema y, <strong>en</strong>tonces,<br />

g<strong>en</strong>era una excepción. El programa se seguirá ejecutando, y será necesario det<strong>en</strong>erlo, pero<br />

no se g<strong>en</strong>erará ninguna imag<strong>en</strong>.<br />

13.2.4 Sistema de coord<strong>en</strong>adas<br />

Los sistemas de coord<strong>en</strong>adas <strong>en</strong> <strong>Java</strong> <strong>3D</strong> son, por defecto “diestros”, de tal forma que la<br />

parte positiva del eje de ord<strong>en</strong>adas es el s<strong>en</strong>tido asc<strong>en</strong>d<strong>en</strong>te de la gravedad, la parte positiva<br />

del eje de abscisas es horizontal hacia la derecha y la parte positiva del eje z está dirigido<br />

hacia el observador.<br />

La unidad utilizada por defecto son los metros. En la sigui<strong>en</strong>te figura, se puede ver<br />

gráficam<strong>en</strong>te esta distribución.<br />

Figura 6 - Tipos de sistemas de coord<strong>en</strong>adas<br />

19


13.2.4.1 Coord<strong>en</strong>adas de alta resolución<br />

La repres<strong>en</strong>tación de las coord<strong>en</strong>adas con valores <strong>en</strong> punto flotante de doble precisión, de<br />

simple precisión o incluso valores de m<strong>en</strong>or precisión es sufici<strong>en</strong>te para repres<strong>en</strong>tar y<br />

mostrar esc<strong>en</strong>as <strong>en</strong> tres dim<strong>en</strong>siones de gran calidad. Si nos alejamos dosci<strong>en</strong>tos kilómetros<br />

desde el orig<strong>en</strong> de coord<strong>en</strong>adas utilizando una precisión s<strong>en</strong>cilla de punto flotante, los<br />

puntos repres<strong>en</strong>tables aparec<strong>en</strong> de alguna forma discretizados. Si lo que se pret<strong>en</strong>de es<br />

llegar a distancias muy pequeñas, muy cerca del orig<strong>en</strong>, aparece el mismo problema.<br />

Las coord<strong>en</strong>adas de alta resolución de <strong>Java</strong> <strong>3D</strong> constan de 3 números de 256 bits de<br />

punto fijo, uno para cada eje. El punto fijo se <strong>en</strong>cu<strong>en</strong>tra <strong>en</strong> el bit 128 y el valor 1.0 se<br />

corresponde exactam<strong>en</strong>te con un metro. Este sistema de coord<strong>en</strong>adas es sufici<strong>en</strong>te para<br />

describir un universo tan <strong>en</strong>orme como varios ci<strong>en</strong>tos de billones de años luz o como para<br />

definir objetos tan pequeños como un protón.<br />

En la Tabla 13.1 se repres<strong>en</strong>tan cuántos bits son necesarios bi<strong>en</strong> por <strong>en</strong>cima o por<br />

debajo del punto fijo para repres<strong>en</strong>tar el rango que nos interese.<br />

2 n Metros Unidades<br />

87.29 Universo (20 billones de años luz)<br />

69.68 Galaxia (100000 años luz)<br />

53.07 Año Luz<br />

43.43 Diámetros del Sistema Solar<br />

23.60 Diámetro de la Tierra<br />

10.65 Milla<br />

9.97 Kilómetro<br />

0.00 Metro<br />

-19.93 Micra<br />

-115.57 Longitud de Planck<br />

Tabla 1 - Escala de las coord<strong>en</strong>adas de alta resolución<br />

Los números de punto fijo de 256 bits proporcionan también la v<strong>en</strong>taja de ser<br />

capaces de repres<strong>en</strong>tar directam<strong>en</strong>te, de forma exacta, cualquier valor de precisión s<strong>en</strong>cilla<br />

de punto flotante.<br />

Las coord<strong>en</strong>adas de alta resolución de <strong>Java</strong> <strong>3D</strong> se utilizan sólo para incluir los<br />

sistemas de coord<strong>en</strong>adas tradicionales de punto flotante <strong>en</strong> un sistema de mucha mayor<br />

resolución. De esta forma se pued<strong>en</strong> crear universos de cualquier tamaño imaginable sin<br />

preocuparnos de la precisión.<br />

Las coord<strong>en</strong>adas de alta resolución se repres<strong>en</strong>tan como números de 256 bits con<br />

signo <strong>en</strong> complem<strong>en</strong>to a dos. Aunque <strong>Java</strong> <strong>3D</strong> manti<strong>en</strong>e oculta la repres<strong>en</strong>tación interna de<br />

las coord<strong>en</strong>adas de alta resolución, el usuario debe especificar dichas coord<strong>en</strong>adas usando<br />

matrices de <strong>en</strong>teros de 8 elem<strong>en</strong>tos. <strong>Java</strong> <strong>3D</strong> trata el <strong>en</strong>tero <strong>en</strong> la posición 0 como los bits<br />

más significativos y el situado <strong>en</strong> la posición 7 como los m<strong>en</strong>os significativos de la<br />

20


coord<strong>en</strong>ada de alta resolución. El punto binario se localiza <strong>en</strong> el bit 128 o <strong>en</strong>tre los <strong>en</strong>teros<br />

de las posiciones 3 y 4.<br />

La forma <strong>en</strong> que los cargadores de ficheros manejan las coord<strong>en</strong>adas de alta<br />

resolución dep<strong>en</strong>de de cada cargador <strong>en</strong> concreto, ya que <strong>Java</strong> <strong>3D</strong> no define directam<strong>en</strong>te<br />

ninguna semántica de carga de ficheros. Sin embargo, hay ciertas consideraciones que<br />

pued<strong>en</strong> indicarse.<br />

Para universos pequeños (del ord<strong>en</strong> de ci<strong>en</strong>tos de metros), un solo Locale con<br />

coord<strong>en</strong>adas de alta resolución ubicado <strong>en</strong> la posición (0.0, 0.0, 0.0) como el nodo raíz es<br />

sufici<strong>en</strong>te. Un cargador puede construir automáticam<strong>en</strong>te este nodo durante el proceso de<br />

carga ya que las coord<strong>en</strong>adas de alta resolución no necesitan t<strong>en</strong>er una repres<strong>en</strong>tación<br />

directa <strong>en</strong> el fichero externo. Universos virtuales de mayor tamaño se suel<strong>en</strong> construir<br />

sigui<strong>en</strong>do la jerarquía habitual de directorios de cualquier disco duro, es decir, un universo<br />

virtual raíz que conti<strong>en</strong>e la mayoría de las refer<strong>en</strong>cias a ficheros externos que incluy<strong>en</strong><br />

universos virtuales. En este caso, el objeto que conti<strong>en</strong>e la refer<strong>en</strong>cia al fichero define la<br />

localización de los datos que se ti<strong>en</strong><strong>en</strong> que leer <strong>en</strong> el universo virtual <strong>en</strong> cuestión.<br />

El cont<strong>en</strong>ido de los ficheros de datos debe <strong>en</strong>lazarse al nodo – fichero mi<strong>en</strong>tras se<br />

le<strong>en</strong>, heredando así las coord<strong>en</strong>adas de alta resolución del objeto como el nuevo universo<br />

virtual orig<strong>en</strong> del grafo de esc<strong>en</strong>a embebido. Si ese mismo grafo de esc<strong>en</strong>a conti<strong>en</strong>e a su<br />

vez coord<strong>en</strong>adas de alta resolución, t<strong>en</strong>drán que ser trasladadas <strong>en</strong> la cantidad que indiqu<strong>en</strong><br />

las coord<strong>en</strong>adas de alta resolución del objeto – fichero y <strong>en</strong>tonces añadidas al universo<br />

virtual mayor como nuevas coord<strong>en</strong>adas de alta resolución, con todo su cont<strong>en</strong>ido por<br />

debajo de las mismas.<br />

A la hora de tratar con objetos que se muev<strong>en</strong> con gran amplitud, hay que<br />

considerar que t<strong>en</strong>drán que cambiar periódicam<strong>en</strong>te su Locale padre de forma que se adapte<br />

más adecuadam<strong>en</strong>te a sus nuevas coord<strong>en</strong>adas. Si no existiera ningún Locale<br />

sufici<strong>en</strong>tem<strong>en</strong>te apropiado, la aplicación podría crear uno nuevo.<br />

13.2.5 Modos de r<strong>en</strong>derización<br />

<strong>Java</strong> <strong>3D</strong> proporciona tres modos difer<strong>en</strong>tes de r<strong>en</strong>derización: modo inmediato, modo<br />

ret<strong>en</strong>ido y modo compilado-ret<strong>en</strong>ido. Cada modo proporciona, sucesivam<strong>en</strong>te, mayor<br />

libertad para optimizar la ejecución de la aplicación. Las características de la mayor parte<br />

de las aplicaciones provocan que los dos últimos métodos sean los más utilizados.<br />

Modo inmediato. El modo inmediato no permite mucha optimización <strong>en</strong> cuanto al<br />

grafo de esc<strong>en</strong>a se refiere. En este modo, el nivel de abstracción de <strong>Java</strong> <strong>3D</strong> es<br />

bastante elevado y acelera el r<strong>en</strong>derizado inmediato de los objetos. Una aplicación<br />

debe proporcionar un método de dibujado con un conjunto completo de puntos,<br />

líneas o triángulos que son posteriorm<strong>en</strong>te r<strong>en</strong>derizados por el g<strong>en</strong>erador de<br />

imág<strong>en</strong>es de alta velocidad de <strong>Java</strong> <strong>3D</strong>. Por supuesto, la aplicación puede construir<br />

estas listas de puntos, líneas o triángulos <strong>en</strong> cualquier forma que elija.<br />

21


Este modo de r<strong>en</strong>derización permite la mayor flexibilidad y libertad a costa de una<br />

reducción <strong>en</strong> el r<strong>en</strong>dimi<strong>en</strong>to. <strong>Java</strong> <strong>3D</strong> no dispone, <strong>en</strong> este modo, de información<br />

acerca de los objetos gráficos de la composición. Debido a esa aus<strong>en</strong>cia de<br />

información, <strong>Java</strong> <strong>3D</strong> ap<strong>en</strong>as puede realizar optimizaciones <strong>en</strong> la aplicación del<br />

programador.<br />

El programador puede utilizar o no la estructura de grafo de esc<strong>en</strong>a heredada del<br />

diseño de <strong>Java</strong> <strong>3D</strong>; puede elegir <strong>en</strong>tre dibujar la esc<strong>en</strong>a directam<strong>en</strong>te o definir el<br />

grafo de esc<strong>en</strong>a.<br />

El modo inmediato puede utilizarse tanto de forma indep<strong>en</strong>di<strong>en</strong>te como combinado<br />

con los otros dos métodos exist<strong>en</strong>tes.<br />

Modo ret<strong>en</strong>ido. El modo ret<strong>en</strong>ido requiere que la aplicación construya un grafo de<br />

esc<strong>en</strong>a y que especifique qué elem<strong>en</strong>tos de dicho grafo de esc<strong>en</strong>a pued<strong>en</strong> cambiar<br />

durante la r<strong>en</strong>derización. El grafo de esc<strong>en</strong>a describe los objetos del universo<br />

virtual, la distribución de dichos objetos y cómo la aplicación los anima.<br />

Este modo proporciona gran parte de la flexibilidad del modo inmediato a la vez<br />

que un increm<strong>en</strong>to sustancial <strong>en</strong> la velocidad de r<strong>en</strong>derización. Todos los objetos<br />

definidos <strong>en</strong> el grafo de esc<strong>en</strong>a son accesibles y manipulables, como lo es el grafo<br />

de esc<strong>en</strong>a <strong>en</strong> sí mismo.<br />

El programador puede crear grafos de esc<strong>en</strong>a y añadir o eliminar nodos del mismo<br />

rápidam<strong>en</strong>te y ver inmediatam<strong>en</strong>te los efectos de dichos cambios. Este modo<br />

permite construir objetos, insertarlos <strong>en</strong> una base de datos, componer objetos y<br />

añadir comportami<strong>en</strong>tos a los objetos. <strong>Java</strong> <strong>3D</strong> sabe que el programador ha definido<br />

objetos, sabe cómo ha combinado dichos objetos para crear objetos compuestos o<br />

grafos de esc<strong>en</strong>a y también conoce qué comportami<strong>en</strong>tos o acciones se han añadido<br />

a los objetos. Todo este conocimi<strong>en</strong>to permite a <strong>Java</strong> <strong>3D</strong> realizar difer<strong>en</strong>tes<br />

optimizaciones; puede construir estructuras de datos especiales que cont<strong>en</strong>gan la<br />

geometría de los objetos de tal forma que se aum<strong>en</strong>te la velocidad a la que puede<br />

r<strong>en</strong>derizarlo. Puede también compilar los comportami<strong>en</strong>tos de los objetos para que<br />

se ejecut<strong>en</strong> a una mayor velocidad cuando sean invocados.<br />

Modo compilado-ret<strong>en</strong>ido. Este modo, al igual que el ret<strong>en</strong>ido, requiere que la<br />

aplicación construya un grafo de esc<strong>en</strong>a y que especifique qué elem<strong>en</strong>tos pued<strong>en</strong><br />

cambiar durante la r<strong>en</strong>derización. Además, la aplicación puede compilar parte o<br />

todos los subgrafos que forman el grafo de esc<strong>en</strong>a completo. <strong>Java</strong> <strong>3D</strong> compila estos<br />

grafos <strong>en</strong> un formato interno. La repres<strong>en</strong>tación compilada del grafo de esc<strong>en</strong>a<br />

ap<strong>en</strong>as se parece a la estructura de árbol original proporcionada por la aplicación,<br />

sin embargo, es funcionalm<strong>en</strong>te equival<strong>en</strong>te. Este modo es el que proporciona el<br />

mejor r<strong>en</strong>dimi<strong>en</strong>to.<br />

22


Este modo permite que la API de <strong>Java</strong> <strong>3D</strong> realice una serie de complicadas<br />

optimizaciones. Un programador puede solicitar que <strong>Java</strong> <strong>3D</strong> compile un objeto o<br />

un grafo de esc<strong>en</strong>a. Un objeto o un grafo de esc<strong>en</strong>a compilado consiste <strong>en</strong><br />

cualesquiera estructuras que <strong>Java</strong> <strong>3D</strong> quiera crear para asegurar que los objetos o<br />

grafos de esc<strong>en</strong>a se r<strong>en</strong>derizan a la máxima velocidad posible. Como <strong>Java</strong> <strong>3D</strong> sabe<br />

que la mayor parte de los objetos o grafos de esc<strong>en</strong>a compilados no van a cambiar,<br />

puede realizar múltiples optimizaciones como pued<strong>en</strong> ser la fusión de múltiples<br />

objetos <strong>en</strong> un objeto conceptual, modificar un objeto para disponer de él <strong>en</strong> una<br />

geometría comprimida o incluso romper un objeto <strong>en</strong> difer<strong>en</strong>tes partes y<br />

re<strong>en</strong>samblarlo <strong>en</strong> nuevos “objetos conceptuales”.<br />

13.2.6 Paquetes <strong>Java</strong> <strong>3D</strong><br />

Todos los programas de <strong>Java</strong> <strong>3D</strong> se forman, al m<strong>en</strong>os parcialm<strong>en</strong>te, uni<strong>en</strong>do distintos<br />

elem<strong>en</strong>tos de la jerarquía de clases de <strong>Java</strong> <strong>3D</strong>. Esa gran colección de objetos describe un<br />

universo virtual, que será el que posteriorm<strong>en</strong>te se r<strong>en</strong>derizará. La API define más de ci<strong>en</strong><br />

clases incluidas <strong>en</strong> el paquete javax.media.j3d. Estas clases son las normalm<strong>en</strong>te<br />

d<strong>en</strong>ominadas como clases núcleo de <strong>Java</strong> <strong>3D</strong>. Hay ci<strong>en</strong>tos de campos y métodos <strong>en</strong> dichas<br />

clases, sin embargo, un universo virtual s<strong>en</strong>cillo que cont<strong>en</strong>ga algo de animación se puede<br />

construir con sólo unas pocas de ellas.<br />

Además del paquete núcleo, a la hora de desarrollar programas <strong>en</strong> <strong>Java</strong> <strong>3D</strong> se utilizan otros<br />

paquetes. Uno de ellos es el paquete normalm<strong>en</strong>te conocido como de utilidad<br />

(com.sunj3d.utils).<br />

El paquete núcleo incluye sólo las clases de nivel más bajo necesarias para<br />

programar <strong>en</strong> <strong>Java</strong> <strong>3D</strong>. Las clases de utilidad son ext<strong>en</strong>siones muy prácticas y pot<strong>en</strong>tes.<br />

Como era de esperar, la utilización de clases de utilidad reduce significativam<strong>en</strong>te el<br />

número de líneas de código a la hora de programar.<br />

Por último, también se utilizan clases del paquete java.awt y del paquete<br />

javax.vecmath. Las clases AWT crean una v<strong>en</strong>tana para mostrar la r<strong>en</strong>derización. El<br />

segundo paquete define clases matemáticas de vectores para puntos, vectores, matrices y<br />

otros objetos matemáticos.<br />

23


13.3 MODELO DE CONTENIDOS<br />

Como ya se ha visto <strong>en</strong> los apartados anteriores, un programa <strong>en</strong> <strong>Java</strong> <strong>3D</strong> pres<strong>en</strong>ta una<br />

estructura de árbol con dos ramas bi<strong>en</strong> difer<strong>en</strong>ciadas. La primera de ellas es la rama de<br />

cont<strong>en</strong>idos, que establece qué se muestra al espectador y el aspecto de dichos objetos. La<br />

otra rama es la de visualización 1 .<br />

Esta última determina los parámetros de visualización tales como la localización de<br />

la vista y la dirección. Para facilitar el abordar la parte de cont<strong>en</strong>idos del árbol, se va a<br />

abstraer la parte correspondi<strong>en</strong>te a la rama de visualización.<br />

En este apartado, se abordan los distintos mecanismos proporcionados por <strong>Java</strong> <strong>3D</strong><br />

para la construcción de figuras geométricas, así como otros mecanismos interesantes como<br />

los cargadores de esc<strong>en</strong>a. Por último, este apartado se c<strong>en</strong>tra <strong>en</strong> los aspectos de interacción<br />

con el usuario y animación de esc<strong>en</strong>as <strong>3D</strong>. Esta sección se complem<strong>en</strong>ta con una serie de<br />

ejemplos disponibles <strong>en</strong> el CD – ROM <strong>en</strong> el directorio ejemplos.<br />

13.3.1 Sistemas de coord<strong>en</strong>adas y paquete javax.vecmath<br />

Antes de empezar a describir cómo g<strong>en</strong>erar cont<strong>en</strong>idos d<strong>en</strong>tro de un universo virtual, es<br />

necesario introducir al lector <strong>en</strong> un paquete de utilidad que permite gestionar la situación<br />

física de los elem<strong>en</strong>tos d<strong>en</strong>tro del universo (las coord<strong>en</strong>adas d<strong>en</strong>tro del sistema cartesiano),<br />

además de otros aspectos es<strong>en</strong>ciales <strong>en</strong> un universo <strong>3D</strong> (color, textura...). Este paquete se<br />

d<strong>en</strong>omina javax.vecmath.<br />

Como ya se ha m<strong>en</strong>cionado con anterioridad, una repres<strong>en</strong>tación <strong>3D</strong> no es más que<br />

una secu<strong>en</strong>cia de puntos d<strong>en</strong>tro de un sistema de coord<strong>en</strong>adas cartesianas. Para facilitar la<br />

forma de establecer la situación exacta de estos puntos se proporcionan las clases de este<br />

paquete.<br />

Los nombres de las clases de este paquete sigu<strong>en</strong> la norma de indicar el número de<br />

compon<strong>en</strong>tes que necesitan y el tipo de dichas compon<strong>en</strong>tes (b – byte, d – double, f – float).<br />

1 Si el lector desea ir investigando los conceptos relativos a la rama de cont<strong>en</strong>idos de forma<br />

paulatina (para ellos se aconseja acudir a la bibliografía), podrá abstraerse de la rama de<br />

visualización y c<strong>en</strong>trarse <strong>en</strong> la rama de cont<strong>en</strong>idos gracias a una clase de utilidad que<br />

proporciona <strong>Java</strong> <strong>3D</strong>. Esta clase es la que se d<strong>en</strong>omina SimpleUniverse y se <strong>en</strong>cu<strong>en</strong>tra <strong>en</strong> el<br />

paquete com.sun.j3d.utils.universe. Gracias a esta clase el usuario podrá crear universos<br />

virtuales con una mínima configuración de la rama de visualización. Si lo prefiere, puede<br />

empezar por el apartado 4 y c<strong>en</strong>trarse <strong>en</strong> los detalles de la rama de visualización, aunque<br />

esto no se aconseja.<br />

24


En la figura adjunta puede verse la estructura jerárquica de clases que constituy<strong>en</strong> este<br />

paquete.<br />

Figura 7 - Jerarquía de clases del paquete javax.vecmath<br />

D<strong>en</strong>tro de este paquete, las clases que realm<strong>en</strong>te se utilizan para la situación de<br />

elem<strong>en</strong>tos d<strong>en</strong>tro del universo son las clases Point* 2 , Vector y Quat*. El resto de clases,<br />

Color*, TextCoord* permite especificar aspectos como el color y la textura 3 .<br />

2 El carácter “ *” sustituye a los dos últimos caracteres del nombre de cada clase.<br />

3 Los aspectos de color y textura se analizan más adelante <strong>en</strong> este docum<strong>en</strong>to.<br />

25


Las clases del grupo d<strong>en</strong>ominado Point* permit<strong>en</strong> establecer la posición de cada<br />

uno de los vértices de un objeto. Además, también se utilizan para establecer puntos de luz,<br />

la localización espacial de una fu<strong>en</strong>te de sonido y la posición de otros tipos de elem<strong>en</strong>tos.<br />

Estas clases, además, proporcionan métodos que permit<strong>en</strong> realizar operaciones habituales<br />

d<strong>en</strong>tro de un espacio <strong>en</strong> tres dim<strong>en</strong>siones, tales como cálculos de distancia euclídea,<br />

distancia Manhattan... La unidad de medida es el metro.<br />

Las clases Vector* se utilizan, normalm<strong>en</strong>te, para determinar superficies, ya que<br />

también se suel<strong>en</strong> utilizar para repres<strong>en</strong>tar la dirección de una fu<strong>en</strong>te de luz o una fu<strong>en</strong>te de<br />

sonido. Esta clase además, proporciona métodos que facilitan las operaciones con vectores,<br />

tales como productos cruzados, normalización, cálculo del ángulo inscrito <strong>en</strong>tre dos<br />

vectores...<br />

Las clases Quat* se utilizan para transformaciones de matrices avanzadas. Se ha<br />

com<strong>en</strong>tado que las clases Color* y TextCoord* permit<strong>en</strong> definir aspectos de un objeto no<br />

relacionados con su posición física sino con su aspecto externo. Las clases Color* permit<strong>en</strong><br />

definir el color y la transpar<strong>en</strong>cia. Las clases Color3* permit<strong>en</strong> definir <strong>en</strong> color <strong>en</strong> formato<br />

RGB. Las clases Color4* permit<strong>en</strong>, además, definir la transpar<strong>en</strong>cia que por defecto es<br />

opaca. Las clases TextCoord* se c<strong>en</strong>tra <strong>en</strong> aspectos relativos a la textura de los objetos.<br />

13.3.2 Formas geométricas<br />

Una vez analizado uno de los mecanismos para definir puntos concretos <strong>en</strong> el<br />

espacio <strong>3D</strong>, superficies y otros elem<strong>en</strong>tos como el color y la textura, se va a abordar la<br />

forma de crear objetos <strong>3D</strong>.<br />

La forma de crear objetos visuales es mediante la clase Shape<strong>3D</strong>. Esta clase, que<br />

desci<strong>en</strong>de de forma directa de la clase Leaf, puede aparecer únicam<strong>en</strong>te como hoja d<strong>en</strong>tro<br />

de una de las ramas del grafo de cont<strong>en</strong>idos. Esta clase no conti<strong>en</strong>e ninguna información a<br />

cerca de la forma o el color del objeto visual. Estos aspectos se defin<strong>en</strong> a través de los<br />

objetos NodeCompon<strong>en</strong>t. A través de este tipo de nodos, se va a poder definir la geometría<br />

(clase Geometry y sus desc<strong>en</strong>di<strong>en</strong>tes) y la apari<strong>en</strong>cia (clase Appearance y sus<br />

desc<strong>en</strong>di<strong>en</strong>tes) del objeto visual.<br />

Para definir un objeto <strong>3D</strong> únicam<strong>en</strong>te es necesario definir la geometría de dicho<br />

objeto, ya que se define una apari<strong>en</strong>cia de forma automática.<br />

Una vez creado el objeto Shape<strong>3D</strong> y definidas sus características geométricas y de<br />

apari<strong>en</strong>cia, se añade a la rama de cont<strong>en</strong>idos, con lo que ya puede ser visualizado.<br />

En los sigui<strong>en</strong>tes apartados, se verá como utilizar los elem<strong>en</strong>tos geométricos predefinidos<br />

<strong>en</strong> la distribución de <strong>Java</strong> <strong>3D</strong>, así como los mecanismos para definir la geometría de objetos<br />

<strong>3D</strong> creado por el programador.<br />

26


13.3.2.1 Formas geométricas predefinidas<br />

D<strong>en</strong>tro del paquete com.sun.j3d.utils.geometry se proporcionan una serie de elem<strong>en</strong>tos <strong>3D</strong><br />

comunes <strong>en</strong> universos <strong>3D</strong>, como son cajas (Box), conos (Cone), cilindros (Cylinder) y<br />

esferas (Sphere).<br />

Existe una quinta estructura geométrica, ColorCube, que muestra un cubo con cada<br />

una de sus caras coloreadas y con efectos de luz ya establecidos. Esta clase está situada <strong>en</strong><br />

un punto difer<strong>en</strong>te de la jerarquía de objetos, de hecho es un desc<strong>en</strong>di<strong>en</strong>te de la clase<br />

Shape<strong>3D</strong>.<br />

Estas figuras geométricas predefinidas no son más que objetos con un<br />

NodeCompon<strong>en</strong>t asociado que define su geometría y que no se puede cambiar, aunque<br />

algunos de sus parámetros se pued<strong>en</strong> configurar. Ninguna de estas estructuras, salvo<br />

ColorCube, define ningún tipo de apari<strong>en</strong>cia, y por lo tanto debe ser configurada por el<br />

programador. En el caso del objeto ColorCube, tanto geometría como apari<strong>en</strong>cia ya están<br />

predefinidas y no pued<strong>en</strong> ser alteradas, salvo el tamaño del cubo.<br />

Figura 8 - Jerarquía de clases para las figuras geométricas predefinidas<br />

El objetivo de estos cinco tipos de objetos es proporcionar un mecanismo rápido<br />

para crear cont<strong>en</strong>idos <strong>en</strong> tres dim<strong>en</strong>siones con poco esfuerzo de programación. Así, son<br />

muy utilizadas, sobre todo, a la hora de realizar prototipos <strong>3D</strong> de forma rápida y simple.<br />

La clase Box define un cubo <strong>3D</strong> de dim<strong>en</strong>siones 2metros x 2metros x 2metros cuyos<br />

vértices se localizan <strong>en</strong> (-1, -1, -1) y (1, 1, 1). Tanto las dim<strong>en</strong>siones como la situación de<br />

27


los vértices es configurable <strong>en</strong> el mom<strong>en</strong>to de creación del cubo. Esta configurabilidad es<br />

una tónica para todas las figuras predefinidas aquí com<strong>en</strong>tadas.<br />

La clase Cone define un cono c<strong>en</strong>trado <strong>en</strong> el orig<strong>en</strong> de coord<strong>en</strong>adas y alineado a lo<br />

largo del eje de ord<strong>en</strong>adas. El radio por defecto es de un metro y la altura del cono es de<br />

dos metros. Al igual que sucedía con la clase Box, tanto la altura como el radio son<br />

configurables.<br />

La clase Cylinder crea un cilindro con sus extremos cerrados y c<strong>en</strong>trado <strong>en</strong> el orig<strong>en</strong><br />

de coord<strong>en</strong>adas y con su eje c<strong>en</strong>tral a lo largo del eje ord<strong>en</strong>adas. Las dim<strong>en</strong>siones por<br />

defecto son de 1 metro para el radio y de 2 metros de altura.<br />

La clase Sphere muestra una esfera c<strong>en</strong>trada <strong>en</strong> el orig<strong>en</strong> y de radio 1.<br />

En la página de recursos pued<strong>en</strong> <strong>en</strong>contrarse ejemplo del uso de alguna de estas<br />

primitivas. Así <strong>en</strong> el ejemplo Hello<strong>Java</strong><strong>3D</strong>/Hello<strong>Java</strong><strong>3D</strong>c.java se construye y anima un<br />

ColorCube. En el ejemplo Geometry/ConeYoyoApp.java se construye un yoyo con el uso<br />

de dos objetos Cone. El resto de primitivas se utilizan de forma muy similar.<br />

13.3.2.2 Construcción de elem<strong>en</strong>tos geométricos<br />

La forma de g<strong>en</strong>erar cont<strong>en</strong>ido <strong>3D</strong> hasta este mom<strong>en</strong>to se puede considerar simple pero<br />

poco pot<strong>en</strong>te.<br />

Para construir figuras más complejas es necesario establecer punto a punto todos los<br />

vértices que lo forman y establecer, una a una, todas sus características. De hecho, la<br />

construcción de figuras <strong>3D</strong> complejas se basa <strong>en</strong> la construcción de triángulos, y <strong>en</strong> la<br />

disposición conjunta de éstos (básicam<strong>en</strong>te, los puntos del espacio se van a agrupar <strong>en</strong><br />

triángulos para formar volúm<strong>en</strong>es).<br />

Tanto la especificación de la localización de un punto <strong>en</strong> el espacio, como la<br />

definición de otras características (color, textura...), se realiza a través de lo que se<br />

d<strong>en</strong>omina notación basada <strong>en</strong> vértices, es decir todas las características se defin<strong>en</strong> mediante<br />

vectores de tres o cuatro compon<strong>en</strong>tes, como si de puntos del espacio se tratara.<br />

Es <strong>en</strong> este punto, donde <strong>en</strong>tra <strong>en</strong> esc<strong>en</strong>a la clase Geometry y todas sus subclases que<br />

van a permitir este tipo de diseño, facilitando <strong>en</strong> gran medida este trabajo. El lector no debe<br />

perder de vista que estas clases son del tipo NodeCompon<strong>en</strong>t y que no ti<strong>en</strong><strong>en</strong> ningún<br />

s<strong>en</strong>tido sino se asocian a un objeto Shape<strong>3D</strong> que es el que realm<strong>en</strong>te establece el objeto<br />

visual y es el que se incluye d<strong>en</strong>tro de la rama del grafo de cont<strong>en</strong>idos.<br />

La jerarquía de clases, tal y como puede verse <strong>en</strong> la sigui<strong>en</strong>te figura, es<br />

considerable.<br />

28


Figura 9 - Jerarquía de clases para la clase Geometry<br />

A continuación, se analizarán cada una de las clases.<br />

Clase GeometryArray<br />

Las subclases de esta clase van a permitir definir un conjunto de puntos, así como la forma<br />

<strong>en</strong> que esos puntos se conectan <strong>en</strong>tre sí formando rectas y superficies. De esta manera, se va<br />

defini<strong>en</strong>do la morfología de la figura <strong>3D</strong>.<br />

La clase GeometryArray es una clase abstracta, lo que significa que no puede ser<br />

instanciada de forma directa, sino que debe instanciarse alguna de sus subclases.<br />

Cuando se crea una instancia de una clase desc<strong>en</strong>di<strong>en</strong>tes de GeometryArray, se<br />

establece como únicos parámetros, el número de vértices que va a cont<strong>en</strong>er el objeto<br />

GeometryArray, y la semántica de dichos puntos. Como se ha com<strong>en</strong>tado <strong>en</strong> la introducción<br />

de este apartado, todas las características de un objeto se especifican a través de lo que se<br />

d<strong>en</strong>omina formato de vértices (vertex format). Esto no es más que utilizar la misma<br />

notación para configurar las difer<strong>en</strong>tes características de un objeto <strong>3D</strong>.<br />

Así, exist<strong>en</strong> los sigui<strong>en</strong>tes tipos semánticos para los vértices:<br />

1. COORDINATES: especifica que los vértices cont<strong>en</strong>idos <strong>en</strong> el vector indican<br />

situación física.<br />

2. NORMALS: especifica que los vértices van a repres<strong>en</strong>tar una superficie (las<br />

coord<strong>en</strong>adas defin<strong>en</strong> el vector normal a dicha superficie).<br />

3. COLOR_3 y COLOR_4: indican que los vértices id<strong>en</strong>tifican color sin indicar<br />

transpar<strong>en</strong>cia e indicando transpar<strong>en</strong>cia, respectivam<strong>en</strong>te.<br />

4. TEXTURE_COORDINATE_2 y TEXTURE_COORDINATE_3: especifican<br />

textura <strong>en</strong> dos dim<strong>en</strong>siones y tres dim<strong>en</strong>siones, respectivam<strong>en</strong>te.<br />

Sobre el color y la textura se volverá <strong>en</strong> los apartados de Luces y Texturas.<br />

29


Creada la clase, es necesario completar la estructura recién creada con los valores <strong>en</strong><br />

formato de vértices adecuados. Para ello, la clase GeometryArray proporciona métodos<br />

adecuados para incorporar dicho cont<strong>en</strong>ido dep<strong>en</strong>di<strong>en</strong>do del s<strong>en</strong>tido semántico que se ha<br />

establecido. Un ejemplo de dichas funciones es setCoordinate(int index, Point*<br />

coordinate) 4 que se utiliza habi<strong>en</strong>do, previam<strong>en</strong>te, activado el bit COORDINATES.<br />

Creado el cont<strong>en</strong>ido, se asocia con el objeto visual (Shape<strong>3D</strong>) a través de los<br />

métodos que proporciona dicha clase.<br />

La clase GeometryArray es una clase abstracta, por lo que es necesario utilizar<br />

alguna de sus subclases. A continuación, se muestran dichas clases y su funcionami<strong>en</strong>to<br />

básico.<br />

Clases no indexadas<br />

El primer grupo de subclases, d<strong>en</strong>ominadas no indexadas, se caracterizan por el<br />

hecho de que cada vez que se dibuja una figura <strong>3D</strong> las coord<strong>en</strong>adas son utilizadas una sola<br />

vez. Cada una de las subclases se difer<strong>en</strong>cia del resto <strong>en</strong> la forma <strong>en</strong> la que trata la conexión<br />

de los puntos <strong>en</strong>tre sí.<br />

La primera de ellas es PointArray. Esta clase considera cada uno de los puntos de<br />

forma indep<strong>en</strong>di<strong>en</strong>te sin considerar ninguna conexión <strong>en</strong>tre ellos.<br />

La clase LineArray, por el contrario, sí considera conexión <strong>en</strong>tre los puntos.<br />

Considera parejas de puntos y los conecta. Cada punto únicam<strong>en</strong>te puede estar conectado<br />

con otro punto. Así, si se considera cada par de puntos conectados por una recta como un<br />

conjunto, todos los conjuntos son disjuntos dos a dos. Si {v0,…, v5} son los puntos, las<br />

rectas formadas son aquellas limitadas por los pares de puntos {v0, v1}, {v2, v3}, {v4, v5}.<br />

Para ver como considera dichas parejas acuda a la Figura 13. 6. Se puede ver un ejemplo<br />

del uso de esta clase <strong>en</strong> Geometry/AxisApp.java.<br />

La clase TriangleArray considera grupos de tres puntos para construir triángulos. Al<br />

igual que sucedía con la clase LineArray, cada punto puede únicam<strong>en</strong>te pert<strong>en</strong>ecer a un<br />

triángulo. Si se considera el mismo conjunto de puntos que <strong>en</strong> el caso anterior los<br />

triángulos que se forma son aquellos cuyos vértices son {v0, v1, v2}, {v3, v4, v5}. Su uso es<br />

muy similar al de la clase LineArray.<br />

La clase QuadArray considera grupos de cuatro puntos para construir cuadriláteros.<br />

Como <strong>en</strong> los casos anteriores dichos cuadriláteros son disjuntos con respecto al resto.<br />

Tanto los triángulos formados mediante la clase TriangleArray como los<br />

cuadriláteros formados mediante el uso de la clase QuadArray están rell<strong>en</strong>os por defecto.<br />

4 Acudir a (Sun Microsystems, 1999) para ver el resto de funciones.<br />

30


La clase GeometryStripArray altera la forma de conexión de los puntos. Esta clase<br />

es abstracta con lo que es necesario hacer uso de sus subclases LineStripArray,<br />

TriangleStripArray y TriangleFanArray. El objetivo de estas clases es la construcción de<br />

elem<strong>en</strong>tos donde la reutilización de puntos sea un aspecto crucial <strong>en</strong> su diseño. De esta<br />

manera, van a permitir construir líneas y superficies compuestas.<br />

Haci<strong>en</strong>do un paralelismo con las clases anteriores, la clase LineStripArray se puede<br />

asemejar a la clase LineArray salvo por el hecho de que el extremo de la recta anterior sirve<br />

de orig<strong>en</strong> para la recta sigui<strong>en</strong>te. Así, considerando el conjunto de seis puntos, las líneas<br />

formadas por la clase LineStripArray son las sigui<strong>en</strong>tes {v0, v1}, {v1, v2}, {v2, v3}, {v3, v4},<br />

{v4, v5}.<br />

La clase TriangleStripArray forma triángulos con los puntos de forma que los dos<br />

últimos vértices utilizados para formar el triángulo anterior son utilizados para construir el<br />

sigui<strong>en</strong>te triángulo.<br />

La clase TriangleFanArray posee un comportami<strong>en</strong>to ligeram<strong>en</strong>te difer<strong>en</strong>te a<br />

TriangleStripArray. Considera el primero de los puntos como el vértice superior de todos<br />

los triángulos. El efecto final se asemeja a un “abanico” (fan), que puede observarse <strong>en</strong> la<br />

Figura 13.11. Un ejemplo de su utilización se puede ver <strong>en</strong> el ejemplo<br />

Geometry/YoyoLineApp.java donde se crea un yoyo con esta clase. Este ejemplo también<br />

incluye aspectos relativos con la modificación de la apari<strong>en</strong>cia por defecto. El tema de la<br />

apari<strong>en</strong>cia se aborda <strong>en</strong> el apartado Apari<strong>en</strong>cia.<br />

En la construcción de objetos de cualquiera de las clases derivadas de<br />

GeometryStripArray, se aprecian difer<strong>en</strong>cias con respecto a la forma de crear los objetos<br />

GeometryArray básicos. En este caso, además de establecer el número de vértices y el<br />

s<strong>en</strong>tido semántico de dichos vértices, existe un tercer parámetro que establece el número de<br />

grupos de conexión (strips) que pued<strong>en</strong> construirse.<br />

Cada compon<strong>en</strong>te indica el número de vértices que van a formar parte de cada<br />

grupo. Por supuesto, la suma de compon<strong>en</strong>tes de este vector debe ser igual al número de<br />

vértices indicados <strong>en</strong> el primer parámetro. Este constructor se puede observar <strong>en</strong> el ejemplo<br />

anteriorm<strong>en</strong>te indicado.<br />

Clases indexadas<br />

El primer grupo de clases se caracteriza por no reutilizar ninguno de sus vértices cada ver<br />

que se redibuja la figura. Únicam<strong>en</strong>te las clases derivadas de GeometryStripArray reutilizan<br />

parcialm<strong>en</strong>te los vértices que conti<strong>en</strong><strong>en</strong>. Por el contrario, las clases derivadas de<br />

IndexedGeometryArray proporcionan un nivel más de indirección. Esto permite reutilizar<br />

los vértices, de forma indep<strong>en</strong>di<strong>en</strong>te a su situación física d<strong>en</strong>tro del vector de puntos<br />

proporcionado.<br />

Para efectos de la compr<strong>en</strong>sión de estas clases, se van a difer<strong>en</strong>ciar los vectores de<br />

puntos que utilizan <strong>en</strong> dos grupos: los vectores de datos y los vectores de índices. Los<br />

primeros hac<strong>en</strong> refer<strong>en</strong>cia a los tipos que ya se han visto hasta ahora. Son los que conti<strong>en</strong><strong>en</strong><br />

31


los puntos que id<strong>en</strong>tifican coord<strong>en</strong>adas, color, textura... Los vectores de índices conti<strong>en</strong><strong>en</strong><br />

refer<strong>en</strong>cias a los vectores de datos.<br />

D<strong>en</strong>tro de estos últimos, exist<strong>en</strong> cuatro tipos: los índices de coord<strong>en</strong>adas, los de<br />

color, superficie y de textura. Nótese que exist<strong>en</strong> tantos tipos de índices como tipos de<br />

vectores de datos. El número de vectores de índices coincide con el de vectores de datos y<br />

el número de compon<strong>en</strong>tes d<strong>en</strong>tro de cada vector de índices es, normalm<strong>en</strong>te, mayor que el<br />

número de compon<strong>en</strong>tes de los vectores de datos.<br />

Un vector de índices podría t<strong>en</strong>er, <strong>en</strong> un mom<strong>en</strong>to dado, múltiples refer<strong>en</strong>cias al<br />

mismo vértice <strong>en</strong> los vectores de datos. Así, un vector de índices determina el ord<strong>en</strong> de<br />

procesami<strong>en</strong>to de los datos <strong>en</strong> los vectores de datos a la hora de mostrar la geometría de la<br />

imag<strong>en</strong> <strong>3D</strong>.<br />

Para compr<strong>en</strong>der cómo funciona, considérese el ejemplo de un cubo. En este caso<br />

los vértices de dicha figura se pued<strong>en</strong> reutilizar a la hora de dibujar cada cara.<br />

Figura 10 - Ejemplo de creación de un cubo empleando clases indexadas<br />

El problema principal de utilización de este tipo de clases indexadas es el<br />

r<strong>en</strong>dimi<strong>en</strong>to. Así, son muy útiles <strong>en</strong> <strong>en</strong>tornos donde aspectos como la velocidad y la<br />

memoria no son críticos.<br />

La clase IndexedGeometryArray es una clase abstracta. A partir de ésta, surg<strong>en</strong> una<br />

serie de subclases que sí pued<strong>en</strong> ser utilizadas. Estas clases son las que se muestran <strong>en</strong> la<br />

figura adjunta.<br />

32


Figura 11 - Jerarquía de clases de definición geométrica indexadas<br />

Como puede observarse existe la clase indexada equival<strong>en</strong>te a la clase no indexada.<br />

El funcionami<strong>en</strong>to de las clases indexadas, de cara al usuario, es el mismo que el de su<br />

equival<strong>en</strong>te no indexada, pero la forma de trabajo interna es distinta.<br />

Otras clases<br />

Un tercer grupo de clase relacionadas con la g<strong>en</strong>eración de elem<strong>en</strong>tos geométrico es el<br />

formado por las clases Raster, CompressedGeometry y Text<strong>3D</strong>. Esta última clase se analiza<br />

<strong>en</strong> el apartado Texto 2D y <strong>3D</strong>. Las otras dos clases se describ<strong>en</strong> de forma breve a<br />

continuación. Las otras dos clases quedan fuera del alcance de este docum<strong>en</strong>to. Para más<br />

información acudir a (Sun Microsystems, 1999).<br />

13.3.2.3 Texto 2D y <strong>3D</strong><br />

Aunque el texto <strong>en</strong> sí no se puede considerar una forma geométrica, sí es una forma de<br />

incorporar cont<strong>en</strong>ido a una esc<strong>en</strong>a <strong>3D</strong>, y no sólo eso, sino que es un elem<strong>en</strong>to habitual <strong>en</strong><br />

universos <strong>en</strong> tres dim<strong>en</strong>siones. En este apartado, se mostrará cómo incorporar texto <strong>en</strong> un<br />

universo <strong>3D</strong> y cómo configurar alguno de sus parámetros.<br />

<strong>Java</strong> <strong>3D</strong> considera el texto 2D y <strong>3D</strong> de formas difer<strong>en</strong>tes. Mi<strong>en</strong>tras el primero es un<br />

objeto desc<strong>en</strong>di<strong>en</strong>te de Shape<strong>3D</strong>, y por lo tanto, directam<strong>en</strong>te incorporable al grafo de<br />

cont<strong>en</strong>idos, el texto <strong>3D</strong> es un NodeCompon<strong>en</strong>t y, como tal, necesita de la definición de un<br />

objeto Shape<strong>3D</strong> para poder utilizarlo.<br />

La clase que da soporte al texto 2D es la clase Text2D pres<strong>en</strong>te <strong>en</strong> el paquete<br />

com.sun.j3d.utils.geometry. Esta clase permite definir no sólo el texto que se desea que<br />

aparezca, sino otros aspectos como color, tipo de fu<strong>en</strong>te, tamaño de la fu<strong>en</strong>te y formato de<br />

dicha fu<strong>en</strong>te. Creado el texto 2D, únicam<strong>en</strong>te queda añadirlo al grafo de esc<strong>en</strong>a. Un<br />

ejemplo de uso de texto <strong>en</strong> dos dim<strong>en</strong>siones se puede <strong>en</strong>contrar <strong>en</strong><br />

easyCont<strong>en</strong>t/Text2Dapp.java 5 .<br />

5 Este ejemplo incluye elem<strong>en</strong>tos de animación. La animación se trata <strong>en</strong> el apartado <strong>Movimi<strong>en</strong>to</strong> <strong>en</strong> <strong>Java</strong> <strong>3D</strong>.<br />

33


En cuanto al texto <strong>3D</strong>, éste pres<strong>en</strong>ta ciertas características adicionales respecto al<br />

texto 2D que requier<strong>en</strong> más at<strong>en</strong>ción. En primer lugar, el texto <strong>3D</strong> está p<strong>en</strong>sado como un<br />

NodeCompon<strong>en</strong>t y como tal se debe incorporar a un objeto Shape<strong>3D</strong>. Para incorporar texto<br />

<strong>en</strong> tres dim<strong>en</strong>siones son necesarias dos clases adicionales: la clase Font<strong>3D</strong> y la clase<br />

Text<strong>3D</strong>. La clase Font<strong>3D</strong> permite crear una instancia de una fu<strong>en</strong>tes estándar <strong>en</strong> una fu<strong>en</strong>te<br />

<strong>en</strong> tres dim<strong>en</strong>siones. A la fu<strong>en</strong>te planta se le añade una extrusión, es decir profundidad a<br />

través del objeto FontExtrusion.<br />

Una vez creada la fu<strong>en</strong>te <strong>3D</strong>, se crea la instancia de la clase Text<strong>3D</strong>. En el mom<strong>en</strong>to<br />

de creación de esta instancia se establece el objeto Font<strong>3D</strong> anteriorm<strong>en</strong>te creado, así como<br />

el texto que se desea mostrar. Además, a través de la clase Text<strong>3D</strong> se pued<strong>en</strong> especificar<br />

otros aspectos del texto <strong>3D</strong> que se desea mostrar. Estas características son la posición y el<br />

punto de refer<strong>en</strong>cia. La posición se refiere al punto concreto d<strong>en</strong>tro del espacio donde se<br />

sitúa el punto de refer<strong>en</strong>cia. El punto de refer<strong>en</strong>cia establece el punto de orig<strong>en</strong> del objeto.<br />

La ori<strong>en</strong>tación y la alineación defin<strong>en</strong> el punto de refer<strong>en</strong>cia. En la sigui<strong>en</strong>te figura se<br />

observa el efecto de cada uno de los parámetros.<br />

Figura 12 - Ori<strong>en</strong>tación y alineación de un texto <strong>3D</strong><br />

El uso de texto <strong>3D</strong> se puede ver <strong>en</strong> la aplicación easyCont<strong>en</strong>t/Text<strong>3D</strong>app.java.<br />

13.3.2.4 Ayudas a la construcción de figuras geométricas<br />

Para crear una figura geométrica es necesario establecer cada uno de los puntos que va a<br />

ocupar <strong>en</strong> el espacio, y luego g<strong>en</strong>erar superficies utilizando dichos puntos (las superficies<br />

son normalm<strong>en</strong>te triángulos). Se ha visto como este trabajo se realiza de forma s<strong>en</strong>cilla a<br />

través de las clases desc<strong>en</strong>di<strong>en</strong>tes de GeometryArray. Aún así, la creación de una figura<br />

puede llegar a ser una labor ardua y muy compleja. Para facilitar un poco el trabajo, el API<br />

de <strong>Java</strong> <strong>3D</strong> proporciona un conjunto de clases de utilidad que, a partir del contorno de la<br />

34


figura a construir, realizan los cálculos necesarios para, por ejemplo, g<strong>en</strong>erar los triángulos<br />

necesarios para formar el resto de la figura.<br />

Estas clases se <strong>en</strong>cu<strong>en</strong>tran <strong>en</strong> el paquete com.sun.j3d.utils.geometry.<br />

La clase GeometryInfo funciona como un cont<strong>en</strong>edor de puntos con una<br />

determinada connotación semántica. Cuando se define un objeto de este tipo, se establece la<br />

naturaleza de las superficies a construir con dichos puntos. Así, a través de una serie de<br />

flags, se define si se construirán polígonos (POLYGON_ARRAY), si se construirán<br />

cuadriláteros (QUAD_ARRAY) o triángulos (TRIANGLE_ARRAY,<br />

TRIANGLE_STRIP_ARRAY, TRIANGLE_FAN_ARRAY). A través de los métodos<br />

adecuados se introduc<strong>en</strong>, <strong>en</strong> la instancia de GeometryInfo las coord<strong>en</strong>adas de los puntos.<br />

Una vez creada una instancia de la clase GeometryInfo el uso de otras clases van a<br />

permitir realizar nuevas transformaciones sobre los puntos especificados <strong>en</strong> la primera.<br />

Estas clases son la clase Triangulator, NormalG<strong>en</strong>erator y Stripifier. Todas ellas van a<br />

tomar como refer<strong>en</strong>cia una instancia de la clase GeometryInfo para realizar nuevas<br />

operaciones sobre la matriz de puntos.<br />

La clase Triangulator permite convertir cualquier tipo de polígonos <strong>en</strong> triángulos<br />

que <strong>Java</strong> <strong>3D</strong> puede procesar. Esta clase trabaja sólo <strong>en</strong> aquellas circunstancias <strong>en</strong> las que la<br />

clase GeometryInfo se define utilizando el flag POLYGON_ARRAY.<br />

La clase NormalG<strong>en</strong>erator se <strong>en</strong>carga de calcular y rell<strong>en</strong>ar superficies normales a<br />

partir de los puntos del objeto GeometryInfo. Esta transformación se basa <strong>en</strong> el uso de datos<br />

indexados. En el caso de que los puntos proporcionados por GeometryInfo no pres<strong>en</strong>t<strong>en</strong><br />

esta estructura, se g<strong>en</strong>era el índice adecuado. Al contrario que la clase Triangulator, la<br />

clase NormalG<strong>en</strong>erator puede utilizarse de forma indep<strong>en</strong>di<strong>en</strong>te del flag elegido.<br />

La clase Stripifier analiza los triángulos cont<strong>en</strong>idos <strong>en</strong> el vector de datos de<br />

GeometryInfo y los convierte <strong>en</strong> una estructura de triángulos similar a la obt<strong>en</strong>ida con la<br />

clase TriangleStripArray. Como consecu<strong>en</strong>cia, se obti<strong>en</strong>e una estructura de triángulos más<br />

optimizada que con la clase Triangulator. Normalm<strong>en</strong>te, para mejorar el funcionami<strong>en</strong>to de<br />

la clase Stripifier, esta transformación se combina con la clase NormalG<strong>en</strong>erator.<br />

Los pasos descritos <strong>en</strong> este apartado así como el uso de las distintas clases se puede<br />

ver <strong>en</strong> la aplicación easyCont<strong>en</strong>t/GeometryInfoApp.java.<br />

13.3.2.5 Cargadores de esc<strong>en</strong>as <strong>3D</strong><br />

Existe una gran variedad de programas que permit<strong>en</strong> g<strong>en</strong>erar cont<strong>en</strong>idos <strong>en</strong> tres<br />

dim<strong>en</strong>siones y almac<strong>en</strong>ar dicho cont<strong>en</strong>ido <strong>en</strong> un fichero para su posterior utilización.<br />

Programas de este estilo son <strong>3D</strong>-Studio, Autocad...<br />

<strong>Java</strong> <strong>3D</strong> proporciona como parte de su API un conjunto de utilidades (loaders) que<br />

van a permitir incluir el cont<strong>en</strong>ido de los ficheros g<strong>en</strong>erados por otras aplicaciones <strong>en</strong><br />

35


universos virtuales. Este conjunto de utilidades se <strong>en</strong>cu<strong>en</strong>tra <strong>en</strong> el paquete<br />

com.sun.j3d.loaders.<br />

Como ya habrá intuido el lector esto abre las puertas a una forma de g<strong>en</strong>erar<br />

cont<strong>en</strong>ido <strong>3D</strong> mucho más pot<strong>en</strong>te y más s<strong>en</strong>cilla. La dificultad de g<strong>en</strong>erar figuras <strong>en</strong> <strong>3D</strong><br />

está <strong>en</strong> distribuir, de forma correcta, los puntos <strong>en</strong> el espacio. En el caso de aplicaciones<br />

simples, este problema no es un gran inconv<strong>en</strong>i<strong>en</strong>te, pero a medida que las esc<strong>en</strong>as se<br />

complican, la tarea de situar cada punto puede llegar a ser una tarea tediosa, e incluso<br />

intratable. Por lo tanto, si se pudiera disponer de herrami<strong>en</strong>tas de diseño <strong>3D</strong> avanzado para<br />

construir las figuras <strong>3D</strong> y luego importar dichas figuras, las esc<strong>en</strong>as que se podrían<br />

conseguir sólo estarían limitadas por la imaginación del programador.<br />

En realidad, estos cargadores de esc<strong>en</strong>as no forman parte del API de <strong>Java</strong> <strong>3D</strong>, sino<br />

que, simplem<strong>en</strong>te, <strong>Java</strong> <strong>3D</strong> proporciona los mecanismos para su construcción. Es decir,<br />

sólo especifican la interfaz de dichos cargadores, sin establecer cómo deb<strong>en</strong> implem<strong>en</strong>tarse.<br />

El número de cargadores disponibles es bastante considerable, y mucho de ellos de<br />

libre distribución. <strong>Java</strong> <strong>3D</strong> proporciona un ejemplo de cargador ya implem<strong>en</strong>tado para el<br />

formato “.obj”. Este cargador está disponible a través de la clase ObjectFile <strong>en</strong> el paquete<br />

com.sun.j3d.loaders.objectfile.<br />

Además <strong>Java</strong> <strong>3D</strong> va a permitir no sólo cargar una esc<strong>en</strong>a completa de un fichero<br />

externo, sino partes de dicha esc<strong>en</strong>a, se puede especificar que únicam<strong>en</strong>te se cargu<strong>en</strong><br />

ciertos efectos de luz, nieblas... o incluso combinar varios ficheros externos para formar<br />

una misma esc<strong>en</strong>a. La pot<strong>en</strong>cia que se puede conseguir sólo dep<strong>en</strong>de de la implem<strong>en</strong>tación<br />

del cargador que se esté utilizando y de la propia especificación del fichero que se está<br />

procesando 6 .<br />

Las clases e interfaces que dan soporte a esta tecnología son los sigui<strong>en</strong>tes:<br />

Loader. Esta interfaz define una serie de métodos que permit<strong>en</strong> determinar la<br />

localización del fichero desde el cual cargar la esc<strong>en</strong>a, así como un conjunto de<br />

flags que determina que elem<strong>en</strong>tos del fichero se desean cargar. Algunos de estos<br />

flags son: LOAD_ALL que permite cargar todo el fichero;<br />

LOAD_BACKGROUND_NODES que permite cargar únicam<strong>en</strong>te los elem<strong>en</strong>tos<br />

que configuran el fondo; LOAD_LIGTH_NODES que determina que sólo se<br />

cargarán los elem<strong>en</strong>tos de luz, etc.<br />

Sc<strong>en</strong>e. Esta interfaz define un conjunto de métodos que serán los <strong>en</strong>cargados de<br />

extraer las características de la esc<strong>en</strong>a cargada desde el fichero.<br />

LoaderBase. Esta clase implem<strong>en</strong>ta la interfaz Loader. Los autores de cargadores<br />

exti<strong>en</strong>d<strong>en</strong> esta clase como paso previo a la construcción de sus propiso cargadores.<br />

6<br />

Si el fichero externo no especifica cont<strong>en</strong>ido sobre luces, sonido..., este tipo de cont<strong>en</strong>idos<br />

no se podrá cargar.<br />

36


Sc<strong>en</strong>eBase. Esta clase implem<strong>en</strong>ta la interfaz Sc<strong>en</strong>e. Esta clase implem<strong>en</strong>ta un<br />

conjunto de métodos que permit<strong>en</strong> recuperar cada uno de los nodos que forman la<br />

esc<strong>en</strong>a cargada desde el fichero. Así, por ejemplo, cu<strong>en</strong>ta con métodos como<br />

getBackgroundNodes() que permite recuperar un vector con todos los nodos que<br />

forman el fondo de la esc<strong>en</strong>a.<br />

13.3.3 Modificación de la apari<strong>en</strong>cia<br />

En el apartado anterior, se ha analizado difer<strong>en</strong>tes formas de construcción de figuras<br />

geométricas. Dejando a un lado las figuras geométricas preestablecidas, se ha visto como el<br />

mecanismo de trabajo es crea un objeto del tipo NodeCompon<strong>en</strong>t que cont<strong>en</strong>ga la<br />

información geométrica para dibujar la figura <strong>en</strong> tres dim<strong>en</strong>siones. Esta forma de trabajo se<br />

continúa para establecer efectos de apari<strong>en</strong>cia <strong>en</strong> las figuras, es decir, se crea un objeto de<br />

la clase anterior que cont<strong>en</strong>drá la información necesaria para configurar la apari<strong>en</strong>cia de las<br />

figuras.<br />

En este apartado, se analiza como realizar dichas operaciones de cambio de<br />

apari<strong>en</strong>cia, tanto a nivel de una figura concreta, como a nivel de toda una esc<strong>en</strong>a.<br />

13.3.3.1 Concepto de límite<br />

En muchos aspectos d<strong>en</strong>tro de <strong>Java</strong> <strong>3D</strong> (luces, comportami<strong>en</strong>to, configuración del fondo...)<br />

se utilizan límites o rangos. Los límites (bounds) van a permitir al programador flexibilizar<br />

acciones, apari<strong>en</strong>cia..., limitando las regiones de influ<strong>en</strong>cia de determinados elem<strong>en</strong>tos. Un<br />

límite permite definir un área <strong>en</strong> la cual un determinado elem<strong>en</strong>to ti<strong>en</strong>e influ<strong>en</strong>cia.<br />

En implem<strong>en</strong>tación, existe una clase g<strong>en</strong>eral d<strong>en</strong>ominada Bounds que permite<br />

incluir d<strong>en</strong>tro de un grafo de esc<strong>en</strong>a el concepto de límite. Una instancia de esta clase se<br />

<strong>en</strong>laza con un objeto del grafo de esc<strong>en</strong>a. Así, cada vez que el objeto del grafo de esc<strong>en</strong>a se<br />

desplace, el objeto Bounds irá con él. En otros casos, los objetos Bounds t<strong>en</strong>drán autonomía<br />

de movimi<strong>en</strong>to 7 . La forma más común de determinar los límites de influ<strong>en</strong>cia de un<br />

determinado elem<strong>en</strong>to es mediante la definición de una esfera de cierto tamaño. Esta forma<br />

de trabajo es lógica ya que la esfera es la figura geométrica más adecuada para establecer<br />

una región d<strong>en</strong>tro de un mundo <strong>en</strong> tres dim<strong>en</strong>siones. La forma de definir dicha esfera es a<br />

través de la clase BoundingSphere. Aunque, no es la única manera. Exist<strong>en</strong> clases que<br />

permit<strong>en</strong> definir los límites <strong>en</strong> base a figuras que no son una esfera, como son BoundingBox<br />

y BoundingPolytope.<br />

Como ejemplo ilustrativo del concepto de límite, considérese una esc<strong>en</strong>a <strong>en</strong> la que<br />

existe una serie de elem<strong>en</strong>tos <strong>en</strong> movimi<strong>en</strong>to y un punto de luz fijo que ilumina todos los<br />

7 Que el objeto Bound t<strong>en</strong>ga libertad de movimi<strong>en</strong>to o dep<strong>en</strong>da de un objeto del grafo de<br />

esc<strong>en</strong>a, dep<strong>en</strong>derá del propósito a conseguir.<br />

37


objetos. Para que la luz afecte a todos los objetos <strong>en</strong> movimi<strong>en</strong>to, el alcance de dicha luz<br />

debería ser lo sufici<strong>en</strong>tem<strong>en</strong>te grande para que todos los objetos estuvieran d<strong>en</strong>tro de sus<br />

límites. El tamaño de la zona de influ<strong>en</strong>cia se puede definir a través de los métodos<br />

proporcionados por la clase Bounds y sus desc<strong>en</strong>di<strong>en</strong>tes.<br />

Además de la clase Bounds, existe una clase adicional que permite el control de<br />

límites. Esta clase es la clase BoundingLeaf. Esta clase exti<strong>en</strong>de la clase Leaf. La difer<strong>en</strong>cia<br />

con respecto a la clase Bounds, es que la clase BoundingLeaf se puede incorporar como un<br />

nodo hoja al grafo de esc<strong>en</strong>a funcionando de forma indep<strong>en</strong>di<strong>en</strong>te. El objeto (u objetos)<br />

sobre el que se vaya a definir una región de influ<strong>en</strong>cia podrá hacer refer<strong>en</strong>cia a dicho<br />

BoundingLeaf.<br />

Se volverá sobre el concepto de límite <strong>en</strong> el apartado Luces. Si se desea saber más<br />

sobre dicho conceptos y su uso, se recomi<strong>en</strong>da acudir al capítulo 6 de (J. Bouvier, 1999).<br />

13.3.3.2 Configuración del fondo<br />

Aunque el formato del fondo no es un elem<strong>en</strong>to que afecte a una figura <strong>en</strong> especial, es un<br />

elem<strong>en</strong>to que permite alterar el aspecto de toda la esc<strong>en</strong>a, por lo que se ha optado por<br />

discutirlo <strong>en</strong> este punto. Por defecto, el color de fondo predeterminado por defecto para este<br />

objeto es negro. <strong>Java</strong> <strong>3D</strong> proporciona los mecanismos necesarios para cambiar el color de<br />

fondo, o si el usuario lo prefiere, añadir imág<strong>en</strong>es como fondo e incluso formas geométricas<br />

o una combinación de los elem<strong>en</strong>tos anteriores. Incluso es posible definir difer<strong>en</strong>tes fondos<br />

para difer<strong>en</strong>tes secciones d<strong>en</strong>tro de un mismo universo virtual.<br />

La clase que se <strong>en</strong>carga de gestionar el fondo es la clase Background. Esta clase<br />

hereda de forma directa de la clase Leaf. Como consecu<strong>en</strong>cia, las instancias de la clase<br />

Background podrán añadirse directam<strong>en</strong>te como terminación de una rama del grafo de<br />

esc<strong>en</strong>a, como si de una figura <strong>3D</strong> habitual se tratara.<br />

Para crear un nuevo fondo, se deb<strong>en</strong> seguir los sigui<strong>en</strong>tes pasos g<strong>en</strong>erales:<br />

1. Se crea el objeto Background y se define el color de fondo o la imag<strong>en</strong> que va a<br />

constituirse como fondo.<br />

2. Se añade un elem<strong>en</strong>to geométrico si se desea que una figura geométrica forme parte<br />

del fondo. Este punto es opcional <strong>en</strong> el proceso de construcción de un fondo.<br />

3. Se proporcionan los límites del fondo.<br />

4. Se añade como hoja al grafo de esc<strong>en</strong>a.<br />

Para cambiar el color de fondo o incluir una imag<strong>en</strong>, la clase Background<br />

proporciona las funciones necesarias para tal cometido. Dichas clases toman como<br />

parámetro el color (<strong>en</strong> formato RGB) o un objeto que <strong>en</strong>capsula la imag<strong>en</strong><br />

(ImageCompon<strong>en</strong>t2D) y actualizan el fondo.<br />

En cambio, para el segundo punto, la cosa se complica, no por la forma de incluirlo<br />

<strong>en</strong> el fondo, ya que existe la correspondi<strong>en</strong>te función para ello, sino por la construcción <strong>en</strong><br />

38


sí de la figura geométrica. En el ejemplo easyCont<strong>en</strong>t/BackgroundApp.java se puede<br />

observar la inclusión de figuras geométricas como fondo de la esc<strong>en</strong>a. Se han utilizado<br />

objetos PointArray para simular estrellas y una clase LineArray para simular una<br />

constelación. Además, este ejemplo es un bu<strong>en</strong> punto de refer<strong>en</strong>cia para conocer más a<br />

fondo el uso de las clases BoundingSphere y k, esta última aplicada a aspectos de<br />

interacción con el usuario 8 .<br />

13.3.3.3 Apari<strong>en</strong>cia<br />

Analizada la forma de alterar el fondo de una esc<strong>en</strong>a <strong>3D</strong>, queda profundizar <strong>en</strong> cómo<br />

cambiar la apari<strong>en</strong>cia de cada uno del resto de los elem<strong>en</strong>tos que forman el universo virtual.<br />

Como ya se ha podido observar, la apari<strong>en</strong>cia no es un elem<strong>en</strong>to que condicione la<br />

creación de universos virtuales, y de hecho, se pres<strong>en</strong>ta como algo adicional. Todas las<br />

formas <strong>3D</strong> ti<strong>en</strong><strong>en</strong> definida por defecto una apari<strong>en</strong>cia.<br />

Por otro lado, se ha visto como, sin necesidad de definir un nodo Appearance<br />

explícito, se pued<strong>en</strong> definir efectos de color y textura a través de las clases específicas para<br />

definir geometría 9 . Sin embargo, para otros muchos casos es necesario un objeto explícito<br />

que realice el trabajo.<br />

La clase Appearance es desc<strong>en</strong>di<strong>en</strong>te de NodeCompon<strong>en</strong>t y por lo tanto deberá estar<br />

relacionada con un objeto Shape<strong>3D</strong> ya que, de forma directa, no se puede incluir <strong>en</strong> el grafo<br />

de esc<strong>en</strong>a.<br />

Un objeto del tipo Appearance no conti<strong>en</strong>e ningún tipo de información acerca de<br />

cómo se debe mostrar una figura, pero si conoce dónde buscar dicha información. Manti<strong>en</strong>e<br />

un conjunto de refer<strong>en</strong>cias a otras instancias de clases desc<strong>en</strong>di<strong>en</strong>tes de la clase<br />

NodeCompon<strong>en</strong>t, las cuales sí ti<strong>en</strong>e la información necesaria.<br />

Este último conjunto de clases se conoce como atributos de apari<strong>en</strong>cia e incluy<strong>en</strong><br />

las sigui<strong>en</strong>tes clases:<br />

PointAttributes. Atributos relativos a cómo se mostrarán los puntos.<br />

LineAttributes. Establece las características de visualización de una recta.<br />

PolygonAttributes. Define las características para los polígonos.<br />

8 La interacción con el usuario se aborda <strong>en</strong> el apartado <strong>Movimi<strong>en</strong>to</strong> <strong>en</strong> <strong>Java</strong> <strong>3D</strong>.<br />

9 Las clases desc<strong>en</strong>di<strong>en</strong>tes de la clase Geometry permitían definir un conjunto de puntos así<br />

como su significado semántico. D<strong>en</strong>tro del rango de significados semánticos soportados<br />

estaban los sigui<strong>en</strong>tes: COLOR_3, COLOR_4, TEXTURE_COORDINATE_2 y<br />

TEXTURE_COORDINATE_3.<br />

39


ColoringAttributes. Establece detalles relativos al color.<br />

Transpar<strong>en</strong>cyAttributes. Atributos relativos a efectos de transpar<strong>en</strong>cia.<br />

R<strong>en</strong>deringAtributes. Permite controlar dos aspectos relacionados <strong>en</strong> el proceso de<br />

visualización de un píxel: la gestión del buffer de dibujo y la función alfa. Por esta<br />

razón, permite definir aspectos de visualización aplicables a todos los tipos de<br />

primitivas.<br />

Material. Esta clase de atributos está relacionada con los efectos de luz que se<br />

describ<strong>en</strong> más adelante <strong>en</strong> este docum<strong>en</strong>to.<br />

TextureAttributes, Texture y TexCoordG<strong>en</strong>eration. Las tres clases están<br />

relacionadas con la gestión de texturas. Estas clases se analizan más adelante <strong>en</strong> el<br />

docum<strong>en</strong>to (apartado de texturas).<br />

La clase Appearance proporciona los métodos necesarios para incluir las refer<strong>en</strong>cias<br />

a cada una de las instancias de las clases vistas.<br />

A continuación se describ<strong>en</strong> cada una de las clases con más detalle. Para su<br />

explicación se agrupan <strong>en</strong> tres secciones. La primera agrupa las clases relativas a atributos<br />

de apari<strong>en</strong>cia g<strong>en</strong>erales, y las sigui<strong>en</strong>tes abordan el tema de las luces y las texturas.<br />

13.3.3.3.1 Atributos g<strong>en</strong>erales<br />

PointAttributes<br />

Esta clase define los atributos que establec<strong>en</strong> cómo se mostrarán cada uno de los puntos<br />

que formar la figura. Por defecto, cada punto se corresponde directam<strong>en</strong>te con un píxel.<br />

Aum<strong>en</strong>tar el tamaño del punto supone aum<strong>en</strong>tar el número de píxeles asociados a dicho<br />

punto. Este aum<strong>en</strong>to de tamaño, a través de métodos proporcionados por la propia clase,<br />

supone ac<strong>en</strong>tuar la forma cuadrada que pres<strong>en</strong>ta el punto. Para suavizar esta forma, la clase<br />

PointAttribute proporciona un método, setPointAntialiasingEnabled(), que permite cambiar<br />

el color de los píxeles de los extremos que forman el punto, dando s<strong>en</strong>sación de redondez.<br />

LineAttributes<br />

Esta clase define las características de visualización que pres<strong>en</strong>tarán las rectas.<br />

Concretam<strong>en</strong>te, afecta a la forma <strong>en</strong> la que se mostrarán las rectas <strong>en</strong> tres s<strong>en</strong>tidos:<br />

Permite definir el cuerpo de la línea, estableci<strong>en</strong>do si es sólido, intermit<strong>en</strong>te, a<br />

puntos o mixto. En una palabra, define como cada uno de los píxeles que forman la<br />

recta se deb<strong>en</strong> dibujar. Este aspecto de una recta se d<strong>en</strong>omina patrón de la recta.<br />

Otra característica que define es el ancho de la línea, es decir el ancho de cada píxel<br />

que forma la recta.<br />

40


El tercer aspecto que permite definir es el conocido como antiálias (antialiasing),<br />

permiti<strong>en</strong>do mostrar un aspecto más suave <strong>en</strong> el dibujo de la recta.<br />

PolygonAttributes<br />

En cuanto a la visualización de polígonos se pued<strong>en</strong> parametrizar los sigui<strong>en</strong>tes aspectos:<br />

Se puede definir la forma <strong>en</strong> la que se mostrará el polígono: rell<strong>en</strong>o, sin rell<strong>en</strong>o<br />

mostrando su superficie mediante líneas que se cortan (a modo de <strong>en</strong>tramado) o<br />

mostrando únicam<strong>en</strong>te su perfil. Si se muestra sigui<strong>en</strong>do los dos últimos formatos<br />

especificados, los atributos del polígono también se v<strong>en</strong> afectados por las clases<br />

PointAttributes y LineAttributes. El aspecto del polígono se d<strong>en</strong>omina el modo del<br />

polígono.<br />

Otro aspecto que permite configurar es si el polígono se muestra completo o no<br />

(culled). Se puede definir que caras del polígono se van a mostrar, si sólo las de la<br />

parte frontal o las de la parte posterior. Esto permite aum<strong>en</strong>tar el r<strong>en</strong>dimi<strong>en</strong>to al<br />

mostrarse únicam<strong>en</strong>te la mitad de las caras que forman un polígono.<br />

Un ejemplo de la utilización de esta clase para alterar la apari<strong>en</strong>cia de un objeto se<br />

puede ver <strong>en</strong> los ejemplos geometry/YoyoLineApp.java y geometry/YoyoPointApp.java.<br />

ColoringAttributes<br />

Permit<strong>en</strong> determinar y controlar cómo se colorea la figura correspondi<strong>en</strong>te. El color como<br />

<strong>en</strong> otras ocasiones se define sigui<strong>en</strong>do la notación RGB o mediante la clase Color3f.<br />

También, permite definir como se ext<strong>en</strong>derá el color definido al resto de la figura por<br />

ejemplo si se trata de un polígono o una recta.<br />

Como se vio <strong>en</strong> el apartado Construcción de elem<strong>en</strong>tos geométricos los colores<br />

también se pued<strong>en</strong> definir por cada vértice <strong>en</strong> las clases derivadas de Geometry sin más que<br />

definir que el vector de puntos especificado id<strong>en</strong>tifica color. En el caso que se haya<br />

especificado color, tanto a través de la clase Geometry como a través de los atributos de<br />

color, la definición realizada sobre aquella prevalece sobre la segunda forma de definir el<br />

color. Se volverá sobre el tema del color <strong>en</strong> el apartado Luces.<br />

Transpar<strong>en</strong>cyAttributes<br />

Permite controlar la opacidad de una figura. Define si una figura ti<strong>en</strong>e cierta transpar<strong>en</strong>cia<br />

así como el método elegido para g<strong>en</strong>erar dicho efecto de transpar<strong>en</strong>cia. Esta propiedad<br />

varía <strong>en</strong> una escala numérica desde 0.0, que indica que es un cuerpo opaco, y 1.0, que<br />

indica que el objeto es totalm<strong>en</strong>te transpar<strong>en</strong>te<br />

R<strong>en</strong>deringAttributes<br />

Esta clase define un conjunto de flags que permit<strong>en</strong> configurar las características relativas<br />

al tamaño del buffer de dibujo y a la función alfa <strong>en</strong>tre otros aspectos. Acudir a (Sun<br />

41


Microsystems, 1999) para una mayor descripción de cada uno de los flags y de los<br />

difer<strong>en</strong>tes métodos que permit<strong>en</strong> utilizar dichos flags.<br />

13.3.3.4 Luces<br />

La mayor parte del modelo de luces y sombras de <strong>Java</strong> <strong>3D</strong> está basado <strong>en</strong> Op<strong>en</strong>GL, por lo<br />

que se puede consultar más información <strong>en</strong> los temas 7 y 8 de esta asignatura.<br />

13.3.3.4.1 Modelos implicados<br />

Para incluir efectos de luz d<strong>en</strong>tro de un universo virtual, <strong>Java</strong> <strong>3D</strong> trabaja con tres modelos<br />

específicos: modelo de luz (Lighting Model), modelo de color (Color Model) y modelo de<br />

sombreado (Shade Model). A continuación se describ<strong>en</strong> de forma breve.<br />

Lighting Model<br />

<strong>Java</strong> <strong>3D</strong> utiliza este modelo para mostrar los objetos con una mayor realidad, ya que el<br />

color de los objetos se percibe como una combinación de las propiedades físicas del objeto,<br />

de las características de las fu<strong>en</strong>tes emisoras de luz, de la posición respecto a ellas y del<br />

ángulo desde el que se observa el objeto.<br />

La ecuación con la que se trabaja <strong>en</strong> este modelo se basa <strong>en</strong> tres vectores: vector<br />

normal a la superficie del vértice (N), vector dirigido a la fu<strong>en</strong>te de luz (L) y el vector<br />

dirigido al observador (E). En la figura inferior se muestra como cada vértice de la esfera<br />

pot<strong>en</strong>cialm<strong>en</strong>te se puede repres<strong>en</strong>tar con una sombra difer<strong>en</strong>te.<br />

Figura 13 - Luz (L), vector normal a la superficie (N) y vector dirigido al observador (E)<br />

Este modelo permite repres<strong>en</strong>tar <strong>en</strong> un universo virtual tres tipos de reflexiones de<br />

luz pres<strong>en</strong>tes <strong>en</strong> el mundo real. La reflexión ambi<strong>en</strong>tal que manti<strong>en</strong>e un bajo nivel de luz, la<br />

difusión que es la reflexión natural de la luz sobre un objeto y la reflexión especular que<br />

creo zonas con una mayor iluminación del objeto. En la figura que t<strong>en</strong>emos a continuación,<br />

se muestra lo expuesto anteriorm<strong>en</strong>te, de manera que la parte más oscura de la esfera<br />

exhibe sólo la reflexión ambi<strong>en</strong>te, el c<strong>en</strong>tro está iluminado por la luz difusa y ambi<strong>en</strong>te y la<br />

parte más brillante de la esfera es el resultado de la reflexión especular con reflexiones<br />

ambi<strong>en</strong>te y difusa.<br />

42


Figura 14 - Esfera sombreada<br />

Como se ha visto el tratami<strong>en</strong>to de la luz por parte de <strong>Java</strong> <strong>3D</strong> es bastante complejo<br />

y si cada punto del objeto conti<strong>en</strong>e un nivel de luz distinto una porción significativa del<br />

cálculo de repres<strong>en</strong>tación se utiliza para estos vértices sombreados. Esto se puede evitar si<br />

el vector L o el vector E son constantes.<br />

Para conseguir que el vector L sea constante se debe usar una fu<strong>en</strong>te<br />

DirectionalLight que proporciona una sola dirección al brillo de la luz. Esta clase<br />

proporciona tres constructores <strong>en</strong> los que se puede especificar el color, la dirección y el<br />

estado. Tal y omo se observa <strong>en</strong> la figura, al ser todos los vectores de luz de una fu<strong>en</strong>te<br />

DirectionalLight paralelos la luz no se at<strong>en</strong>úa, es decir, la int<strong>en</strong>sidad de la fu<strong>en</strong>te no varía<br />

con la distancia al objeto.<br />

Figura 15 - El vector de luz permanece constante para una fu<strong>en</strong>te de tipo DirectionalLight<br />

El vector E, también conocido como vector de ojo infinito, es constante por defecto,<br />

aunque podemos especificar un vector variable del ojo usando un método del objeto View.<br />

Si nos fijamos <strong>en</strong> la figura sigui<strong>en</strong>te se ve como <strong>en</strong> la v<strong>en</strong>tana de la izquierda que ti<strong>en</strong>e un<br />

vector E constante hace que las reflexiones especulares están básicam<strong>en</strong>te <strong>en</strong> la misma<br />

posición para cada esfera al contrario que <strong>en</strong> la v<strong>en</strong>tana de la derecha. El objeto View<br />

conti<strong>en</strong>e todos los parámetros necesarios para r<strong>en</strong>derizar una esc<strong>en</strong>a tridim<strong>en</strong>sional desde<br />

un punto de vista.<br />

43


Figura 16 - variación del vector dirigido al observador (E)<br />

El tiempo real para r<strong>en</strong>derizar además de variar con los vectores L y E varía con el<br />

sistema utilizado. La difer<strong>en</strong>cia es más pronunciada <strong>en</strong> los sistemas que r<strong>en</strong>derizan por<br />

software.<br />

Para concluir este apartado hay que decir que <strong>en</strong> este modelo los f<strong>en</strong>óm<strong>en</strong>os físicos<br />

complejos no se modelan, ya que <strong>en</strong> la figura anterior vemos como falta la sombra de la<br />

esfera, la luz de la esfera sobre el plano… porque para reducir la complejidad del cálculo, el<br />

modelo de iluminación considera solam<strong>en</strong>te un objeto visual al mismo tiempo.<br />

Color Model<br />

En la realidad el color es una combinación de muchas longitudes de onda de la luz pero <strong>en</strong><br />

el mundo virtual de <strong>Java</strong> <strong>3D</strong> un solo color de luz queda especificado por una combinación<br />

de rojo, verde y azul. Es el conocido modelo de color RGB que repres<strong>en</strong>ta muchos colores,<br />

pero no todos. El modelo de iluminación es un modelo físico, mi<strong>en</strong>tras que el modelo de<br />

color es una adaptación.<br />

Shade Model<br />

Es el <strong>en</strong>cargado de dar sombra y color a todos los vértices que se <strong>en</strong>cu<strong>en</strong>tran bajo un punto<br />

de luz. Exist<strong>en</strong> varios métodos para sombrear una figura, por un lado el sombreado<br />

Gouraud <strong>en</strong> el que cada píxel se sombrea con un valor derivado de la interpolación trilinear<br />

del valor de la sombra <strong>en</strong> cada vértice del polígono que lo <strong>en</strong>cierra y por otro, el sombreado<br />

plano <strong>en</strong> el que a todos los píxeles de un polígono se les asigna el valor de la sobra a partir<br />

de un vértice del polígono. El primero ti<strong>en</strong>e como v<strong>en</strong>taja la apari<strong>en</strong>cia visual y el segundo<br />

la velocidad <strong>en</strong> la repres<strong>en</strong>tación del software.<br />

44


Figura 17 - Métodos Flat y Gouraud empleados para sombrear una esfera<br />

Tanto este modelo como el modelo de luz están basados <strong>en</strong> Op<strong>en</strong>GL 10 .<br />

13.3.3.4.2 Fu<strong>en</strong>tes de luz<br />

El primer elem<strong>en</strong>to indisp<strong>en</strong>sable para incluir luz <strong>en</strong> una esc<strong>en</strong>a es una fu<strong>en</strong>te luminosa.<br />

Para ello, <strong>Java</strong> <strong>3D</strong> proporciona toda una estructura de clases <strong>en</strong>cargadas de tal cometido.<br />

Las clases definidas como elem<strong>en</strong>tos luminosos son desc<strong>en</strong>di<strong>en</strong>tes de la clase Leaf y por lo<br />

tanto se pued<strong>en</strong> incluir de forma directa <strong>en</strong> el grafo de esc<strong>en</strong>a. Estas clases son las que se<br />

defin<strong>en</strong> a continuación de forma breve.<br />

La clase principal es la clase Light. Es una clase abstracta que define los parámetros<br />

principales de la luz como son el estado (<strong>en</strong>c<strong>en</strong>dido o apagado), el color y los límites de<br />

influ<strong>en</strong>cia. Heredando de esta clase se <strong>en</strong>cu<strong>en</strong>tran clases más específicas que permit<strong>en</strong><br />

incluir ciertos tipos de luz concretos:<br />

Ambi<strong>en</strong>tLight. Los objetos de luz ambi<strong>en</strong>te proporcionan luz de la misma<br />

int<strong>en</strong>sidad <strong>en</strong> todas las direcciones y modelan la luz reflejada desde otros objetos<br />

visuales. Mi<strong>en</strong>tras que podría ser natural p<strong>en</strong>sar que una fu<strong>en</strong>te de luz ambi<strong>en</strong>te se<br />

puede aplicar globalm<strong>en</strong>te, esto no es necesariam<strong>en</strong>te cierto <strong>en</strong> un programa <strong>Java</strong><br />

<strong>3D</strong>. La influ<strong>en</strong>cia de la fu<strong>en</strong>te Ambi<strong>en</strong>tLight está controlada por sus límites igual<br />

que otras fu<strong>en</strong>tes de luz <strong>Java</strong> <strong>3D</strong>. Se pued<strong>en</strong> utilizar varios objetos fu<strong>en</strong>te<br />

Ambi<strong>en</strong>tLight <strong>en</strong> un programa de <strong>Java</strong> <strong>3D</strong>. No hay límite <strong>en</strong> el número de los<br />

objetos fu<strong>en</strong>tes Ambi<strong>en</strong>tLight que se pued<strong>en</strong> utilizar.<br />

DirectionalLight. Al contrario que las anteriores estas fu<strong>en</strong>tes proporcionan una<br />

sola dirección al brillo de luz. Para los objetos iluminados con esta fu<strong>en</strong>te el vector<br />

de luz es constante. Estas fu<strong>en</strong>tes solo participan <strong>en</strong> las porciones difusas y specular<br />

de la reflexión del modelo de iluminación.<br />

PointLight. Es lo contrario de una fu<strong>en</strong>te DirectionalLight. Define una fu<strong>en</strong>te de luz<br />

colocada <strong>en</strong> algún punto del espacio y que emite luz <strong>en</strong> todas direcciones. La<br />

int<strong>en</strong>sidad se at<strong>en</strong>úa con la distancia.<br />

10 Dado que se apoya sobre Op<strong>en</strong>GL se aconseja acudir a bibliografía sobre esta librería<br />

gráfica para ampliar conceptos sobre los distintos modelos implicados (Wright et al., 1997).<br />

45


SpotLight. Es una subclase de PointLight que agrega dirección y conc<strong>en</strong>tración a<br />

los parámetros de posición y at<strong>en</strong>uación. La int<strong>en</strong>sidad de la luz producida por una<br />

fu<strong>en</strong>te de este tipo produce la luz d<strong>en</strong>tro de un ángulo especificado desde la<br />

dirección de la luz. El ángulo de ext<strong>en</strong>sión de un objeto SpotLight podría hacer que<br />

la luz iluminara parte de un objeto visual, por lo que esta es la única luz capaz de<br />

iluminar solam<strong>en</strong>te una parte de un objeto.<br />

El número de luces y los atributos de éstas es más bi<strong>en</strong> una consideración artística<br />

que ci<strong>en</strong>tífica, pero a continuación se van a dar unas pautas g<strong>en</strong>erales. A m<strong>en</strong>udo es<br />

sufici<strong>en</strong>te t<strong>en</strong>er solo dos luces para una esc<strong>en</strong>a dada, una que proporcione la iluminación<br />

principal y la otra se utiliza para completar la cara más oscura de los objetos. La luz<br />

principal normalm<strong>en</strong>te se coloca a la derecha del espectador mi<strong>en</strong>tras que el rell<strong>en</strong>o a la<br />

izquierda. Normalm<strong>en</strong>te se prefiere incluir fu<strong>en</strong>tes de luz direccionales para la mayoría de<br />

las aplicaciones puesto que el cálculo requerido <strong>en</strong> la repres<strong>en</strong>tación es perceptiblem<strong>en</strong>te<br />

m<strong>en</strong>or que para los puntos de luz. Las fu<strong>en</strong>tes de puntos de luz se usan muy raram<strong>en</strong>te<br />

debido a la alta complejidad de cálculo.<br />

La influ<strong>en</strong>cia de una luz va a determinar que objetos se v<strong>en</strong> afectados por dicha luz<br />

y cuales no. Exist<strong>en</strong> dos formas de realizarlo. La primera es mediante objetos Bound<br />

(BoundingSphere, BoundingBox...) o BoundingLeaf. La segunda forma es mediante el<br />

alcance de la fu<strong>en</strong>te de luz. Este segundo mecanismo simplifica bastante el tema de control<br />

de influ<strong>en</strong>cia de un emisor de luz. El alcance se define a través de un nodo Group que<br />

establece la lista de objetos que están bajo la influ<strong>en</strong>cia de la luz. Para ampliar más se<br />

aconseja acudir al capítulo 6 de (J. Bouvier, 1999).<br />

13.3.3.4.3 Clase Material<br />

La inclusión de una fu<strong>en</strong>te de luz no significa que los objetos vayan a pres<strong>en</strong>tar una<br />

apari<strong>en</strong>cia modificada por dicha fu<strong>en</strong>te de luz. Para que esto suceda es necesario definir un<br />

objeto Material y <strong>en</strong>lazarlo con el objeto Appearance del elem<strong>en</strong>to <strong>3D</strong>. El objeto Material<br />

es del tipo NodeCompon<strong>en</strong>t.<br />

Este objeto va a permitir definir el color ambi<strong>en</strong>te, el color de difusión, el color<br />

especular, así como el color de emisión y el brillo. Los tres primeros colores son los<br />

utilizados por el modelo de luz (Lighting Model) para g<strong>en</strong>erar los efectos de reflexión<br />

anteriorm<strong>en</strong>te citados.<br />

Cuando para un objeto se define un atributo del tipo Material, este objeto se ve<br />

influ<strong>en</strong>ciado por la luz (o luces), siempre y cuando <strong>en</strong>tre d<strong>en</strong>tro de los límites de influ<strong>en</strong>cia<br />

de la fu<strong>en</strong>te luminosa.<br />

El lector habrá comprobado que con el objeto Material ya exist<strong>en</strong> tres formas de<br />

definir color para un objeto (las otras dos son mediante el objeto Geometry defini<strong>en</strong>do<br />

coord<strong>en</strong>adas de color o mediante el objeto ColoringAttributes). Qui<strong>en</strong> finalm<strong>en</strong>te defina el<br />

color dep<strong>en</strong>de de un conjunto de reglas de g<strong>en</strong>eración de color preestablecidas. Las<br />

sigui<strong>en</strong>te tablas muestran el resultado de dichas reglas.<br />

46


Geometry ColoringAttributes Resultado<br />

NO NO Material<br />

SI NO Geometry<br />

NO SI Material<br />

SI SI Geometry<br />

Tabla 2 - Reglas de g<strong>en</strong>eración de color <strong>en</strong> pres<strong>en</strong>cia de un objeto Material<br />

La Tabla 13. 2 muestra desde donde se tomará el color cuando un objeto de tipo Material se<br />

incluya d<strong>en</strong>tro del objeto Appearance del elem<strong>en</strong>to visual (es decir cuando esté influido por<br />

la luz). Se puede comprobar como prevalece el color definido por el objeto Geometry, y <strong>en</strong><br />

su aus<strong>en</strong>cia el color definir por el objeto Material.<br />

En aus<strong>en</strong>cia de un objeto Material (el objeto no se verá afectado por la luz) el color se toma<br />

sigui<strong>en</strong>do las sigui<strong>en</strong>tes reglas:<br />

Geometry ColoringAttributes Resultado<br />

NO NO En blanco<br />

SI NO Geometry<br />

NO SI Coloring Attributes<br />

SI SI Geometry<br />

Tabla 3 - Reglas de g<strong>en</strong>eración de color <strong>en</strong> aus<strong>en</strong>cia de un objeto Material<br />

13.3.3.4.4 Influ<strong>en</strong>cia de las fu<strong>en</strong>tes de luz<br />

Un aspecto com<strong>en</strong>tado hasta ahora es el término de límites de influ<strong>en</strong>cia. Este concepto ya<br />

se introdujo al principio de este apartado.<br />

La influ<strong>en</strong>cia de una luz va a determinar que objetos se v<strong>en</strong> afectados por dicha luz y cuales<br />

no. Exist<strong>en</strong> dos formas de realizarlo. La primera es mediante objetos Bound o<br />

BoundingLeaf. La segunda forma es mediante el alcance o scope de la fu<strong>en</strong>te de luz. Este<br />

segundo mecanismo simplifica bastante el tema de control de influ<strong>en</strong>cia de un emisor de<br />

luz. El alcance se define a través de un nodo Group que establece la lista de objetos que<br />

están bajo la influ<strong>en</strong>cia de la luz. Para ampliar más se aconseja acudir al capítulo 6 de (J.<br />

Bouvier, 1999). En el ejemplo light/LightScopeApp.java se implem<strong>en</strong>ta el concepto de<br />

alcance de una fu<strong>en</strong>te de luz.<br />

13.3.3.5 Texturas<br />

La utilización de texturas es uno de los mecanismos más importantes que permit<strong>en</strong> dar<br />

realismo a una esc<strong>en</strong>a <strong>3D</strong>. En mucho casos, es la única forma de que un objeto <strong>3D</strong> muestre<br />

un aspecto real. Algunos objetos que no se repres<strong>en</strong>tan bi<strong>en</strong> con polígonos planos no<br />

texturados son la madera, los ladrillos, el cem<strong>en</strong>to, una alfombra…<br />

Por lo tanto se necesita una técnica como el texturado, también llamado mapeo de<br />

textura, que añada riqueza visual a una superficie sin la adición de detalles geométricos<br />

47


finos. La riqueza visual la proporciona una imag<strong>en</strong>, también llamada textura, que da el<br />

aspecto del detalle superficial para el objeto visual. La imag<strong>en</strong> se mapeada d<strong>en</strong>tro de la<br />

geometría del objeto visual <strong>en</strong> el mom<strong>en</strong>to de la r<strong>en</strong>derización. De ahí el término mapeo de<br />

textura.<br />

Al igual que sucedía con las luces la inclusión de texturas es un proceso que<br />

requiere el uso de un gran número de clases, de las cuales más adelante se explicarán las<br />

más importantes.<br />

Pasos a seguir para proporcionar texturado a nuestro objeto:<br />

Preparar las imág<strong>en</strong>es de texturas: este paso se realiza externam<strong>en</strong>te a los<br />

programas de <strong>Java</strong> <strong>3D</strong> y lo que se pret<strong>en</strong>de conseguir es que la imag<strong>en</strong> que dará la<br />

textura a nuestro objeto t<strong>en</strong>ga unas dim<strong>en</strong>siones aceptables y que el formato del<br />

fichero que la almac<strong>en</strong>a pueda ser leído por <strong>Java</strong> <strong>3D</strong>.<br />

Una restricción que impone <strong>Java</strong> <strong>3D</strong> es que las imág<strong>en</strong>es ti<strong>en</strong><strong>en</strong> que t<strong>en</strong>er un tamaño<br />

pot<strong>en</strong>cia matemática de dos <strong>en</strong> todas las dim<strong>en</strong>siones porque sino dará una<br />

excepción <strong>en</strong> tiempo de ejecución.<br />

Los formatos estándares que carga son JPEG y GIF, aunque la clase TextureLoader<br />

también carga otras texturas.<br />

Cargar la textura: consiste <strong>en</strong> conseguir la imag<strong>en</strong> preparada <strong>en</strong> un objeto imag<strong>en</strong>.<br />

Se puede hacer a través de un fichero o de una URL usando un mismo proceso que<br />

puede implicar un gran número de líneas de código o por el contrario unas pocas si<br />

se usa el objeto TexturaLoader. Si nos fijamos <strong>en</strong> el sigui<strong>en</strong>te código podemos ver<br />

como se usa el objeto TextureLoader para cargar el fichero imag<strong>en</strong>.gif.<br />

TextureLoader loader = new TextureLoader("imag<strong>en</strong>.gif", this);<br />

ImageCompon<strong>en</strong>t2D image = loader.getImage();<br />

Las imág<strong>en</strong>es se cargan de forma asíncrona lo que es muy útil cuando la carga se<br />

realiza a través de una URL. Para facilitar el manejo de cargas asíncronas de<br />

imág<strong>en</strong>es, los compon<strong>en</strong>tes de AWT están capacitados para ser observadores de<br />

imag<strong>en</strong>, que es observar el proceso de la carga de la imag<strong>en</strong>. A un observador de<br />

imag<strong>en</strong> se le puede preguntar por los detalles de la carga de la imag<strong>en</strong>.<br />

Con el fin escribir programas <strong>Java</strong> <strong>3D</strong> todo lo que necesitamos saber es que<br />

cualquier compon<strong>en</strong>te del AWT puede servir como un observador de imag<strong>en</strong>.<br />

Puesto que applet es una ext<strong>en</strong>sión del compon<strong>en</strong>te Panel del AWT, el objeto applet<br />

de un programa de <strong>Java</strong> <strong>3D</strong> puede ser el observador de imag<strong>en</strong> para el objeto<br />

TextureLoader.<br />

Crear el manojo de Appearance: una vez que se ti<strong>en</strong>e cargada la imag<strong>en</strong> parar<br />

poderla utilizar como una textura <strong>en</strong> un objeto visual se debe asignar como la<br />

48


textura de un objeto Texture. Las sigui<strong>en</strong>tes líneas de código se situarán a<br />

inmediatam<strong>en</strong>te después que las del paso anterior:<br />

Texture2D texture = new Texture2D();<br />

texture.setImage(0, image);<br />

Appearance appear = new Appearance();<br />

appear.setTexture(texture);<br />

La imag<strong>en</strong> <strong>en</strong>tonces se asigna al objeto Texture2D y luego el objeto Texture2D se<br />

agrega al objeto Appearance. En este ejemplo no se ha utilizado pero llegados a este<br />

punto se suele hacer uso del objeto TextureAttributes que por su gran importancia se<br />

explicará más adelante.<br />

Especificar las coord<strong>en</strong>adas: para finalizar hace falta la colocación de la textura <strong>en</strong><br />

la geometría a través de la especificación de las coord<strong>en</strong>adas de textura. Las<br />

especificaciones se hac<strong>en</strong> por cada vértice de geometría. Cada píxel de una textura<br />

se llama un texel. Con la especificación de algunos puntos de la imag<strong>en</strong> que se<br />

aplicarán a los vértices de la geometría, la imag<strong>en</strong> será rotada, estirada, aplastada,<br />

y/o duplicada para hacer que quepa <strong>en</strong> la especificación. Para esto se hace uno del<br />

objeto GeometryArray.<br />

Una vez completados estos s<strong>en</strong>cillos pasos ya se puede añadir el objeto a un<br />

esc<strong>en</strong>ario gráfico.<br />

13.3.3.5.1 Clases es<strong>en</strong>ciales de texturado<br />

En primer lugar, están los cargadores de texturas. Las clases TextureLoader y<br />

NewTextureLoader permit<strong>en</strong> cargar, a partir de un fichero gráfico externo, una textura para<br />

utilizarla d<strong>en</strong>tro de una esc<strong>en</strong>a. Ambas clases proporcionan un objeto ImageCompon<strong>en</strong>t2D<br />

que funciona como un cont<strong>en</strong>edor de la imag<strong>en</strong>. Esta imag<strong>en</strong> aún no puede ser utilizada tal<br />

y como vimos <strong>en</strong> el apartado anterior.<br />

Una segunda clase que intervi<strong>en</strong>e <strong>en</strong> este proceso es la clase GeometryArray que<br />

podía especificar que las coord<strong>en</strong>adas se referían a aspectos relativos a la textura que se iba<br />

a aplicar al objeto visual (mediante los métodos adecuados de la clase GeometryArray o a<br />

través de los flags TEXTURE_COORDINATE_2 y TEXTURE_COORDINATE_3).<br />

Otro grupo de clases son las derivadas de la clase NodeCompon<strong>en</strong>t. Entre estas<br />

clases están:<br />

La clase Texture y sus derivadas Texture2D y Texture<strong>3D</strong>. Estas clases van a<br />

permitir tanto importar la imag<strong>en</strong> del compon<strong>en</strong>te ImageCompon<strong>en</strong>t2D como<br />

configurar ciertos aspectos de cómo se aplicará la textura. Un objeto del tipo<br />

Texture se incorpora a la esc<strong>en</strong>a <strong>en</strong>lazándolo con el objeto Appearance relacionado<br />

con el objeto Shape<strong>3D</strong> al que se desea aplicar la textura.<br />

49


La clase TextureAttributes, que permite configurar ciertos aspectos que condicionan<br />

la forma <strong>en</strong> la cual se aplicará la textura. Junto con la clase Texture permite<br />

configurar las características más importantes.<br />

La clase TextCoordG<strong>en</strong>eration que proporciona al programador una forma más<br />

s<strong>en</strong>cilla de g<strong>en</strong>erar las coord<strong>en</strong>adas de la textura, que de otra forma se debería<br />

incluir “a mano” a través del objeto GeometryArray.<br />

Exist<strong>en</strong> más clases que ayudan a la gestión de texturas pero no son objeto de<br />

explicación <strong>en</strong> este docum<strong>en</strong>to. A continuación, se describirán con un poco más de detalle<br />

las clases Texture y TextureAttributes. Para completar estas clases y para saber más sobre el<br />

resto de clases acudir a (J. Bouvier, 1999) y (Sun Microsystems, 1999).<br />

Clase Texture<br />

Sobre esta clase destacar, principalm<strong>en</strong>te, el hecho de que es la que permite incluir la<br />

textura <strong>en</strong> sí.<br />

La clase Texture2D permite incluir texturas <strong>en</strong> dos dim<strong>en</strong>siones y la clase<br />

Texture<strong>3D</strong>, como su propio nombre indica, texturas <strong>en</strong> tres dim<strong>en</strong>siones.<br />

Un aspecto que permite definir la clase Texture es el conocido como Boundary<br />

Mode. Es decir, la forma <strong>en</strong> la cual la textura se aplicará sobre la superficie <strong>en</strong> caso de que<br />

el tamaño de dicha textura no cubra toda la superficie. Para realizar este proceso, exist<strong>en</strong><br />

dos opciones. La primera es la conocida como distribución <strong>en</strong> mosaico o wrap que se basa<br />

<strong>en</strong> utilizar la textura varias veces para cubrir toda la superficie. La segunda utiliza un color,<br />

que también se puede definir, para rell<strong>en</strong>ar los huecos. Si este no se especifica se utiliza el<br />

color del límite de la textura para rell<strong>en</strong>ar el espacio. Esta técnica recibe el nombre de<br />

clamp.<br />

Clase TextureAttributes<br />

Esta clase deriva de la clase NodeCompon<strong>en</strong>t y sirve de medio para definir características<br />

de cómo se aplicará la textura. Puede convivir con el objeto Texture d<strong>en</strong>tro del mismo<br />

objeto Appearance.<br />

Entre los aspectos que permite definir dicha clase están:<br />

El modelo <strong>en</strong> el que la textura influirá <strong>en</strong> el aspecto final del píxel. Como ya se ha<br />

visto <strong>en</strong> el apartado de luces, el aspecto externo de un píxel dep<strong>en</strong>de de los<br />

atributos de color de distintos objeto y de la influ<strong>en</strong>cia de las luces. Este color es el<br />

que primero se calcula y luego se completa con el definido por la textura. Exist<strong>en</strong><br />

cuatro formas de definir cómo se combinan textura y color:<br />

o BLEND: el color de la textura se mezcla con el color del material<br />

arbitrariam<strong>en</strong>te con un color de mezcla. La transpar<strong>en</strong>cia que resulta es la<br />

combinación de la transpar<strong>en</strong>cia de la textura y del material.<br />

50


o DECAL: el color de la textura se aplica como etiqueta <strong>en</strong>cima del color de la<br />

no-textura. La transpar<strong>en</strong>cia de la textura determina la cantidad de color material<br />

a utilizar. La transpar<strong>en</strong>cia del píxel se deja sin cambios. Esto es totalm<strong>en</strong>te<br />

igual que aplicar una etiqueta a un objeto del mundo real.<br />

o MODULATE: el color de la textura se combina con el color de la no-textura. La<br />

transpar<strong>en</strong>cia que resulta es la combinación de la transpar<strong>en</strong>cia de la textura y<br />

del material. Puesto que el color que resulta dep<strong>en</strong>de de la no-textura y de los<br />

colores de la textura, este modo es útil <strong>en</strong> la aplicación de la misma textura a<br />

una gran variedad de objetos visuales sin hacer que todos parezcan iguales. Este<br />

modo se utiliza a m<strong>en</strong>udo <strong>en</strong> esc<strong>en</strong>as de iluminación.<br />

o REPLACE: la textura proporciona el color y la transpar<strong>en</strong>cia para el píxel, no<br />

haci<strong>en</strong>do caso del resto de los colores excepto del color specular (si se permite<br />

la iluminación). Éste es el modo de textura por defecto incluso cuando no hay<br />

compon<strong>en</strong>te TextureAttributes <strong>en</strong> el manojo de apari<strong>en</strong>cia.<br />

Figura 18 - Combinación de textura y color<br />

<strong>Java</strong> <strong>3D</strong> por defecto siempre realizar una corrección de la textura <strong>en</strong> función del<br />

punto de vista desde el que se observe el objeto. De esta forma se asegura que la textura<br />

siempre se muestre de forma correcta. A través de la clase TextureAttributes se puede<br />

definir el grado de corrección que se pret<strong>en</strong>de conseguir mediante dos valores: FASTEST y<br />

NICEST, que obviam<strong>en</strong>te premian la velocidad y la calidad de la corrección,<br />

respectivam<strong>en</strong>te.<br />

51


<strong>13.3.4</strong> <strong>Movimi<strong>en</strong>to</strong> <strong>en</strong> <strong>Java</strong> <strong>3D</strong><br />

En el apartado Formas geométricas se ha c<strong>en</strong>trado la at<strong>en</strong>ción <strong>en</strong> la creación de cont<strong>en</strong>idos<br />

dejando a un lado aspectos de transformación de la esc<strong>en</strong>a como rotaciones, translaciones...<br />

Este tipo de aspectos se abordan <strong>en</strong> esta sección.<br />

En primer lugar, se describ<strong>en</strong> ciertos conceptos es<strong>en</strong>ciales para la compr<strong>en</strong>sión de la<br />

forma <strong>en</strong> la que <strong>Java</strong> <strong>3D</strong> aborda el tema del movimi<strong>en</strong>to d<strong>en</strong>tro de un universo virtual. A<br />

continuación, se introduc<strong>en</strong> los mecanismos más avanzados pres<strong>en</strong>tes <strong>en</strong> el API para<br />

realizar animaciones así como para controlar la interacción con el usuario.<br />

<strong>13.3.4</strong>.1 Conceptos básicos<br />

En este punto, se describ<strong>en</strong> los fundam<strong>en</strong>tos básicos que proporciona el API de <strong>Java</strong> <strong>3D</strong><br />

para transformar la situación inicial de las figuras <strong>en</strong> una esc<strong>en</strong>a.<br />

<strong>13.3.4</strong>.1.1 Traslaciones y rotaciones <strong>en</strong> <strong>Java</strong> <strong>3D</strong><br />

Con anterioridad se introdujeron las clases TransformGroup y Transform<strong>3D</strong>. Estas dos<br />

clases son el germ<strong>en</strong> para realizar modificaciones sobre la posición y ori<strong>en</strong>tación por<br />

defecto de una figura <strong>3D</strong>.<br />

La clase Transform<strong>3D</strong> proporciona métodos que permit<strong>en</strong> realizar translaciones de<br />

una figura desde un punto del espacio a otro, rotaciones respecto a un eje determinado y<br />

con un ángulo dado... En una palabra, va a <strong>en</strong>capsular toda la lógica de procesami<strong>en</strong>to de<br />

matrices implicada <strong>en</strong> el proceso de transformación gráfica. Un objeto Transform<strong>3D</strong> realiza<br />

una sola operación de transformación básica. Como consecu<strong>en</strong>cia de esa transformación, la<br />

figura afectada d<strong>en</strong>tro del grafo de esc<strong>en</strong>a mostrará una nueva posición o una nueva<br />

ori<strong>en</strong>tación o ambas cosas. Si se desea aplicar nuevas transformaciones a partir de dicha<br />

situación, no es necesario más que crear otro objeto del tipo Transform<strong>3D</strong>, determinar la<br />

transformación a realizar y combinar las dos instancias de los objetos Transform<strong>3D</strong>. Como<br />

consecu<strong>en</strong>cia de esta combinación, las matrices de transformación que <strong>en</strong>capsulan las<br />

instancias de los objetos Transform<strong>3D</strong> implicados se multiplican dando como resultado la<br />

transformación final.<br />

Una vez creada la transformación, ésta se incluye <strong>en</strong> el grafo de esc<strong>en</strong>a añadi<strong>en</strong>do la<br />

instancia de la clase Transform<strong>3D</strong> que conti<strong>en</strong>e el resultado de la multiplicación de todas<br />

las matrices a una instancia de la clase TransformGroup.<br />

Para que la transformación t<strong>en</strong>ga efecto, la figura <strong>3D</strong> objeto de la transformación se<br />

debe añadir como hija de la instancia de la clase TransformGroup para la que se ha definido<br />

la transformación.<br />

52


<strong>13.3.4</strong>.1.2 Concepto de capacidad<br />

El proceso descrito <strong>en</strong> el punto anterior, se realiza de forma previa a la compilación 11 de la<br />

rama g<strong>en</strong>erada y la visualización de la esc<strong>en</strong>a. Es decir, se hace <strong>en</strong> tiempo de diseño del<br />

universo. Sin embargo, una vez creada la esc<strong>en</strong>a, ésta es totalm<strong>en</strong>te estática.<br />

Para evitar que tras la compilación de una rama, los valores definidos para cada<br />

figura qued<strong>en</strong> inmutables, se define el concepto de bit de capacidad (capability bit). A<br />

través de estos bits no sólo se puede establecer que una figura pueda ser objeto de<br />

transformaciones una vez incluida <strong>en</strong> el grafo de esc<strong>en</strong>a, sino que además decidir que sólo<br />

sea susceptible de ciertos tipos de transformaciones. Además, al definirse el concepto de<br />

capacidad a nivel de la clase Sc<strong>en</strong>eGraphObject, cada elem<strong>en</strong>to <strong>3D</strong> t<strong>en</strong>drá sus propias<br />

capacidades.<br />

Por supuesto, la activación de los bits de capacidad de un elem<strong>en</strong>to del grafo de<br />

esc<strong>en</strong>a, se debe realizar de forma previa a la compilación y ejecución de la rama del árbol<br />

implicada. La clase Sc<strong>en</strong>eGraphObject proporciona métodos adecuados que permit<strong>en</strong><br />

activar y desactivar estos bits.<br />

Las difer<strong>en</strong>tes clases que compon<strong>en</strong> <strong>Java</strong> <strong>3D</strong> se caracterizan por un conjunto de bits<br />

de capacidad difer<strong>en</strong>tes. Para conocer dichos flags acudir a (Sun Microsystems,1999).<br />

<strong>13.3.4</strong>.1.3 Comportami<strong>en</strong>tos<br />

El comportami<strong>en</strong>to se articula <strong>en</strong> torno a una clase d<strong>en</strong>ominada Behavior. Esta clase se<br />

<strong>en</strong>carga de modificar los objetos de la esc<strong>en</strong>a <strong>3D</strong> ante distintos estímulos, y <strong>en</strong> particular<br />

estímulos proced<strong>en</strong>tes de la interacción del usuario. Las modificaciones que se pued<strong>en</strong><br />

realizar a través de la clase Behavior y sus desc<strong>en</strong>di<strong>en</strong>tes está únicam<strong>en</strong>te limitada por las<br />

capacidades de cada uno de los objetos del grafo de esc<strong>en</strong>a.<br />

El objetivo final de una instancia de la clase Behavior es la modificación de un<br />

determinado objeto. Este objeto se conoce como objeto de cambio. Por supuesto, la<br />

instancia <strong>en</strong>cargada de la gestión del comportami<strong>en</strong>to debe t<strong>en</strong>er una refer<strong>en</strong>cia al objeto<br />

susceptible de ser cambiado. Esta refer<strong>en</strong>cia se debe incluir <strong>en</strong> el mom<strong>en</strong>to de construcción<br />

del grafo de esc<strong>en</strong>a. De hecho, es uno de los parámetros del constructor.<br />

Funcionami<strong>en</strong>to<br />

El comportami<strong>en</strong>to posee un método específico que lo inicializa: initialization(). Este<br />

método es responsable de cargar el disparador (trigger) <strong>en</strong>cargado de responder al ev<strong>en</strong>to y<br />

11 El concepto de compilación se introdujo <strong>en</strong> el apartado Modos de r<strong>en</strong>derización<br />

53


la condición para que dicho ev<strong>en</strong>to se dispare 12 . El disparador es un objeto de la clase<br />

WakeupCondition o una combinación de objetos de dicha clase.<br />

Una vez que el comportami<strong>en</strong>to está activado y dispuesto para recibir ev<strong>en</strong>tos,<br />

dicho comportami<strong>en</strong>to será capaz de capturar el ev<strong>en</strong>to producido mediante el método<br />

processStimulus().<br />

Este método es el lugar apropiado para incluir aquellas acciones a ejecutar cuando<br />

se recibe el ev<strong>en</strong>to. Otra tarea que debe realizar este método es la reactivación del ev<strong>en</strong>to.<br />

Es decir, debe volver a habilitar el disparador cuando se haya terminado de procesar el<br />

ev<strong>en</strong>to, para así poder recibir nuevos ev<strong>en</strong>tos. Si esto no se realiza, el comportami<strong>en</strong>to sólo<br />

respondería al ev<strong>en</strong>to que se quiere controlar una sola vez.<br />

Uso de comportami<strong>en</strong>tos<br />

Conocido el funcionami<strong>en</strong>to de un elem<strong>en</strong>to de comportami<strong>en</strong>to, el sigui<strong>en</strong>te paso es<br />

analizar cómo se utiliza.<br />

El primer paso es configurar de forma adecuada el elem<strong>en</strong>to (o elem<strong>en</strong>tos) que va a<br />

ser objeto de modificación por parte del comportami<strong>en</strong>to. Además de la creación de este<br />

elem<strong>en</strong>to, será necesario establecer las capacidades adecuadas que permitan actuar sobre él<br />

una vez que el grafo de esc<strong>en</strong>a esté construido.<br />

El sigui<strong>en</strong>te paso es crear una instancia del comportami<strong>en</strong>to que se desea exhibir<br />

prestando at<strong>en</strong>ción <strong>en</strong> el hecho de que el comportami<strong>en</strong>to debe t<strong>en</strong>er la refer<strong>en</strong>cia al objeto<br />

que desea modificar.<br />

El tercer paso es determinar el alcance de acción del comportami<strong>en</strong>to. Se utilizará<br />

un objeto BoundingSphere, BoundingBox o BoundingPolytope para determinar dichos<br />

límites. Para <strong>Java</strong> <strong>3D</strong>, un comportami<strong>en</strong>to sólo está activo si sus límites intersecan con el<br />

volum<strong>en</strong> de activación determinado para el objeto ViewPlatform 13 , y sólo sí el<br />

comportami<strong>en</strong>to está activo puede recibir ev<strong>en</strong>tos. Por lo tanto, hay que prestar at<strong>en</strong>ción a<br />

la hora de determinar los límites de un comportami<strong>en</strong>to para asegurar que reciba los<br />

ev<strong>en</strong>tos cuando se desea.<br />

El último paso, sería añadir el objeto que controla el comportami<strong>en</strong>to a la rama del<br />

grafo. En la sigui<strong>en</strong>te figura se puede ver el resultado final de las conexiones <strong>en</strong>tre los<br />

distintos elem<strong>en</strong>tos com<strong>en</strong>tados de dos formas difer<strong>en</strong>tes.<br />

12 Es común que se desea controlar sólo el ev<strong>en</strong>to de clic del ratón ignorando el ev<strong>en</strong>to de movimi<strong>en</strong>to del<br />

ratón. Sin embargo, ambos son ev<strong>en</strong>tos de ratón. La condición del ev<strong>en</strong>to permite la difer<strong>en</strong>ciación de ev<strong>en</strong>tos<br />

relacionados semánticam<strong>en</strong>te.<br />

13 Esta clase se describe <strong>en</strong> la sección ViewPlatform: Un lugar <strong>en</strong> el mundo virtual.<br />

54


Figura 19 - Grafo de esc<strong>en</strong>a que incorpora un comportami<strong>en</strong>to<br />

En estos grafos, el elem<strong>en</strong>to B (Behavior) es el comportami<strong>en</strong>to y el elem<strong>en</strong>to TG<br />

(TransformGroup) es el objeto susceptible de ser transformado. Si la transformación fuese<br />

realizar una rotación, el resultado sería que toda la rama por debajo de TG se vería rotada,<br />

<strong>en</strong> este caso el cubo de color.<br />

La difer<strong>en</strong>cia <strong>en</strong>tre las dos formas de conexión está <strong>en</strong> que, <strong>en</strong> el primer caso, el<br />

objeto que se rota se desplaza pero el comportami<strong>en</strong>to no se desplaza con él. En el segundo<br />

caso, como el comportami<strong>en</strong>to dep<strong>en</strong>de del objeto transformado, también se verá afectado<br />

por la rotación y se desplazará con el objeto.<br />

A primera vista, los dos <strong>en</strong>foques son idénticos, pero no es así. Antes se ha<br />

com<strong>en</strong>tado que, para que un objeto comportami<strong>en</strong>to esté activo es necesario que sus límites<br />

intersect<strong>en</strong> con el volum<strong>en</strong> de la vista (objeto ViewPlatform). Imagínese que el objeto<br />

ViewPlatform se cambia, de tal forma que el comportami<strong>en</strong>to no interseca con el volum<strong>en</strong><br />

de la vista, pero el cubo sigue visible. El comportami<strong>en</strong>to no está activo y el usuario que sí<br />

puede ver el cubo no puede interactuar con él. En el segundo caso, esto nunca sucedería, ya<br />

que mi<strong>en</strong>tras la figura esté visible, el comportami<strong>en</strong>to estará activo. Sin embargo, bajo el<br />

<strong>en</strong>foque de la derecha, el cubo nunca podrá abandonar la vista <strong>en</strong> su proceso de rotación,<br />

mi<strong>en</strong>tras que con el <strong>en</strong>foque de la derecha la figura seguiría si<strong>en</strong>do rotada aunque estuviera<br />

fuera de la vista del usuario ya que el comportami<strong>en</strong>to sí estaría d<strong>en</strong>tro del volum<strong>en</strong> de la<br />

vista.<br />

Condiciones de inicio<br />

Como ya se ha com<strong>en</strong>tado antes, es necesario configurar un comportami<strong>en</strong>to para que<br />

responda a un determinado ev<strong>en</strong>to. Para ello se utilizan las condiciones de inicio<br />

implem<strong>en</strong>tadas a través de la clase WakeupCondition y derivadas. Se pued<strong>en</strong> establecer dos<br />

grupos. El primero lo forman la clase WakeupCriterion y sus derivadas. El segundo, el<br />

resto de clases derivadas de WakeupCondition.<br />

55


Esta distinción se realiza porque el primer grupo sirve como mecanismo para agrupar<br />

condiciones de arranque del segundo grupo. Las verdaderas condiciones de inicio son las<br />

del segundo grupo.<br />

No se va a <strong>en</strong>trar a detallar cada uno de los criterios de inicio exist<strong>en</strong>tes. Para conocer<br />

detalles sobre ellos acudir a (J. Bouvier, 1999) y a (Sun Microsystems, 1999).<br />

<strong>13.3.4</strong>.2 Interacción con el usuario<br />

Una vez conocidos los primeros pasos para incorporar transformaciones <strong>en</strong> una esc<strong>en</strong>a <strong>3D</strong>,<br />

se va a analizar cómo realizar dichas transformaciones ante ev<strong>en</strong>tos g<strong>en</strong>erados por la<br />

interacción del usuario con el universo creado.<br />

De todas las clases que desci<strong>en</strong>d<strong>en</strong> de la clase Behavior, las implicadas <strong>en</strong> la<br />

interacción con el usuario son las que se muestran a continuación.<br />

Figura 20 - Clases de comportami<strong>en</strong>to implicadas <strong>en</strong> la interacción con el usuario<br />

56


<strong>13.3.4</strong>.2.1 Interacción a través del teclado<br />

El primer elem<strong>en</strong>to disponible para que el usuario interaccione con un programa es el<br />

teclado. Mediante el control de teclas, el usuario va a poder modificar la esc<strong>en</strong>a.<br />

En este capítulo, se muestra como se puede utilizar los comportami<strong>en</strong>tos vistos con<br />

anterioridad para gestionar este tipo de interacción con el usuario.<br />

El control del teclado <strong>en</strong> <strong>Java</strong> <strong>3D</strong> se realiza a través de las clases<br />

KeyNavigatorBehavior y KeyNavigator. La primera clase es la que realm<strong>en</strong>te utiliza el<br />

programador para controlar la pulsación de teclas. La segunda clase queda oculta al<br />

programado y no es necesario que éste sepa de su exist<strong>en</strong>cia para poder manejar el teclado.<br />

Esta última clase es la que se <strong>en</strong>carga de la lógica de la función processStimulus().<br />

La respuesta de esta función a los ev<strong>en</strong>tos del teclado está predefinida para ciertas teclas<br />

que son comúnm<strong>en</strong>te utilizadas. En la sigui<strong>en</strong>te tabla se muestran los comportami<strong>en</strong>tos por<br />

defecto.<br />

Tabla 4 - Tablas de movimi<strong>en</strong>tos predefinidos <strong>en</strong> <strong>Java</strong> <strong>3D</strong><br />

La clase que se debe instanciar para controlar los ev<strong>en</strong>tos del teclado es la clase<br />

KeyNavigatorBehavior, que como tal comportami<strong>en</strong>to deberá incorporar una refer<strong>en</strong>cia al<br />

objeto que se desea transformar.<br />

Si se desea, el usuario puede crear su propia clase comportami<strong>en</strong>to que controle el<br />

teclado y así controlar la pulsación de teclas que se consider<strong>en</strong> oportunas.<br />

Un ejemplo de uso de las teclas de navegación del teclado se puede ver <strong>en</strong><br />

interaction/KeyNavigatorApp.java.<br />

57


<strong>13.3.4</strong>.2.2 Gestión del ratón<br />

Otro dispositivo utilizado por el usuario para interaccionar con un programa es el ratón.<br />

<strong>Java</strong> <strong>3D</strong> proporciona los comportami<strong>en</strong>tos necesarios para controlar los distintos ev<strong>en</strong>tos<br />

que puede g<strong>en</strong>erar el ratón. Entre estos ev<strong>en</strong>tos está la pulsación de cada uno de los<br />

botones. El ev<strong>en</strong>to no se dispara por el hecho de pulsar un botón sino por pulsar y desplazar<br />

el ratón sin soltar el botón pulsado.<br />

Por defecto, cada uno de los botones del ratón ti<strong>en</strong>e un efecto preestablecido que es<br />

controlador por una clase difer<strong>en</strong>te <strong>en</strong> cada caso:<br />

La pulsación del botón izquierdo acompañada de movimi<strong>en</strong>to provoca que el objeto<br />

visual rote. Este ev<strong>en</strong>to lo controla la clase comportami<strong>en</strong>to MouseRotate.<br />

El desplazami<strong>en</strong>to del ratón mant<strong>en</strong>i<strong>en</strong>do pulsado el botón derecho provoca que la<br />

figura se desplace sigui<strong>en</strong>do una trayectoria paralela al plano de imag<strong>en</strong>. Este ev<strong>en</strong>to lo<br />

controla la clase MouseTranslate, que por supuesto es otro comportami<strong>en</strong>to.<br />

Por último, la pulsación del tercer botón del ratón con desplazami<strong>en</strong>to de este<br />

provoca una alteración del zoom de la imag<strong>en</strong>, o lo que es lo mismo, desplaza la imag<strong>en</strong> <strong>en</strong><br />

un plano ortogonal al plano de imag<strong>en</strong>. Este ev<strong>en</strong>to lo controla la clase MouseZoom.<br />

Los tres comportami<strong>en</strong>tos se pued<strong>en</strong> incorporar de forma simultánea a un programa<br />

y para controlar el mismo objeto visual, como no podría ser de otra forma. Estas tres clases<br />

desci<strong>en</strong>d<strong>en</strong> <strong>en</strong> la jerarquía de la clase abstracta MouseBehavior que implem<strong>en</strong>ta la interfaz<br />

MouseCallback.<br />

La clase abstracta es el punto de partida idóneo para crear, por parte del<br />

programador, un comportami<strong>en</strong>to que maneje el ratón. De hecho, la mayor parte de<br />

métodos de esta clase se deb<strong>en</strong> sobrescribir. Por otro lado, la interfaz proporciona un<br />

método, transformChanged() que es invocado cada vez que el objeto susceptible del campo<br />

es transformado.<br />

En el apartado de recursos pued<strong>en</strong> consultarse varios ejemplos sobre interacción con<br />

el ratón. Entre ellos se recomi<strong>en</strong>da interaction/MouseBehaviorApp.java.<br />

<strong>13.3.4</strong>.2.3 Discriminación de objetos<br />

Mi<strong>en</strong>tras no se especifique lo contrario, las interacciones a través del teclado o del ratón<br />

afectan a todo el universo, desplazando toda la esc<strong>en</strong>a. Para determinar un objeto concreto<br />

como el objetivo del ev<strong>en</strong>to se debe utilizar los que se d<strong>en</strong>omina picking.<br />

Como parece lógico, este mecanismo se implem<strong>en</strong>ta como un comportami<strong>en</strong>to que<br />

responde ante ev<strong>en</strong>tos de ratón (¿cómo si no se va a acceder a un elem<strong>en</strong>to concreto d<strong>en</strong>tro<br />

de una esc<strong>en</strong>a <strong>3D</strong>?).<br />

58


El funcionami<strong>en</strong>to es el sigui<strong>en</strong>te:<br />

En primer lugar se determina el objeto visual que se desea manipular, con el ratón.<br />

En el mom<strong>en</strong>to que se pulse un botón del ratón sobre dicho objeto y se desplace el ratón se<br />

dispara el ev<strong>en</strong>to.<br />

Para determinar que objeto hay que manipular, el sistema g<strong>en</strong>era un rayo<br />

d<strong>en</strong>ominado pick ray que se proyecta d<strong>en</strong>tro del universo virtual. Este rayo interfecta con el<br />

objeto más cercano al usuario. Este objeto será el que se vea afectado por la interacción. Es<br />

posible que la proyección del rayo interseque con más de un objeto, <strong>en</strong> este caso exist<strong>en</strong><br />

métodos para ir seleccionando cada uno de dichos objetos (objeto PickObject).<br />

Figura 21 - Discriminación de un objeto visual mediante el mecanismo pick ray<br />

Un bu<strong>en</strong> ejemplo de discriminación de un objeto d<strong>en</strong>tro de una esc<strong>en</strong>a se puede<br />

observar <strong>en</strong> interaction/MousePickApp.java.<br />

La interacción con una figura concreta es una operación muy costosa <strong>en</strong> tiempos de<br />

computación.<br />

El primer lugar, ciertos tipos de interacciones (rotaciones, translaciones...) no<br />

afectan al objeto visual <strong>en</strong> sí sino a alguno de los nodos TransformGroup por <strong>en</strong>cima <strong>en</strong> el<br />

grafo de esc<strong>en</strong>a. Por otro lado, si el objeto está formado por numerosos elem<strong>en</strong>tos<br />

geométricos (por ejemplo un cubo que este formado por cuatro caras individuales), cada<br />

uno de estos objetos deber ser objeto de la interacción.<br />

No es objeto de este docum<strong>en</strong>to <strong>en</strong>trar <strong>en</strong> cómo optimizar el coste de este tipo de<br />

interacciones. Para conocer más acudir a (J. Bouvier, 1999).<br />

Sigui<strong>en</strong>do la tónica de trabajo de <strong>Java</strong> <strong>3D</strong> se proporcionan clases que permit<strong>en</strong><br />

manejar la interacción sobre un objeto concreto y se proporcionan un conjunto de clases<br />

útiles para crear nuevos comportami<strong>en</strong>tos por parte del programador. Todas ellas se<br />

<strong>en</strong>cu<strong>en</strong>tran <strong>en</strong> el paquete com.sun.j3d.utils.behavior.picking.<br />

59


Las clases predefinidas <strong>en</strong> el API son PickRotateBehavior, PickTranslateBehavior y<br />

PickZoomBehavior. Para crear una instancia de cualquiera de estas tres clases es necesario<br />

establecer tres parámetros:<br />

1. El primero es el nodo d<strong>en</strong>tro del grafo de esc<strong>en</strong>a por debajo del cual se va a<br />

controlar los ev<strong>en</strong>tos.<br />

2. El segundo parámetro es el marco <strong>en</strong> el cual se mueve el ratón, es decir el objeto<br />

Canvas<strong>3D</strong> creado para mostrar la esc<strong>en</strong>a.<br />

3. El último parámetro indica los límites de acción del comportami<strong>en</strong>to.<br />

Cada clase anterior controla los ev<strong>en</strong>tos del ratón correspondi<strong>en</strong>tes a pulsar el botón<br />

izquierdo, derecho y c<strong>en</strong>tral, respectivam<strong>en</strong>te (junto con el desplazami<strong>en</strong>to de este<br />

dispositivo).<br />

La construcción de comportami<strong>en</strong>tos propios para controlar este tipo de ev<strong>en</strong>tos no<br />

es objeto de este docum<strong>en</strong>to. Para saber más sobre las clases proporcionadas por <strong>Java</strong> <strong>3D</strong><br />

que permit<strong>en</strong> crear comportami<strong>en</strong>tos propios para el control de este tipo de interacciones,<br />

acudir a (J. Bouvier, 1999).<br />

<strong>13.3.4</strong>.3 Animación <strong>en</strong> <strong>Java</strong> <strong>3D</strong><br />

En el apartado anterior se ha introducido la forma de incluir movimi<strong>en</strong>to <strong>en</strong> una esc<strong>en</strong>a <strong>3D</strong><br />

mediante el control de la interacción del usuario. En este apartado, se analiza cómo incluir<br />

animaciones. Esto supone movimi<strong>en</strong>to sin ningún tipo de interacción por parte del<br />

espectador.<br />

De la jerarquía de la clase Behavior, las clases involucradas <strong>en</strong> la g<strong>en</strong>eración de<br />

animaciones son las que se muestran <strong>en</strong> la sigui<strong>en</strong>te figura.<br />

Figura 22 - Jerarquía de clases Behavior involucradas <strong>en</strong> la animación<br />

Además de estas clases, exist<strong>en</strong> otras clases adicionales que contribuy<strong>en</strong> de alguna<br />

forma a la g<strong>en</strong>eración de esc<strong>en</strong>as animadas.<br />

La forma más natural de crear una animación es realizando transformaciones sobre<br />

la esc<strong>en</strong>a de forma continua <strong>en</strong> el tiempo. Para ello, además de los comportami<strong>en</strong>tos vistos<br />

60


hasta ahora, que permit<strong>en</strong> incluir modificaciones, es necesaria una fu<strong>en</strong>te de reloj que vaya<br />

marcando el tiempo. <strong>Java</strong> <strong>3D</strong> proporciona los dos elem<strong>en</strong>tos. Los comportami<strong>en</strong>tos<br />

implicados se conoc<strong>en</strong> como interpoladores (Interpolator) y el reloj lo implem<strong>en</strong>ta la clase<br />

Alpha. La característica principal de los objetos Interpolator es que son capaces de actual<br />

<strong>en</strong> función de un objeto Alpha. Aunque los interpoladores no son la única forma de crear<br />

animación basada <strong>en</strong> el tiempo, sí es la forma más rápida y s<strong>en</strong>cilla.<br />

Alpha<br />

A continuación, se analizan cada uno de los elem<strong>en</strong>tos implicados.<br />

Este objeto g<strong>en</strong>era valores <strong>en</strong>tre 0.0 y 1.0 que varían con el tiempo como muestra la<br />

sigui<strong>en</strong>te figura.<br />

Figura 23 - Pulso de tiempo g<strong>en</strong>erado por un objeto Alpha<br />

Como se puede ver, el pulso g<strong>en</strong>erado por el objeto Alpha ti<strong>en</strong>e cuatro fases: fase de<br />

crecimi<strong>en</strong>to, fase alta, fase de decrecimi<strong>en</strong>to y fase nula. Cada una de estas fases<br />

corresponde con un valor <strong>en</strong>tero que se puede configurar <strong>en</strong> la creación del objeto.<br />

El número de pulsos que g<strong>en</strong>era el objeto Alpha es otro de los parámetros que se<br />

pued<strong>en</strong> configurar. Puede variar <strong>en</strong>tre un determinado tiempo máximo e infinito. Este<br />

tiempo no aparece <strong>en</strong> la figura anterior y se conoce como timeCount.<br />

El tiempo inicial de un objeto Alpha se obti<strong>en</strong>e del tiempo de inicio de la aplicación,<br />

con lo que todos están sincronizados aunque se hayan creado <strong>en</strong> difer<strong>en</strong>tes mom<strong>en</strong>tos.<br />

61


La Figura 13.23 muestra la forma habitual de los pulsos g<strong>en</strong>erados por el objeto<br />

Alpha, pero no son las únicas formas posibles. En la sigui<strong>en</strong>te figura se pued<strong>en</strong> observar<br />

otras formas de onda que se pued<strong>en</strong> utilizar.<br />

Figura 24 - Formas alternativas de onda g<strong>en</strong>eradas por un objeto Alpha<br />

La forma del pulso condiciona los instantes <strong>en</strong> los que se dispara el ev<strong>en</strong>to y por lo<br />

tanto, el mom<strong>en</strong>to <strong>en</strong> el cual el comportami<strong>en</strong>to <strong>en</strong>tra <strong>en</strong> juego.<br />

Otras características importantes que se pued<strong>en</strong> configurar <strong>en</strong> un objeto Alpha son el<br />

parámetro increasingAlphaDuration y el parámetro increasingAlphaRampDuration. En la<br />

sigui<strong>en</strong>te figura se puede observar cómo afecta cada uno al pulso.<br />

Figura 25 - Suavizado del pulso de tiempo g<strong>en</strong>erado por un objeto Alpha<br />

Los efectos que se consigu<strong>en</strong> al suavizar la curva son relativos a la aceleración con<br />

la cual se dispara el comportami<strong>en</strong>to que modifica el objeto. En la sigui<strong>en</strong>te figura, se<br />

muestra este efecto <strong>en</strong> el movimi<strong>en</strong>to de tres coches.<br />

62


Interpoladores<br />

Figura 26 - Resultados de suavizar un pulso de tiempo de un objeto Alpha<br />

Una vez analizada la clase que permite g<strong>en</strong>erar ev<strong>en</strong>tos de tiempo, el sigui<strong>en</strong>te paso es<br />

c<strong>en</strong>trarse <strong>en</strong> los interpoladores.<br />

En la sigui<strong>en</strong>te figura, se muestra la jerarquía de clases para los interpoladores.<br />

Figura 27 - Jerarquía de clases de los interpoladores<br />

A continuación, se van a describir, de forma breve, cada uno de los interpoladores<br />

de la figura. En el ejemplo animation/InterpolatorApp.java se hace uso de alguno de los<br />

interpoladores que se van a describir a continuación.<br />

ColorInterpolator<br />

Este interpolador altera el color de una determinada figura. Para ello, esta clase manti<strong>en</strong>e<br />

una refer<strong>en</strong>cia a atributo de la figura visual que define el color (Material). Puesto que este<br />

tipo de nodos (<strong>en</strong> g<strong>en</strong>eral los nodos del tipo NodeCompon<strong>en</strong>t) se pued<strong>en</strong> compartir <strong>en</strong>tre<br />

figuras, el interpolador podría alterar el color de un conjunto de objetos visuales de forma<br />

s<strong>en</strong>cilla y rápida.<br />

63


El valor g<strong>en</strong>erado por el objeto Alpha se interpola <strong>en</strong>tre dos vectores que defin<strong>en</strong> un<br />

rango de color, para g<strong>en</strong>erar el color resultado.<br />

PathInterpolator<br />

Tanto la clase ColorInterpolator como los sigui<strong>en</strong>tes interpoladores que se van a explicar a<br />

continuación, utilizan el mecanismo de interpolación <strong>en</strong>tre dos valores como mecanismo de<br />

trabajo.<br />

En cambio, las clases derivadas de la clase PathInterpolator pued<strong>en</strong> almac<strong>en</strong>ar más<br />

de dos valores para realizar la interpolación. Estas clases manti<strong>en</strong><strong>en</strong> una refer<strong>en</strong>cia a un<br />

objeto TransformGroup sobre el cual van a realizar cambios de posición, ori<strong>en</strong>tación y<br />

escala (y por lo tanto sobre sus desc<strong>en</strong>di<strong>en</strong>tes).<br />

El conjunto de puntos que almac<strong>en</strong>a esta clase se conoc<strong>en</strong> como knots. Cada vez se<br />

utilizan dos de estos puntos para realizar la interpolación. Cuáles se elijan dep<strong>en</strong>de del<br />

valor del objeto Alpha.<br />

El valor de estos knots varía <strong>en</strong>tre 0.0 y 1.0, que corresponde con los valores <strong>en</strong>tre<br />

los que varía el valor g<strong>en</strong>erado por el objeto Alpha. Además, el primer punto del conjunto<br />

de knots debe t<strong>en</strong>er el valor 0.0 y el último el valor 1.0. El resto se defin<strong>en</strong> <strong>en</strong> ord<strong>en</strong><br />

creci<strong>en</strong>te. Cada knot ti<strong>en</strong>e asociado un valor que permite determinar cuál se activa<br />

dep<strong>en</strong>di<strong>en</strong>do del valor del objeto Alpha. En la sigui<strong>en</strong>te figura se puede observar esta<br />

correspond<strong>en</strong>cia y cómo se selecciona un knot para un valor determinado del objeto Alpha.<br />

Figura 28 - Pares knot/valor y criterio de seleccion de un knot<br />

Por otro lado, se puede ver cómo cada knot ti<strong>en</strong>e además un valor asociado que<br />

repres<strong>en</strong>ta la información válida para realizar la animación. En el caso de la figura anterior,<br />

esta información es un vector de puntos.<br />

La clase PathInterpolator es la superclase de un conjunto de clases, cada una de las<br />

cuales <strong>en</strong>cargada de un comportami<strong>en</strong>to difer<strong>en</strong>te. Además, exist<strong>en</strong> una serie de clases de<br />

utilidad relacionadas con estos interpoladores.<br />

64


Entre las clases derivadas está la clase PositionInterpolator que define pares<br />

knot/posición para alterar la posición; la clase RotationInterpolator que actúa sobre la<br />

ori<strong>en</strong>tación; la clase RotPosPathInterpolator que permite variar la posición y la ori<strong>en</strong>tación<br />

y, por último, la clase RotPosScalePathInterpolator que permite variar tanto posición como<br />

ori<strong>en</strong>tación como escala.<br />

En el paquete de utilidad está la clase TCBPathSplineInterpolator (con una clase<br />

derivada) que funciona de forma similar a la clase PathInterpolator pero utiliza<br />

interpolación por esplines con lo cual permite obt<strong>en</strong>er animaciones más suaves.<br />

PositionInterpolator<br />

Este interpolador permite variar la posición de un objeto visual a lo largo de un<br />

determinado eje de coord<strong>en</strong>adas.<br />

Manti<strong>en</strong>e una refer<strong>en</strong>cia a un objeto TransformGroup que va a desplazar <strong>en</strong>tre una<br />

posición inicial y otra posición final (ambas especificadas mediante número reales). El<br />

objeto Alpha g<strong>en</strong>era un valor que se interpola d<strong>en</strong>tro del rango establecido sigui<strong>en</strong>do una<br />

interpolación lineal. El valor interpolado se utiliza para g<strong>en</strong>erar una translación sobre el<br />

objeto TransformGroup (la translación se realiza mediante un objeto Transform<strong>3D</strong>).<br />

RotationInterpolator<br />

Permite variar la ori<strong>en</strong>tación de un objeto visual sobre un eje.<br />

Al igual que <strong>en</strong> el caso anterior, manti<strong>en</strong>e una refer<strong>en</strong>cia a un objeto<br />

TransformGroup. En este caso, el valor g<strong>en</strong>erado por el objeto Alpha se interpola <strong>en</strong>tre dos<br />

valores de ángulos (sigui<strong>en</strong>do una interpolación lineal). De nuevo, para realizar la<br />

transformación se utiliza un objeto Transform<strong>3D</strong> que establece, además, sobre que eje<br />

realizar el giro.<br />

ScaleInterpolator<br />

Este interpolador va a permitir modificar la posición de un objeto visual, acercándolo o<br />

alejándolo del espectador. En este caso, se interpola <strong>en</strong>tre dos valores que establec<strong>en</strong> un<br />

rango de escala para el objeto TransformGroup objetivo de la transformación. La forma de<br />

aplicar la transformación es como <strong>en</strong> los casos anteriores.<br />

SwitchValueInterpolator<br />

Este interpolador no interpola <strong>en</strong>tre un par de valores como <strong>en</strong> los casos anteriores, sino<br />

<strong>en</strong>tre un conjunto de elem<strong>en</strong>tos d<strong>en</strong>ominados Switch.<br />

La clase Switch, básicam<strong>en</strong>te, actúa como un cont<strong>en</strong>edor de elem<strong>en</strong>tos (de hecho<br />

deriva de la clase Group). El valor g<strong>en</strong>erado por el objeto Alpha se interpola <strong>en</strong>tre el valor 0<br />

y el número total de elem<strong>en</strong>tos cont<strong>en</strong>idos <strong>en</strong> el objeto Switch. Esto permite elegir uno de<br />

65


los hijos, que será el que se muestre <strong>en</strong> la esc<strong>en</strong>a. A modo de ejemplo, mediante el uso de<br />

ese interpolador se puede mostrar una secu<strong>en</strong>cia de imág<strong>en</strong>es cualesquiera.<br />

La pot<strong>en</strong>cia de la clase Switch está <strong>en</strong> que permite definir <strong>en</strong> cada mom<strong>en</strong>to qué<br />

objetos, de <strong>en</strong>tre los que manti<strong>en</strong>e, se van a visualizar (todos, sólo los que cumplan un<br />

patrón o ninguno).<br />

Transpar<strong>en</strong>cyInterpolator<br />

Este interpolador manti<strong>en</strong>e una refer<strong>en</strong>cia a un objeto del tipo Transpar<strong>en</strong>cyAttribute, por<br />

lo cual podrá cambiar la transpar<strong>en</strong>cia asignada al objeto visual, y si el nodo<br />

Transpar<strong>en</strong>cyAttribute es compartido por más de un objeto visual, podrá cambiar la<br />

transpar<strong>en</strong>cia de todos ellos.<br />

En este caso, el valor del objeto Alpha se interpola <strong>en</strong>tre dos valores de<br />

transpar<strong>en</strong>cia.<br />

Billboard<br />

Este concepto se utiliza <strong>en</strong> el mundo del diseño <strong>3D</strong> para id<strong>en</strong>tificar la técnica que consiste<br />

<strong>en</strong> rotar, de forma automática, elem<strong>en</strong>tos <strong>en</strong> un plano de tal forma que siempre se muestran<br />

de fr<strong>en</strong>te al usuario. El objetivo original de esta técnica es la utilización de una estructura<br />

plana para simular una estructura tridim<strong>en</strong>sional más compleja, con mucho m<strong>en</strong>os coste de<br />

procesami<strong>en</strong>to.<br />

El API de <strong>Java</strong> <strong>3D</strong> proporciona la clase Billboard que hereda de forma directa de la<br />

clase Behavior. La forma de usar esta clase es similar al uso de los interpoladores con la<br />

salvedad de que no existe relación con un objeto Alpha. En este caso, la animación se basa<br />

<strong>en</strong> la posición relativa del objeto Billboard d<strong>en</strong>tro del mundo virtual. Cualquier alteración<br />

del punto de vista de la esc<strong>en</strong>a provoca que se des<strong>en</strong>cad<strong>en</strong>e la acción de este tipo de<br />

comportami<strong>en</strong>to de forma que el objeto controlado siempre se muestra de fr<strong>en</strong>te al usuario.<br />

Un ejemplo sobre este tipo de comportami<strong>en</strong>to se puede ver <strong>en</strong><br />

animation/BillboardApp.java.<br />

LOD<br />

Las siglas LOD (Level Of Detail) id<strong>en</strong>tifican la técnica que consiste <strong>en</strong> variar la cantidad de<br />

detalle con el cual se dibuja un determinado objeto visual dep<strong>en</strong>di<strong>en</strong>do de su posición <strong>en</strong> el<br />

universo virtual, concretam<strong>en</strong>te at<strong>en</strong>di<strong>en</strong>do a la distancia respecto al espectador. Así, a<br />

medida que un objeto se aleja, el nivel de detalle con el que es necesario repres<strong>en</strong>tarlo es<br />

m<strong>en</strong>or con lo que se reduce el esfuerzo de visualización del objeto. La clase DistanceLOD<br />

implem<strong>en</strong>ta esta funcionalidad.<br />

Otro parámetro que posibilita alterar el nivel de detalle con el que se muestra una<br />

figura es la velocidad de visualización.<br />

66


La forma de trabajo consiste <strong>en</strong> utilizar un objeto Switch (ya se vio este objeto <strong>en</strong> el<br />

apartado SwitchValueInterpolator) con el conjunto de objetos que se mostrarán<br />

dep<strong>en</strong>di<strong>en</strong>do de la distancia al espectador. El primer elem<strong>en</strong>to visual especificado es el de<br />

mayor nivel de detalle. El último, el de m<strong>en</strong>o nivel de detalle. El objeto LOD puede trabajar<br />

con varios objetos Switch de forma paralela, con lo que podrá controlar la visualización de<br />

distintos objetos.<br />

67


13.4 MODELO DE VISUALIZACIÓN<br />

<strong>Java</strong> <strong>3D</strong> introduce un nuevo modelo de vista que toma el espíritu típico de <strong>Java</strong> de “escribe<br />

una vez y ejecútalo <strong>en</strong> cualquier lugar” y que lo g<strong>en</strong>eraliza para incluir dispositivos de<br />

imag<strong>en</strong> y periféricos de <strong>en</strong>trada con seis grados de libertad como los head trackers. Este<br />

espíritu del nuevo modelo implica que una aplicación o un applet escrito utilizando el<br />

modelo de vista de <strong>Java</strong> <strong>3D</strong> puede g<strong>en</strong>erar imág<strong>en</strong>es <strong>en</strong> un amplio abanico de dispositivos,<br />

que van desde las pantallas de los ord<strong>en</strong>adores conv<strong>en</strong>cionales hasta dispositivos<br />

“montados <strong>en</strong> la cabeza” (como por ejemplo gafas de realidad virtual). Todo ello sin t<strong>en</strong>er<br />

que modificar el grafo de esc<strong>en</strong>a. Este nuevo modelo también logra que la misma<br />

aplicación, y una vez más sin realizar ninguna modificación, puede g<strong>en</strong>erar vistas<br />

estereoscópicas y puede aprovecharse de un head tracker para controlar la vista g<strong>en</strong>erada.<br />

Para obt<strong>en</strong>er esta gran versatilidad, <strong>Java</strong> <strong>3D</strong> realiza una clara separación <strong>en</strong>tre el<br />

mundo virtual y el físico. Este modelo distingue <strong>en</strong>tre cómo una aplicación coloca, ori<strong>en</strong>ta<br />

y escala un objeto ViewPlatform (un punto de vista) d<strong>en</strong>tro del mundo virtual y cómo el<br />

g<strong>en</strong>erador de <strong>Java</strong> <strong>3D</strong> construye la vista final desde la ori<strong>en</strong>tación y posición de ese mismo<br />

punto de vista. La aplicación controla la posición y ori<strong>en</strong>tación del ViewPlatform; el<br />

g<strong>en</strong>erador obti<strong>en</strong>e qué vista debe g<strong>en</strong>erar utilizando dicha posición y ori<strong>en</strong>tación, una<br />

descripción del <strong>en</strong>torno físico del usuario y la posición y ori<strong>en</strong>tación del propio usuario<br />

d<strong>en</strong>tro de dicho <strong>en</strong>torno físico.<br />

Tanto los modelos basados <strong>en</strong> cámara, como los basados <strong>en</strong> <strong>Java</strong> <strong>3D</strong> permit<strong>en</strong> a los<br />

programadores especificar la forma del fustrum de la vista y, bajo el control del programa,<br />

colocarlo, moverlo, ori<strong>en</strong>tarlo..., d<strong>en</strong>tro del <strong>en</strong>torno virtual. Sin embargo, lo que varía <strong>en</strong>tre<br />

unos modelos y otros es cómo lo hac<strong>en</strong>. Los modelos basados <strong>en</strong> <strong>Java</strong> <strong>3D</strong> permit<strong>en</strong><br />

configurar el fustrum de acuerdo con 6 grados de libertad (que se correspond<strong>en</strong> con los<br />

dispositivos de reastreo o tracking), de tal forma que puede modificar dicho fustrum para<br />

g<strong>en</strong>erar imág<strong>en</strong>es adaptadas al punto de vista concreto del usuario final.<br />

13.4.1 Justificación<br />

Los modelos de vista basados <strong>en</strong> cámara propios de APIs de bajo nivel, proporcionan a los<br />

programadores el control de todos los parámetros de la g<strong>en</strong>eración de imág<strong>en</strong>es. Esto<br />

resulta muy apropiado cuando se están desarrollando aplicaciones personalizadas, pero<br />

resulta m<strong>en</strong>os adecuado cuando se trata de sistemas que int<strong>en</strong>tan disponer de una mayor<br />

aplicabilidad, sistemas como visores o navegadores que cargan y muestran mundos <strong>en</strong>teros<br />

como un solo elem<strong>en</strong>to o sistemas donde el usuario final observa, navega e incluso<br />

interactúa con el mundo virtual g<strong>en</strong>erado.<br />

Los modelos de vista basados <strong>en</strong> cámara emulan una cámara <strong>en</strong> el mundo virtual, no<br />

a una persona <strong>en</strong> dicho mundo. Los desarrolladores deb<strong>en</strong> cambiar la posición de la cámara<br />

continuam<strong>en</strong>te para emular a un humano <strong>en</strong> el mundo virtual. El modelo de vista de <strong>Java</strong><br />

<strong>3D</strong> incorpora el head tracker directam<strong>en</strong>te, <strong>en</strong> caso de que exista, sin ningún tipo de<br />

68


esfuerzo adicional por parte del desarrollador y proporcionando a los usuarios la s<strong>en</strong>sación<br />

de <strong>en</strong>contrarse d<strong>en</strong>tro del mundo virtual.<br />

Cuando el modelo de vista de <strong>Java</strong> <strong>3D</strong> opera <strong>en</strong> un <strong>en</strong>torno sin head tracker y<br />

cuando g<strong>en</strong>era las imág<strong>en</strong>es <strong>en</strong> una sola pantalla, actúa de forma muy similar a los<br />

tradicionales modelos de vista basados <strong>en</strong> cámara, pero con la funcionalidad añadida de ser<br />

capaz de g<strong>en</strong>erar, de forma transpar<strong>en</strong>te, vistas estéreo.<br />

13.4.2 Influ<strong>en</strong>cia del <strong>en</strong>torno físico <strong>en</strong> la vista<br />

No se resulta muy adecuado dejar que la aplicación controle todos los parámetros de<br />

visualización si el <strong>en</strong>torno físico determina parte de dichos parámetros. Por ejemplo, <strong>en</strong><br />

caso de disponer de un dispositivo de salida “montado <strong>en</strong> la cabeza” (algo como un casco o<br />

unas gafas multimedia), es dicho dispositivo el que determina el punto de vista que debe<br />

usar la aplicación. Además, difer<strong>en</strong>tes dispositivos ti<strong>en</strong><strong>en</strong> difer<strong>en</strong>tes puntos de vista, con lo<br />

cual, sería inútil dejar prefijados ciertos parámetros de antemano.<br />

Los parámetros de visualización pued<strong>en</strong> variar mucho dep<strong>en</strong>di<strong>en</strong>do de los detalles<br />

físicos del <strong>en</strong>torno del usuario. Factores que influy<strong>en</strong> mucho <strong>en</strong> dichos parámetros son el<br />

tamaño del dispositivo físico, dónde se <strong>en</strong>cu<strong>en</strong>tra situado (<strong>en</strong> una mesa o <strong>en</strong> la cabeza del<br />

usuario), si el ord<strong>en</strong>ador conoce la posición de la cabeza del usuario <strong>en</strong> el espacio, la<br />

resolución del dispositivo, etc.<br />

Para explicar todo esto con mayor claridad vamos a ver un pequeño ejemplo.<br />

Supongamos que el usuario se si<strong>en</strong>ta <strong>en</strong> una alfombra mágica y que la aplicación que esta<br />

utilizando hace volar al usuario por el <strong>en</strong>torno virtual controlando la posición y ori<strong>en</strong>tación<br />

de la alfombra d<strong>en</strong>tro del mundo virtual. Parece, a primera vista, que la aplicación también<br />

ti<strong>en</strong>e que controlar lo que el usuario ve, y lo hace, pero sólo superficialm<strong>en</strong>te. Ahora<br />

podremos ver cómo el <strong>en</strong>torno del usuario final puede afectar de forma significativa cómo<br />

una aplicación debe construir las transformaciones de visualización.<br />

13.4.2.1 Sistema montado <strong>en</strong> la cabeza<br />

Supongamos que el usuario ve la alfombra mágica y el mundo virtual a través de un<br />

dispositivo montado <strong>en</strong> su cabeza y que dispone de un head tracker. A medida que la<br />

aplicación hace volar la alfombra por el mundo virtual, el usuario puede girarse para mirar<br />

a la izquierda o a la derecha o hacia la parte trasera de su alfombra.<br />

Debido a la utilización del head tracker, el g<strong>en</strong>erador de imág<strong>en</strong>es dispone de la<br />

información sufici<strong>en</strong>te para saber hacia dónde mira el usuario y no necesita dibujar la<br />

esc<strong>en</strong>a <strong>en</strong> fr<strong>en</strong>te de la alfombra mágica. La vista que el g<strong>en</strong>erador de imág<strong>en</strong>es dibuja <strong>en</strong> el<br />

dispositivo montado <strong>en</strong> la cabeza del usuario debe adaptarse a lo que el usuario vería si la<br />

experi<strong>en</strong>cia ocurriera <strong>en</strong> el mundo real.<br />

69


13.4.2.2 Sistema montado <strong>en</strong> una habitación<br />

Supongamos ahora un <strong>en</strong>torno ligeram<strong>en</strong>te difer<strong>en</strong>te. El usuario se si<strong>en</strong>ta <strong>en</strong> una habitación<br />

oscura delante de una gran pantalla de proyección. La aplicación todavía controla el vuelo<br />

de la alfombra, sin embargo, la posición y ori<strong>en</strong>tación de la cabeza del usuario ap<strong>en</strong>as<br />

influye <strong>en</strong> la imag<strong>en</strong> dibujada <strong>en</strong> la pantalla. Si el usuario mira a izquierda o a derecha, sólo<br />

ve la habitación oscura. La pantalla no se mueve y, como la pantalla repres<strong>en</strong>ta, de alguna<br />

forma, la v<strong>en</strong>tana frontal de la alfombra, la habitación repres<strong>en</strong>ta el interior oscuro de la<br />

misma. Si se añadieran pantallas a la izquierda y a la derecha, se le proporcionaría al<br />

conductor de la alfombra una visión más completa del mundo virtual que rodea a la<br />

alfombra. En ese caso, el usuario podría ver la vista a la derecha o la izquierda de la<br />

alfombra simplem<strong>en</strong>te girando su cabeza.<br />

En el ejemplo usando un dispositivo “montado <strong>en</strong> la cabeza” , la posición y<br />

ori<strong>en</strong>tación de la cabeza del usuario afectan significativam<strong>en</strong>te la posición y ori<strong>en</strong>tación de<br />

la cámara del modelo, pero ap<strong>en</strong>as influye <strong>en</strong> la matriz de proyección. En el ejemplo con un<br />

sistema “montado <strong>en</strong> la habitación” , la posición y ori<strong>en</strong>tación de la cabeza del usuario no<br />

influye ap<strong>en</strong>as <strong>en</strong> la posición y ori<strong>en</strong>tación de la cámara, pero sí influye <strong>en</strong> la matriz de<br />

proyección.<br />

Desde una perspectiva basada <strong>en</strong> una cámara, el desarrollador de la aplicación debe<br />

construir la posición y ori<strong>en</strong>tación de la cámara combinando el compon<strong>en</strong>te relativo al<br />

mundo virtual (la posición y ori<strong>en</strong>tación de la alfombra) y el compon<strong>en</strong>te del mundo físico<br />

(la posición y ori<strong>en</strong>tación de la cabeza del usuario).<br />

El modelo de vista de <strong>Java</strong> <strong>3D</strong> incorpora las abstracciones apropiadas para<br />

comp<strong>en</strong>sar toda esta posible variabilidad de los <strong>en</strong>tornos de usuario.<br />

13.4.3 Separación de físico y virtual<br />

El modelo de visualización de <strong>Java</strong> <strong>3D</strong> separa el <strong>en</strong>torno virtual, donde el programador ha<br />

colocado los distintos objetos unos <strong>en</strong> relación con los otros, del <strong>en</strong>torno físico, donde el<br />

usuario sí existe, ve los dispositivos de salida del ord<strong>en</strong>ador y manipula los de <strong>en</strong>trada.<br />

<strong>Java</strong> <strong>3D</strong> define también una correspond<strong>en</strong>cia fundam<strong>en</strong>tal <strong>en</strong>tre el mundo físico del<br />

usuario y el mundo virtual de la aplicación gráfica. Esta correspond<strong>en</strong>cia define un espacio<br />

común donde una acción llevada a cabo por el usuario afecta a los objetos <strong>en</strong> el mundo<br />

virtual y donde cualquier actividad de los objetos <strong>en</strong> el mundo virtual afecta la vista del<br />

usuario.<br />

13.4.3.1 El mundo virtual<br />

El mundo virtual es un espacio común <strong>en</strong> el que exist<strong>en</strong> los objetos virtuales. El sistema de<br />

coord<strong>en</strong>adas del mundo virtual existe de forma relativa a un Locale de alta resolución (cada<br />

objeto Locale define el orig<strong>en</strong> de unas coord<strong>en</strong>adas del mundo virtual para todos los objetos<br />

70


unidos a dicho Locale). El objeto Locale que conti<strong>en</strong>e al objeto ViewPlatform activo define<br />

las coord<strong>en</strong>adas del mundo virtual utilizadas para g<strong>en</strong>erar las imág<strong>en</strong>es. <strong>Java</strong> <strong>3D</strong><br />

transformará, ev<strong>en</strong>tualm<strong>en</strong>te, todas las coord<strong>en</strong>adas asociadas con los elem<strong>en</strong>tos del grafo<br />

de esc<strong>en</strong>a para incluirlos <strong>en</strong> el espacio común del mundo virtual.<br />

13.4.3.2 El mundo físico<br />

El mundo físico es, simplem<strong>en</strong>te, el mundo real. Es el espacio <strong>en</strong> el que existe el usuario <strong>en</strong><br />

el que mueve su cuerpo, su cabeza, sus manos... Es el espacio <strong>en</strong> el que cualquier rastreador<br />

físico define sus coord<strong>en</strong>adas locales y <strong>en</strong> el que se describ<strong>en</strong> varios sistemas de<br />

coord<strong>en</strong>adas de calibración.<br />

El mundo físico es un espacio, no un sistema de coord<strong>en</strong>adas común <strong>en</strong>tre difer<strong>en</strong>tes<br />

instancias de ejecución de <strong>Java</strong> <strong>3D</strong>. Así, si dos ord<strong>en</strong>adores difer<strong>en</strong>tes, <strong>en</strong> dos posiciones<br />

físicas distintas <strong>en</strong> el mundo están ejecutando una aplicación a la vez, <strong>Java</strong> <strong>3D</strong> no dispone<br />

ningún mecanismo directo para relacionar los sistemas de coord<strong>en</strong>adas del mundo físico de<br />

cada uno de ellos. Son las características propias de cada <strong>en</strong>torno las que defin<strong>en</strong> el sistema<br />

de coord<strong>en</strong>adas local de cada mundo físico.<br />

13.4.4 Objetos que defin<strong>en</strong> la vista<br />

<strong>Java</strong> <strong>3D</strong> distribuye los parámetros del modelo de visualización <strong>en</strong> distintos objetos: el<br />

objeto View y los objetos compon<strong>en</strong>tes asociados con él, el objeto PhysicalBody, el objeto<br />

PhysicalEnvironm<strong>en</strong>t, el objeto Canvas<strong>3D</strong> y el objeto Scre<strong>en</strong><strong>3D</strong>.<br />

A continuación se describe brevem<strong>en</strong>te el papel de cada uno de estos objetos <strong>en</strong> el<br />

sistema:<br />

ViewPlatform. Es un nodo hoja que ubica una vista d<strong>en</strong>tro de un grafo de esc<strong>en</strong>a.<br />

Sus padres especifican su posición, ori<strong>en</strong>tación y escala <strong>en</strong> el mundo virtual.<br />

Canvas<strong>3D</strong>. El objeto Canvas<strong>3D</strong> <strong>en</strong>capsula todos los parámetros relativos a la<br />

v<strong>en</strong>tana <strong>en</strong> la que se está r<strong>en</strong>derizando. Cuando se une un objeto Canvas<strong>3D</strong> a un<br />

objeto View, <strong>Java</strong> <strong>3D</strong> r<strong>en</strong>deriza la vista especificada <strong>en</strong> la pantalla. Varios objetos<br />

Canvas<strong>3D</strong> pued<strong>en</strong> referirse al mismo objeto View. Canvas<strong>3D</strong> exti<strong>en</strong>de el objeto<br />

java.awt.Canvas para incluir información relativa a los objetos <strong>3D</strong> como pued<strong>en</strong> ser<br />

el tamaño <strong>en</strong> píxeles del li<strong>en</strong>zo, la localización del mismo también <strong>en</strong> píxeles d<strong>en</strong>tro<br />

de un objeto Scre<strong>en</strong><strong>3D</strong> y si el li<strong>en</strong>zo ti<strong>en</strong>e activada o no la opción de estéreo. Como<br />

todos los objetos Canvas<strong>3D</strong> conti<strong>en</strong><strong>en</strong> una refer<strong>en</strong>cia a un objeto Scre<strong>en</strong><strong>3D</strong>, y<br />

debido a que los objetos Scre<strong>en</strong><strong>3D</strong> defin<strong>en</strong> el tamaño de un píxel <strong>en</strong> unidades física,<br />

<strong>Java</strong> <strong>3D</strong> puede convertir un tamaño <strong>en</strong> píxeles <strong>en</strong> un tamaño del mundo real <strong>en</strong><br />

metros. También puede determinar la posición y ori<strong>en</strong>tación del Canvas<strong>3D</strong> <strong>en</strong> el<br />

mundo real.<br />

71


Scre<strong>en</strong><strong>3D</strong>. El objeto Scre<strong>en</strong><strong>3D</strong> <strong>en</strong>capsula todos los parámetros asociados con la<br />

pantalla física que conti<strong>en</strong>e el li<strong>en</strong>zo. Estos parámetros pued<strong>en</strong> ser la anchura y<br />

altura de la pantalla <strong>en</strong> píxeles, las dim<strong>en</strong>siones físicas de la pantalla y varios<br />

valores de calibración física. Este objeto proporciona la versión <strong>3D</strong> del objeto<br />

Scre<strong>en</strong> de AWT. <strong>Java</strong> <strong>3D</strong> permite t<strong>en</strong>er activos varios objetos Scre<strong>en</strong><strong>3D</strong> de forma<br />

simultánea. Por supuesto sólo se pued<strong>en</strong> utilizar varias pantallas si la configuración<br />

de la máquina que se utiliza dispone de varias pantallas de salida. Un objeto<br />

Scre<strong>en</strong><strong>3D</strong> repres<strong>en</strong>ta un dispositivo indep<strong>en</strong>di<strong>en</strong>te. La configuración más<br />

conv<strong>en</strong>cional para <strong>Java</strong> <strong>3D</strong> es un ord<strong>en</strong>ador de sobremesa con una sola pantalla.<br />

Sin embargo, <strong>Java</strong> <strong>3D</strong> puede aprovechar <strong>en</strong>tornos <strong>en</strong> los que se necesitan tres o más<br />

pantallas. Estos <strong>en</strong>tornos requier<strong>en</strong> un mayor cuidado <strong>en</strong> la inicialización y <strong>en</strong> la<br />

calibración.<br />

<strong>Java</strong> <strong>3D</strong> debe conocer las posiciones relativas de los objetos Scre<strong>en</strong><strong>3D</strong> (de cada uno<br />

respecto del resto).<br />

View. El objeto View especifica la información necesaria para r<strong>en</strong>derizar el grafo de<br />

esc<strong>en</strong>a. El objeto View es el objeto c<strong>en</strong>tral de <strong>Java</strong> <strong>3D</strong> para coordinar todos los<br />

aspectos de visualización. Todos los parámetros de visualización de <strong>Java</strong> <strong>3D</strong> o bi<strong>en</strong><br />

están cont<strong>en</strong>idos directam<strong>en</strong>te d<strong>en</strong>tro del objeto View o bi<strong>en</strong> lo están <strong>en</strong> objetos<br />

accesibles desde un objeto View.<br />

<strong>Java</strong> <strong>3D</strong> permite el uso simultáneo de varios objetos View activos, cada uno de los<br />

cuales puede r<strong>en</strong>derizar uno o más li<strong>en</strong>zos.<br />

Este objeto coordina todos los aspectos del proceso de r<strong>en</strong>derización. Conti<strong>en</strong>e los<br />

parámetros o refer<strong>en</strong>cias a los objetos que conti<strong>en</strong><strong>en</strong> los parámetros que determinan<br />

cómo r<strong>en</strong>derizar las imág<strong>en</strong>es <strong>en</strong> las v<strong>en</strong>tanas repres<strong>en</strong>tadas por sus<br />

correspondi<strong>en</strong>tes objetos Canvas<strong>3D</strong>. También conti<strong>en</strong>e el conjunto de li<strong>en</strong>zos que<br />

repres<strong>en</strong>tan varias v<strong>en</strong>tanas <strong>en</strong> una misma vista.<br />

PhysicalBody. El objeto PhysicalBody <strong>en</strong>capsula todos los parámetros asociados<br />

con el cuerpo físico como pued<strong>en</strong> ser la posición de la cabeza, del ojo derecho e<br />

izquierdo, los oídos, izquierdo y derecho e incluso la distancia <strong>en</strong>tre ambas pupilas.<br />

El objeto PhysicalBody conti<strong>en</strong>e información relativa a las características físicas<br />

del cuerpo del usuario. Los parámetros relativos a la cabeza permit<strong>en</strong> a dichos<br />

usuarios especificar las características de su propia cabeza para adaptar las<br />

aplicaciones de <strong>Java</strong> <strong>3D</strong> de tal forma que se adapt<strong>en</strong> a su propia geometría. El<br />

objeto PhysicalBody define un sistema de coord<strong>en</strong>adas relativo a la cabeza del<br />

espectador, que sirve de punto de refer<strong>en</strong>cia para definir los parámetros de su<br />

cabeza.<br />

Dicho sistema de coord<strong>en</strong>adas ti<strong>en</strong>e su orig<strong>en</strong> <strong>en</strong> el plano bilateral de simetría de la<br />

cabeza, aproximadam<strong>en</strong>te a mitad de camino <strong>en</strong>tre el ojo izquierdo y el derecho. El<br />

orig<strong>en</strong> del sistema de coord<strong>en</strong>adas de la cabeza se d<strong>en</strong>omina ojo c<strong>en</strong>tral. La parte<br />

positiva del eje de abscisas se exti<strong>en</strong>de a la derecha y el eje de ord<strong>en</strong>adas, hacia<br />

72


arriba. El eje positivo de la compon<strong>en</strong>te z se introduce <strong>en</strong> la cabeza. Los valores se<br />

dan <strong>en</strong> metros.<br />

PhysicalEnvironm<strong>en</strong>t. El objeto PhysicalEnvironm<strong>en</strong>t <strong>en</strong>capsula toda la<br />

información relativa al <strong>en</strong>torno físico como pued<strong>en</strong> ser parámetros de calibración de<br />

los distintos tipos de rastreo.<br />

Estos objetos describ<strong>en</strong>, conjuntam<strong>en</strong>te, la geometría de visualización. El g<strong>en</strong>erador<br />

de imág<strong>en</strong>es de <strong>Java</strong> <strong>3D</strong> utiliza esta información para construir las matrices de<br />

visualización y de proyección apropiados. El hecho de que estén creados desde un<br />

punto de vista geométrico proporciona a estos objetos una gran flexibilidad para<br />

g<strong>en</strong>erar vistas, lo cual les permite cambiar fácilm<strong>en</strong>te de configuración.<br />

13.4.5 ViewPlatform: Un lugar <strong>en</strong> el mundo virtual<br />

Un nodo hoja ViewPlatform define un sistema de coord<strong>en</strong>adas y, por lo tanto, un punto de<br />

refer<strong>en</strong>cia relativo a su orig<strong>en</strong> asociado <strong>en</strong> el mundo virtual. Este objeto sirve como punto<br />

de unión para los objetos de visualización y como base para determinar el punto de vista de<br />

la r<strong>en</strong>derización.<br />

Los nodos que se sitúan por <strong>en</strong>cima del ViewPlatform <strong>en</strong> el grafo de esc<strong>en</strong>a<br />

determinan la posición de dicho ViewPlatform así cómo está ori<strong>en</strong>tado d<strong>en</strong>tro del mundo<br />

virtual. Si se modifica el objeto Transform<strong>3D</strong> asociado con un nodo TransformGroup <strong>en</strong><br />

cualquier lugar por <strong>en</strong>cima de un ViewPlatform, se puede permitir que una aplicación o<br />

comportami<strong>en</strong>to pueda mover dicho ViewPlatform de cualquier forma d<strong>en</strong>tro del mundo<br />

virtual.<br />

Un VirtualUniverse puede t<strong>en</strong>er varios ViewPlatform, pero un objeto View sólo<br />

puede unirse a un único ViewPlatform. Así pues, cada g<strong>en</strong>eración de imág<strong>en</strong>es <strong>en</strong> un<br />

Canvas<strong>3D</strong> se realiza desde el punto de vista de un único ViewPlatform.<br />

Una aplicación puede navegar por el mundo virtual modificando el padre de un<br />

objeto ViewPlatform, el objeto TransformGroup. Aplicaciones que pued<strong>en</strong> modificar la<br />

ubicación y ori<strong>en</strong>tación de un ViewPlatform son los navegadores, visualizadores de objetos<br />

incluso juegos de búsqueda. El control del objeto ViewPlatform puede producir resultados<br />

muy útiles e interesantes.<br />

Un grafo de esc<strong>en</strong>a puede cont<strong>en</strong>er varios objetos ViewPlatform. Si un usuario<br />

separa un objeto View de un objeto ViewPlatform y, posteriorm<strong>en</strong>te, une ese mismo objeto<br />

View a otro ViewPlatform difer<strong>en</strong>te, la imag<strong>en</strong> que se muestre se g<strong>en</strong>erará desde el punto de<br />

vista del nuevo objeto ViewPlatform.<br />

73


13.4.6 El sistema de coord<strong>en</strong>adas<br />

El modelo básico de visualización consta de ocho o nueve sistemas de coord<strong>en</strong>adas,<br />

dep<strong>en</strong>di<strong>en</strong>do de si el sistema del usuario es montado “<strong>en</strong> cabeza” o “<strong>en</strong> habitación”.<br />

13.4.6.1 Sistema de coord<strong>en</strong>adas “montados <strong>en</strong> habitación”<br />

El sistema de coord<strong>en</strong>adas montado <strong>en</strong> habitación se divide <strong>en</strong> sistema de coord<strong>en</strong>adas<br />

virtual y sistema de coord<strong>en</strong>adas físico.<br />

Los sistemas de coord<strong>en</strong>adas situados d<strong>en</strong>tro de la zona gris exist<strong>en</strong> <strong>en</strong> el mundo<br />

virtual y los situados fuera de dicha zona exist<strong>en</strong> <strong>en</strong> el mundo físico. El sistema de<br />

coord<strong>en</strong>adas de coexist<strong>en</strong>cia existe <strong>en</strong> ambos mundos.<br />

13.4.6.1.1 Sistemas de coord<strong>en</strong>adas virtuales<br />

Sistema de coord<strong>en</strong>adas del mundo virtual<br />

El sistema de coord<strong>en</strong>adas del mundo virtual <strong>en</strong>capsula el sistema de coord<strong>en</strong>adas unificado<br />

para todos los objetos del grafo de esc<strong>en</strong>a localizados <strong>en</strong> el <strong>en</strong>torno virtual. Para un objeto<br />

View dado, el sistema de coord<strong>en</strong>adas del mundo virtual lo define el objeto Locale que<br />

conti<strong>en</strong>e el objeto ViewPlatform unido al objeto View. Como ya se ha com<strong>en</strong>tado, se trata<br />

de un sistema de coord<strong>en</strong>adas diestro.<br />

Sistema de coord<strong>en</strong>adas de ViewPlatform<br />

El sistema de coord<strong>en</strong>adas del objeto ViewPlatform es el sistema de coord<strong>en</strong>adas local.<br />

Sistema de coord<strong>en</strong>adas de coexist<strong>en</strong>cia<br />

Un objetivo fundam<strong>en</strong>tal, e implícito, de cualquier modelo de visualización es poder<br />

mapear una porción específica del mundo físico <strong>en</strong> una zona específica del mundo virtual.<br />

Una vez establecida esta relación, se puede preguntar dónde está la cabeza o la mano del<br />

usuario d<strong>en</strong>tro del mundo virtual o dónde se <strong>en</strong>cu<strong>en</strong>tra un objeto virtual <strong>en</strong> el mundo físico.<br />

De esta forma el usuario físico puede interactuar con objetos propios del mundo virtual y<br />

viceversa. Para establecer este mapeado <strong>Java</strong> <strong>3D</strong> define un sistema de coord<strong>en</strong>adas especial<br />

llamado de coexist<strong>en</strong>cia y que se define de tal forma que existe <strong>en</strong> ambos mundos, el virtual<br />

y el físico.<br />

El sistema de coord<strong>en</strong>adas de coexist<strong>en</strong>cia existe <strong>en</strong> ambos mundos. Las dos<br />

transformaciones que pasan del sistema de coord<strong>en</strong>adas de coexist<strong>en</strong>cia al sistema de<br />

coord<strong>en</strong>adas del mundo virtual y al contrario, dispon<strong>en</strong> de la información necesaria para<br />

expandir o contraer el mundo virtual relativo al mundo físico, así como de toda la<br />

información necesaria para colocar y ori<strong>en</strong>tar el mundo virtual relativam<strong>en</strong>te al mundo<br />

físico. Si estas transformaciones se cambian, se modifica también lo que puede ver el<br />

74


usuario. Para mover al usuario a través del mundo virtual se modifican dichas<br />

transformaciones.<br />

13.4.6.1.2 Sistemas de coord<strong>en</strong>adas físicos<br />

Sistema de coord<strong>en</strong>adas de cabeza<br />

Este sistema de coord<strong>en</strong>adas permite que una aplicación disponga de la información<br />

relativa a la geometría de la cabeza del usuario. Proporciona información sufici<strong>en</strong>te como<br />

para determinar la posición de los ojos y de los oídos.<br />

Sistema de coord<strong>en</strong>adas de pantalla<br />

Este sistema de coord<strong>en</strong>adas se corresponde con el sistema de coord<strong>en</strong>adas físico del<br />

g<strong>en</strong>erador de imág<strong>en</strong>es. Se define de tal forma que su orig<strong>en</strong> se <strong>en</strong>cu<strong>en</strong>tra <strong>en</strong> la esquina<br />

inferior izquierda del área de visualización. Este sistema de coord<strong>en</strong>adas es difer<strong>en</strong>te tanto<br />

del que correspondería a una pantalla a la izquierda como a una pantalla a la derecha. Estos<br />

otros sistemas de coord<strong>en</strong>adas se defin<strong>en</strong> exclusivam<strong>en</strong>te para sistemas montados ‘<strong>en</strong><br />

cabeza’.<br />

Sistema de coord<strong>en</strong>adas del head tracker<br />

Este sistema de coord<strong>en</strong>adas se corresponde con el s<strong>en</strong>sor de seis grados de libertad unido a<br />

la cabeza del usuario. Describe la posición de la cabeza del usuario <strong>en</strong> cada mom<strong>en</strong>to.<br />

Sistema de coord<strong>en</strong>adas de la base del tracker<br />

Se corresponde con el emisor asociado con los rastreadores de posición y ori<strong>en</strong>tación<br />

absolutas. Este sistema de coord<strong>en</strong>adas suele estar fuertem<strong>en</strong>te unido al mundo físico.<br />

13.4.6.2 Sistemas de coord<strong>en</strong>adas “montados <strong>en</strong> cabeza”<br />

Estos sistemas de coord<strong>en</strong>adas también se divid<strong>en</strong> <strong>en</strong> físicos y virtuales. En la sigui<strong>en</strong>te<br />

figura se muestran todos ellos. Como ocurría con los sistemas de coord<strong>en</strong>adas “montados<br />

<strong>en</strong> habitación” los localizados <strong>en</strong> el área gris correspond<strong>en</strong> al mundo virtual y los que se<br />

<strong>en</strong>cu<strong>en</strong>tran fuera de dicha zona correspond<strong>en</strong> al mundo real. El sistema de coexist<strong>en</strong>cia<br />

existe, también aquí, <strong>en</strong> ambos mundos. Además de dichos sistemas de coord<strong>en</strong>adas, <strong>Java</strong><br />

<strong>3D</strong> añade dos nuevos sistemas de coord<strong>en</strong>adas de pantalla, uno para cada ojo del usuario.<br />

Sistema de coord<strong>en</strong>adas de pantalla izquierda y derecha<br />

Estos dos sistemas de coord<strong>en</strong>adas se correspond<strong>en</strong> con el sistema de coord<strong>en</strong>adas físico<br />

asociado con cada uno de los ojos. Su orig<strong>en</strong> se <strong>en</strong>cu<strong>en</strong>tra <strong>en</strong> la esquina inferior izquierda<br />

de la zona de pantalla. Ambos planos (los de los dos ojos) no ti<strong>en</strong><strong>en</strong> por qué estar <strong>en</strong><br />

paralelo.<br />

75


13.5 RESUMEN<br />

En este capítulo, se han analizado de forma g<strong>en</strong>eral los mecanismos que proporciona el API<br />

de <strong>Java</strong> <strong>3D</strong> para la construcción de esc<strong>en</strong>as <strong>en</strong> tres dim<strong>en</strong>siones. Aunque se trata de una<br />

descripción a grandes rasgos, es sufici<strong>en</strong>te para descubrir toda la pot<strong>en</strong>cia que puede<br />

obt<strong>en</strong>erse con esta API.<br />

Analizada la <strong>en</strong>tidad de <strong>Java</strong> <strong>3D</strong> y los objetivos que se persigu<strong>en</strong> con su diseño, el<br />

docum<strong>en</strong>to se c<strong>en</strong>tra <strong>en</strong> el análisis de los conceptos elem<strong>en</strong>tales y la estructura básica <strong>en</strong> la<br />

que se basa esta API, el grafo de esc<strong>en</strong>a.<br />

A continuación, se describe cómo se estructura el sistema de coord<strong>en</strong>adas utilizado<br />

<strong>en</strong> la repres<strong>en</strong>tación de elem<strong>en</strong>tos <strong>3D</strong> c<strong>en</strong>trándose <strong>en</strong> la descripción de las coord<strong>en</strong>adas de<br />

alta resolución que permit<strong>en</strong> ajustar las necesidades de precisión para describir cualquier<br />

elem<strong>en</strong>to a modelar (desde una galaxia a un átomo).<br />

El grafo de esc<strong>en</strong>a proporciona una descomposición del universo virtual <strong>en</strong> dos<br />

grupos principales: la rama de cont<strong>en</strong>idos y la rama de visualización. Basándose <strong>en</strong> esta<br />

separación, el trabajo se divide, de forma lógica, <strong>en</strong> dos grandes grupos describi<strong>en</strong>do cada<br />

una de dichas ramas. D<strong>en</strong>tro de la rama de cont<strong>en</strong>idos, se han descrito los mecanismos<br />

principales que proporciona <strong>Java</strong> <strong>3D</strong> para la g<strong>en</strong>eración de figuras geométricas. En primer<br />

lugar, se com<strong>en</strong>tan las clases involucradas <strong>en</strong> la g<strong>en</strong>eración de figuras primitivas (conos,<br />

cilindros, esferas...) para luego c<strong>en</strong>trarse <strong>en</strong> mecanismo más pot<strong>en</strong>tes que permit<strong>en</strong> g<strong>en</strong>erar<br />

elem<strong>en</strong>tos más complejos. En este punto, se ha analizado como <strong>Java</strong> <strong>3D</strong> realiza el<br />

tratami<strong>en</strong>to de puntos para g<strong>en</strong>erar elem<strong>en</strong>tos de volum<strong>en</strong>. Para ello, se introduce la clase<br />

GeometryArray y sus derivadas describi<strong>en</strong>do los principios de funcionami<strong>en</strong>to de dichas<br />

clases. D<strong>en</strong>tro de la g<strong>en</strong>eración de cont<strong>en</strong>idos se analiza la utilización de texto 2D y <strong>3D</strong>.<br />

Además, esta API proporciona mecanismos adicionales de ayuda para la g<strong>en</strong>eración de<br />

universos virtuales: cargadores de esc<strong>en</strong>as y clases especializadas de tratami<strong>en</strong>to de puntos<br />

(GeometryInfo, NormalG<strong>en</strong>erator...).<br />

Una vez tratados los mecanismos para crear objetos d<strong>en</strong>tro de una esc<strong>en</strong>a, se pasa a<br />

describir cómo alterar y configurar la apari<strong>en</strong>cia de cada uno de los objetos. El primer<br />

elem<strong>en</strong>to sobre el que se trabaja es el fondo de la propia esc<strong>en</strong>a, para, a continuación,<br />

c<strong>en</strong>trarse <strong>en</strong> la descripción de los mecanismos para modelar la apari<strong>en</strong>cia del resto de<br />

elem<strong>en</strong>tos. En este punto se aborda, de forma g<strong>en</strong>eral, el tema de la gestión de luces y de<br />

texturas.<br />

Como punto final de la descripción de la rama de cont<strong>en</strong>idos, se introduc<strong>en</strong> los<br />

mecanismos para interactuar con el usuario así como para crear movimi<strong>en</strong>to y animación <strong>en</strong><br />

<strong>Java</strong> <strong>3D</strong>. En este punto, y <strong>en</strong> primer lugar, se describ<strong>en</strong> ciertos conceptos es<strong>en</strong>ciales que<br />

dan soporte tanto a la gestión de la interacción con el usuario como a la g<strong>en</strong>eración de<br />

animaciones. Entre estos aspectos g<strong>en</strong>erales destacar, el concepto de capacidad que define<br />

qué características de un objeto podrán modificarse <strong>en</strong> tiempo de ejecución y cuales no, así<br />

como el concepto de comportami<strong>en</strong>to.<br />

76


Respecto a la interacción con el usuario, se aborda cómo gestionar los dispositivos<br />

básicos de interacción (ratón y teclado) y los comportami<strong>en</strong>tos destinados a ello<br />

(KeyNavigatorBehavior, MouseBehavior...), aunque <strong>Java</strong> <strong>3D</strong> no está limitado a estos<br />

dispositivos.<br />

En cuanto al tema de las animaciones, se aborda, principalm<strong>en</strong>te, el tema de los<br />

interpoladores y las animaciones basadas <strong>en</strong> el tiempo, dejando <strong>en</strong>trever otros aspectos<br />

como el morphing.<br />

Tras el análisis de la g<strong>en</strong>eración de cont<strong>en</strong>ido, el sigui<strong>en</strong>te paso es la descripción de<br />

todo lo relacionado con la forma <strong>en</strong> la cual el sistema visualiza dicho cont<strong>en</strong>ido. Para ello,<br />

se abordan los conceptos principales <strong>en</strong> los que se basa la rama de visualización que es la<br />

que posee todos los parámetros para configurar la forma <strong>en</strong> la que se mostrarán los objetos.<br />

En este apartado, se introduc<strong>en</strong> ciertos conceptos de interés que caracterizan a <strong>Java</strong> <strong>3D</strong><br />

como es el hecho de superar el concepto de cámara como forma tradicional de visualizar un<br />

<strong>en</strong>torno <strong>3D</strong> incorporando aspectos más avanzados como son los head trackers que permit<strong>en</strong><br />

considerar al usuario como parte de la esc<strong>en</strong>a <strong>3D</strong> controlando <strong>en</strong> todo mom<strong>en</strong>to su<br />

posición, y tomando decisiones <strong>en</strong> base a dicha posición. Se analizar cómo se combina<br />

mundo físico y mundo virtual <strong>en</strong> <strong>Java</strong> <strong>3D</strong> y como a través de un amplio número de sistemas<br />

de coord<strong>en</strong>adas, esta API puede llegar a corresponder de forma precisa ambos mundos.<br />

77


13.6 CONCLUSIONES<br />

A lo largo de este trabajo se ha podido comprobar, de forma g<strong>en</strong>eral, la pot<strong>en</strong>cia de <strong>Java</strong> <strong>3D</strong><br />

como <strong>en</strong>torno para la g<strong>en</strong>eración de esc<strong>en</strong>as <strong>en</strong> tres dim<strong>en</strong>siones.<br />

La verdad es que se podía haber profundizado mucho más <strong>en</strong> todo lo refer<strong>en</strong>te a<br />

métodos y clases, pero no se ha considerado oportuno ya que dicho nivel de detalle queda<br />

fuera de las pret<strong>en</strong>siones de este trabajo. Por el contrario, se ha tratado de dar una visión<br />

amplia de los difer<strong>en</strong>tes conceptos y elem<strong>en</strong>tos involucrados <strong>en</strong> la g<strong>en</strong>eración de <strong>en</strong>tornos<br />

<strong>en</strong> tres dim<strong>en</strong>siones utilizando <strong>Java</strong> <strong>3D</strong>.<br />

La versión de <strong>Java</strong> <strong>3D</strong> que se ha analizado <strong>en</strong> este docum<strong>en</strong>to es la que se ejecuta<br />

sobre sistemas gráficos basados <strong>en</strong> Op<strong>en</strong>GL con lo cual, aunque exist<strong>en</strong> difer<strong>en</strong>cias<br />

inher<strong>en</strong>tes <strong>en</strong> la filosofía utilizada por ambas APIs, hay elem<strong>en</strong>tos (como por ejemplo el<br />

modelo de iluminación) que son prácticam<strong>en</strong>te equival<strong>en</strong>tes.<br />

Una difer<strong>en</strong>cia importante <strong>en</strong>tre <strong>Java</strong> <strong>3D</strong> y Op<strong>en</strong>GL es el modo de realizar tanto las<br />

modificaciones como la configuración de la esc<strong>en</strong>a. Mi<strong>en</strong>tras que <strong>en</strong> Op<strong>en</strong>GL las<br />

operaciones se hac<strong>en</strong> <strong>en</strong> cualquier ord<strong>en</strong> y con actualizar la esc<strong>en</strong>a, todo queda <strong>en</strong> su sitio,<br />

<strong>en</strong> <strong>Java</strong> <strong>3D</strong> es necesario seguir un ord<strong>en</strong> tanto <strong>en</strong> la creación de esc<strong>en</strong>as como <strong>en</strong> su<br />

modificación. Esto es debido a que <strong>Java</strong> <strong>3D</strong> utiliza una estructura jerarquizada (un grafo de<br />

esc<strong>en</strong>a) para repres<strong>en</strong>tar los distintos elem<strong>en</strong>tos. El uso del grafo de esc<strong>en</strong>a permite una<br />

repres<strong>en</strong>tación gráfica de la esc<strong>en</strong>a previa a su g<strong>en</strong>eración por parte del sistema. Además, la<br />

estructura del grafo de esc<strong>en</strong>a hace posible aislar distintos compon<strong>en</strong>tes del mismo, trabajar<br />

con zonas del gráfico de forma aislada, incluso compilar partes del grafo de forma aislada<br />

y, posteriorm<strong>en</strong>te, unirlas al grafo de esc<strong>en</strong>a <strong>en</strong> su lugar correspondi<strong>en</strong>te.<br />

Por otro lado, <strong>Java</strong> <strong>3D</strong> es un sistema muy ori<strong>en</strong>tado a la compatibilidad con otros<br />

<strong>en</strong>tornos (es capaz de cargar esc<strong>en</strong>as g<strong>en</strong>eradas <strong>en</strong> difer<strong>en</strong>tes tipos de sistemas) así como a<br />

la versatilidad con multitud de dispositivos (su estructura de visualización permite adaptar<br />

un mismo grafo de esc<strong>en</strong>a a variadas configuraciones físicas realizando las mínimas<br />

modificaciones).<br />

78


13.7 BILIOGRAFÍA Y RECURSOS<br />

Docum<strong>en</strong>tación:<br />

- Pratdepadua J. J. “Programación <strong>en</strong> <strong>3D</strong> con <strong>Java</strong> <strong>3D</strong>”. Editorial Ra-Ma. 2003.<br />

- Sun Microsystems. <strong>Java</strong> <strong>3D</strong> 1.3 API Docum<strong>en</strong>tation (docum<strong>en</strong>tation does not<br />

include docum<strong>en</strong>tation for utilities).<br />

Disponible <strong>en</strong> http://java.sun.com/products/javamedia/<strong>3D</strong>/forDevelopers/J<strong>3D</strong>_1_3_API/j3dapi/index.html<br />

- Sun Microsystems. <strong>Java</strong> <strong>3D</strong> 1.3 API Specification Guide.<br />

Disponible <strong>en</strong> http://java.sun.com/products/javamedia/<strong>3D</strong>/forDevelopers/J<strong>3D</strong>_1_3_API/j3dguide/index.html<br />

June 2002.<br />

- Sun Microsystems. <strong>Java</strong> <strong>3D</strong> API Tutorial.<br />

Disponible <strong>en</strong> http://java.sun.com/developer/onlineTraining/java3d/index.html<br />

September 2000.<br />

- <strong>Java</strong> <strong>3D</strong> 1.3.2 API Docum<strong>en</strong>tation (include information for utilities).<br />

Disponible <strong>en</strong> http://download.java.net/media/java3d/javadoc/1.3.2/index.html<br />

- <strong>Java</strong> <strong>3D</strong> FAQ.<br />

Disponible <strong>en</strong> http://wiki.java.net/bin/view/<strong>Java</strong>desktop/<strong>Java</strong><strong>3D</strong>FAQ<br />

Ejemplos de código fu<strong>en</strong>te<br />

- <strong>Java</strong> <strong>3D</strong> examples.<br />

http://www.java2s.com/Code/<strong>Java</strong>/<strong>3D</strong>/Catalog<strong>3D</strong>.htm<br />

Foros de debate<br />

- Sun Developer Network. Multimedia and Imaging APIs - <strong>Java</strong> <strong>3D</strong>.<br />

http://forum.java.sun.com/forum.jspa?forumID=21<br />

- java.net Forums. <strong>Java</strong> Desktop Technologies. <strong>Java</strong> <strong>3D</strong>.<br />

http://forums.java.net/jive/forum.jspa?forumID=70<br />

79


Otros sitios de interés<br />

- The <strong>Java</strong> <strong>3D</strong> Home Page<br />

http://java.sun.com/products/java-media/<strong>3D</strong>/<br />

- The <strong>Java</strong> <strong>3D</strong> Graphics Community<br />

http://www.j3d.org/<br />

- The j3d.org Code Repository<br />

http://code.j3d.org/<br />

- <strong>Java</strong> <strong>3D</strong> VRML 97 Loader<br />

https://j3d-vrml97.dev.java.net/<br />

- Project Looking Glass - A Compreh<strong>en</strong>sive Overview of the Technology<br />

Disponible <strong>en</strong> https://lg3d-core.dev.java.net/files/docum<strong>en</strong>ts/1834/30923/LG<strong>3D</strong>-<br />

Overview.pdf<br />

Rev. 0.2 March 14, 2006.<br />

- Getting Started with the Project Looking Glass Developer’s Release<br />

https://lg3d.dev.java.net/lg3d-getting-started.html<br />

- Project Looking Glass Developer’s Guide<br />

https://lg3d.dev.java.net/lg3d-developers-guide.html<br />

- Project Looking Glass Demo Applications<br />

https://lg3d-demo-apps.dev.java.net/<br />

- Project Looking Glass Application Tutorial 1 - An introduction to the lg3d<br />

framework<br />

https://lg3d.dev.java.net/tutorial/tutorial1.html<br />

- Project Looking Glass Application Tutorial 2 – Simple manipulations and user<br />

interactions<br />

https://lg3d.dev.java.net/tutorial/tutorial2.html<br />

- Project Looking Glass Application Tutorial 3 – Complex manipulations and user<br />

interaction<br />

https://lg3d.dev.java.net/tutorial/tutorial3.html<br />

- java.net Forums – Project Looking Glass <strong>3D</strong><br />

http://forums.java.net/jive/forum.jspa?forumID=80<br />

80

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!