Java 3D

La interacci�n y la animaci�n se especifican con objetos Behavior. La clase Behavior es una subclase abstracta que proporciona el mecanismo para incluir c�digo que modifique el escenario gr�fico. La clase Behavior, y sus descendientes, son enlaces a c�digo del usuario que proporciona las modificaciones para los gr�ficos y los sonidos del universo virtual.

El prop�sito del objeto Behavior en un escenario gr�fico es modificar el propio escenario gr�fico, o los objetos que hay dentro de �l, en respuesta a algunos est�mulos. Un est�mulo puede ser una pulsaci�n de tecla, un movimiento del rat�n, la colisi�n de objetos, el paso del tiempo, alg�n otro evento, o una combinaci�n de estos. Los cambios producidos incluyen la adicci�n de objetos al escenario gr�fico, la eliminaci�n de objetos, cambio de atributos de los objetos del escenario gr�fico, reordenaci�n de los objetos del escenario gr�fico, o una combinaci�n de estos. Las posibilidades s�lo est�n limitadas por las capacidades de los objetos del escenarios gr�fico.

.�Aplicaciones de Behavior

Como un comportamiento (Behavior) es un enlace entre un est�mulo y una acci�n, si consideramos todas las combinaciones posibles entre est�mulos y acciones podremos obtener todas las aplicaciones de los objetos Behavior. La siguiente tabla muestra algunas de las posibilidades de Behavior, listando los posibles est�mulos hacia abajo, y los posibles cambios hacia la derecha.

La tabla no lista todas las combinaciones posibles, s�lo las m�s simples (un est�mulo resulta en un cambio). Algunas combinaciones de est�mulos y cambios s�lo tienen sentido en un entorno espec�fico; estas se listan como "espec�ficas de la aplicaci�n".

Est�mulo Objeto del cambio

�

(raz�n para el cambio) TransformGroup
(los objetos visuales cambian la orientaci�n o la localizaci�n)
Geometry
(los objetos visuales cambian la forma o el color)
Scene Graph
(a�adir, eliminar o intercambiar objetos)
View
(cambiar la localizaci�n o direcci�n de la vista)
usuario interacci�n espec�fico de la aplicaci�n espec�fico de la aplicaci�n navegaci�n
colisiones Los objetos visuales cambian su orientaci�n o posici�n Los objetos visuales cambian su apariencia con la colisi�n Los objetos visuales desaparecen con la colisi�n La vista cambia con la colisi�n
tiempo animaci�n animaci�n animaci�n animaci�n
Posici�n de la Vista cartelera nivel de detalles (LOD) espec�fico de la aplicaci�n espec�fico de la aplicaci�n

La cosas naturales, como los �rboles, utilizan una tremenda cantidad de geometr�a para representar de forma segura todas la estructura de ramas, hojas y tronco. Una alternativa es usar un pol�gono texturado en lugar de la geometr�a. Esta t�cnica algunas veces es referida como la aproximaci�n cartelera. Esto es cierto especialmente cuando se usa un comportamiento para orientar autom�ticamente el pol�gono texturado hacia el espectador para que s�lo se vea el frente de la superficie texturada. Este comportamiento de orientaci�n se llama comportamiento cartelera.

Esta aproximaci�n es efectiva cuando el objeto a representar por la textura est� lejano para que las partes individuales del objeto visual no sean f�cilmente distinguibles. Para el ejemplo del �rbol, si el espectador est� tan alejado que las ramas son dificiles de distinguir, no merece la pena gastar recursos de memoria y de c�lculo para representar todas las hojas del �rbol. Esta t�cnica est� recomendada para cualquier aplicaci�n que requiera visualizar objetos complejos en la distancia. Sin embargo, si el espectador puede aproximarse a la cartelera, a cierta distancia el grado de profundidad del pol�gono textura podr�a ser detectado por el espectador.

El comportamiento de nivel de detalle (LOD) tiene una aplicaci�n relacionada. Con LOD, los objetos visualmente complejos son representados por m�ltiples objetos visuales variando los niveles de detales (de ah� su nombre). La representaci�n del objeto visual con menor nivel de detalle se usa cuando el espectador est� lejos. La representaci�n con m�s nivel de detalle se usa cuando el espectador est� muy cerca. El comportamiento LOD cambia autom�ticamente entre las representaci�n del objeto bas�ndose en la distancia al espectador.

Los comportamientos de cartelera y de nivel de detalle corresponden a clases extendidas desde Behavior que implementan estas aplicaciones comunes. Son posibles otros comportamientos especilizados y varios de ellos se pueden ver en la Figura 4-1. Por ejemplo, hay varias clases MouseBehavior que manipulan una transformaci�n en respuesta a movimientos del rat�n. Normalmente la transformaci�n de la vista se cambia por el comportamiento del rat�n para cambiar la vista en respuesta a una acci�n del rat�n.

Observa tambi�n como los comportamientos pueden encadenarse. Por ejemplo, los movimientos del rat�n o las pulsaciones de teclas pueden usarse para cambiar la vista. En respuesta al movimiento de la vista, podr�an tener lugar otros comportamientos como la cartelera, o el nivel de detalles. Afortunadamente, cada comportamiento se especifica de forma separada.

Animaci�n contra Interacci�n

Como la distinci�n entre animaci�n e interacci�n usada en este tutorial est� bastante bien, aqu� hay un ejemplo para clarificar esta distinci�n. Si un usuario navega en un programa donde se proporciona un comportamiento, la vista se mover� en respuesta a eventos del teclado y/o rat�n. El movimiento de la plataforma de la vista es una interacci�n porque es el resultado directo de una acci�n del usuario. Sin embargo, otras cosas podr�an cambiar como resultado del movimiento de la plataforma de la vista, (por ejemplo, comportamientos de cartelera o LOD). Los cambios causados como resultado del movimiento de la plataforma de vista son indirectamente causados por el usuario y por lo tanto son animaciones.

.�Introducci�n a la clases Behavior

La Figura 4-1 muesta especializaciones de la clase Behavior creadas en el API de Java 3D. Tambi�n son posibles las clases especializadas de Behavior definidas por el usuarios y est�n s�lo limitadas por la imaginaci�n del programador. Este m�dulo del tutorial cubre cada una de las clases de la Figura 4-1. Este cap�tulo cubre las clases sombreadas, el siguiente cap�tulo cubre el resto.

.�Behavior B�sico

Como se explic� en la secci�n anterior, las clases Behavior se usan en muchas aplicaciones Java 3D y de muchas formas. Es importante entender las consideraciones de funcionamiento y programaci�n de estas clases. Esta secci�n explica la clase Behavior, ofrece una receta para programar clases de comportamientos personalizadas, y muestra una aplicaci�n de ejemplo que usa una clase Behavior.

Figura 4-1, Árbol de Subclases de Behavior

.�Escribir una Clase Behavior

Esta secci�n explica c�mo escribir una clase de comportamiento personalizado. Ya sabemos que hay clases de comportamiento que podemos usar. Sin embargo, al ver c�mo crear una clase Behavior aprenderemos como funciona. Por eso, incluso si no planeas usar una clase comportamiento, podr�as querer leer esta secci�n. Las clases escritas en esta secci�n se usan en la siguiente.

Mec�nismo de Behaviors

Una clase de comportamiento personalizado implementa los m�todos de inicializaci�n y processStimulus de la clase abstracta Behavior. Por supuesto, la clase de comportamiento personalizado, tambi�n tiene al menos un constructor y tambi�n podr�a tener otros m�todos.

La mayor�a de los comportamientos actuar�n sobre un objeto del escenario gr�fico para afectar al comportamiento. El objeto sobre el que act�a un comportamiento es referido como el objeto del cambio. Es a trav�s de este objeto, u objetos, que el comportamiento afecta al mundo virtual. Aunque es posible tener un comportamiento que no tenga un objeto del cambio, la mayor�a lo tienen.

El comportamiento necesita una referencia a su objeto(s) de cambio para poder realizar los cambios de comportamiento. Se puede usar el constructor para seleccionar la referencia del objeto de cambio. Si no se hace, otro m�todo de la clase de comportamiento personalizado debe almacenar esta informaci�n. En cualquier caso, la referencia se hace en el momento en que se construye el escenario gr�fico, que es el primer c�lculo de comportamiento.

El m�todo de inicializaci�n se invoca cuando el escenario gr�fico que contiene la clase de comportamiento se vuelve vivo. Este m�todo de iniciaci�n es responsable de seleccionar el evento de disparo inicial para el comportamiento y seleccionar la condici�n inicial de las variables de estado del comportamiento. El disparo se especifica como un objeto WakeupCondition, o una combinaci�n de objetos WakeupCondition.

El m�todo processStimulus se invoca cuando ocurre el evento de disparo especificado para el comportamiento. Este m�todo es responsable de responder al evento. Como se pueden codificar muchos eventos en un s�lo objeto WakeupCondition (por ejemplo, varias acciones de teclado podr�an est�r codificados en un WakeupOnAWTEvent), esto incluye la descodificaci�n del evento. El m�todo processStimulus responde al est�mulo, normalmente modificando el objeto de cambio, y, cuando es apropiado, reseteando el disparo. Abajo tenemos una receta para escribir una clase de comportamiento personalizada:

  1. escribir (al menos uno) constructor
    almacenar una referencia al objeto del cambio.
  2. sobreescribir public void initialization()
    especificar el criterio de diparo inicial
  3. sobreescribir public void processStimulus()
    decodificar la condici�n de disparo
    actuar de acuerdo a la condici�n de disparo
    resetar el disparo si es apropiado

La receta anterior muestra los pasos b�sicos para crear una clase de comportamiento personalizada. Los comportamientos complejos podr�an requerir m�s programaci�n que la descrita en la receta. El uso de un objeto Behavior es otro problema y se discute en una secci�n posterior. Pero antes, usaremos esta receta para crear el siguiente ejemplo de clase Behavior.

Ejemplo de Clase Behavior Personalizada: SimpleBehavior

Para el ejemplo de comportamiento personalizado, la clase implementar� un comportamiento sencillo para hacer que algo gire en respuesta a pulsaciones del teclado.

Para crear dicha clase, todo lo que necesitamos es un referencia a un TransformGroup (el objeto del cambio para esta clase), y una variable con el �ngulo. En respuesta a una pulsaci�n de tecla la variable del �ngulo se modifica, y el �ngulo de la fuente del TransformGroup se selecciona al valor del �ngulo. Como el comportamiento actuar� sobre un objeto TransformGroup, que est� siendo rotado no es un problema.

Para crear esta clase no se necesita nada m�s que los tres ingredientes esenciales que se listar�n en la receta: un constructor, el m�todo initialization() y el m�todo processStimulus. El constructor almacenar� la referencia al objeto TransformGroup. El m�todo initialization() selecciona el disparo inicial a WakeOnAWTEvent, y el �ngulo de rotaci�n a cero. Como se mencion� antes, el est�mulo para un comportamiento se especifica como un objeto WakeupCondition.

C�mo s�lo hay una posible condici�n de disparo, el m�todo processStimulus no la descodifica. Es posible posteriormente descodificar el evento de pulsaci�n de tecla para determinar qu� tecla, o combinaci�n de teclas, se puls�.

El m�todo processStimulus siempre incrementa la variable del �ngulo, entonces lo usa para ajustar el objeto TransformGroup. El �ltimo trabajo de este m�todo es resetear el disparo. En este ejemplo, el disparo siempre se resetea a una pulsaci�n de tecla. Los comportamientos pueden cambiar el evento de disparo en el tiempo para cambiar comportamientos (otra raz�n para tener que descodificar el evento de disparo), o no seleccionar otro disparo para comportamientos de una s�la vez.

El Fragmento de C�digo 4-1 presenta la clase SimpleBehavior (SimpleBehaviorApp.java) que es una implementaci�n de la clase de comportamiento personalizada. Las sentencias import son necesarias para esta clase. java.awt.event es necesaria para la interacci�n con el teclado. java.util.eumeration es necesaria para decodificar el WakeupCondition; y por lo tanto necesaria virtualmente para casi cualquier clase de comportamiento personalizado. Tambi�n son necesarias las sentencias import normales del API Java 3D.

Fragmento de C�digo 4-1, Clase SimpleBehavior de SimpleBehaviorApp.java
1.     import java.awt.event.*;
2.     import java.util.Enumeration;
3.
4.     // SimpleBehaviorApp renders a single, rotated cube.
5.
6.     public class SimpleBehaviorApp extends Applet {
7.
8.         public class SimpleBehavior extends Behavior{
9.
10.       private TransformGroup targetTG;
11.       private Transform3D rotation = new Transform3D();
12.       private double angle = 0.0;
13.
14.       // create SimpleBehavior - set TG object of change
15.       SimpleBehavior(TransformGroup targetTG){
16.           this.targetTG = targetTG;
17.       }
18.
19.       // initialize the Behavior
20.       // set initial wakeup condition
21.       // called when behavior becomes live
22.       public void initialize(){
23.           // set initial wakeup condition
24.          this.wakeupOn(new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED));
25.       }
26.
27.       // called by Java 3D when appropriate stimulus occurs
28.       public void processStimulus(Enumeration criteria){
29.           // do what is necessary in response to stimulus
30.           angle += 0.1;
31.           rotation.rotY(angle);
32.           targetTG.setTransform(rotation);
33.           this.wakeupOn(new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED));
34.       }
35.
36.   } // end of class SimpleBehavior

Esta clase s�lo demuestra la programaci�n b�sica necesaria para este comportamiento sencillo. Se pude mejorar, por ejemplo, se podr�an seleccionar el �ngulo y/o el eje de rotaci�n por m�todos de la clase. La clase podr�a adem�s personalizarse con un m�todo para seleccionar una tecla espec�fica, o conjunto de teclas, a las que responder.

Otra mejora definitiva de la clase podr�a prevenir la sobrecarga de la variable del �ngulo, en la clase actual, el valor para el �ngulo podr�a crecer sin l�mites incluso aunque los valores de 0.0 a 2P sean todo lo necesario. Aunque es improbable, es posible que esta variable genere una sobrecarga y cause una excepci�n en tiempo de ejecuci�n.

Riesgos de Programaci�n al Escribir Clases Behavior

En los tres pasos de la receta para crear una clase behavior personalizada, los dos errores m�s comunes son:

  • olvidarse de seleccionar y resetear el disparo del comportamiento, y
  • no volver de los m�todos de la clase Behavior.

Obviamente, si no se selecciona el disparo inicial en el m�todo initialization(), el comportamiento nunca ser� invocado. Un poco menos obvio es que el disparo debe seleccionarse de nuevo en el m�todo processStimulus() si se desea un comportamiento repetido.

Como estos dos m�todos (initialization() y processStimulus()) son llamados por el sistema Java 3D, deben volver para permitir que contin�e el renderizado. Por ejemplo, si se desea un ejemplo peonza, el �ngulo y el TransformGroup necesitan actualizarse peri�dicamente. Si nuestro comportamiento implementa este comportamiento sin deshilar un thread, no se renderizar� nada m�s. Tambi�n, hay una forma mucho mejor para conseguir este tipo de comportamiento.

.�Usar una Clase Behavior

Encontrar o escribir la clase behavior apropiada para nuestra aplicaci�n es el principio para escribir un programa Java 3D interactivo. Esta secci�n cubre los problemas de programaci�n en la adicci�n de objetos behavior a los programas.

El primer paso implica el asegurarnos de que el escenario gr�fico hace provisiones para el behavior. Por ejemplo, para usar la clase SimpleBehavior de la secci�n anterior debe haber un TransformGroup en el escenario gr�fico sobre el objeto a rotar. Muchos comportamientos s�lo necesitan un �nico objeto TransformGroup; sin embargo, los requerimientos de un escenario gr�fico para una comportamiento dependen de la aplicaci�n y del propio comportamiento y podr�an ser m�s complejos.

Habiendo establecido el soporte para un comportamiento, se debe a�adir un ejemplar de la clase al escenario gr�fico. Sin ser una parte de un escenario gr�fico vivo, no hay forma de poder inicializar un comportamiento. De hecho, un objeto behavior que no es parte de un escenario gr�fico se convertir� en basura y ser� eliminado en la pr�xima recolecci�n.

El �ltimo paso para a�adir comportamiento es proporcionar unos l�mites para el comportamiento. Para mejorar la eficiencia, Java 3D usa los l�mites para realizar el recorte de ejecuci�n. El comportamiento s�lo est� activo cuando sus l�mites interseccionan un volumen de activaci�n de la ViewPlatform. Solo los comportamientos activos son elegibles para recibir est�mulos. De esta forma, los est�mulos pueden ser ignorados por algunos comportamientos. El programador tiene control sobre el recorte de ejecuci�n a trav�s de la selecci�n de los l�mites del comportamiento.

La siguiente lista muestra una receta con los pasos para usar un objeto behavior.

  1. preparar el escenario gr�fico (a�adiendo un TransformGroup u otros objetos necesarios)
  2. insertar el objeto behavior en el escenario gr�fico, referenciando el objeto del cambio
  3. especificar los l�mites (o SchedulingBoundingLeaf)
  4. seleccionar la capacidades de escritura (y lectura) del objeto fuente (seg�n sea apropiado)

El Fragmento de C�digo 4-2 es un extracto del programa de ejemplo SimpleBehaviorApp.java y es la continuaci�n del Fragmento de C�digo 4-1

Fragmento de C�digo 4-2, El m�todo CreateSceneGraph en SimpleBehaviorApp.java
37.     public BranchGroup createSceneGraph() {
38.         // Create the root of the branch graph
39.         BranchGroup objRoot = new BranchGroup();
40.
41.        TransformGroup objRotate = new TransformGroup();
42.        objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
43. 
44.        objRoot.addChild(objRotate);
45.        objRotate.addChild(new ColorCube(0.4));
46.
47.        SimpleBehavior myRotationBehavior = new SimpleBehavior(objRotate);
48.        myRotationBehavior.setSchedulingBounds(new BoundingSphere());
49.        objRoot.addChild(myRotationBehavior);
50.
51.        // Let Java 3D perform optimizations on this scene graph.
52.        objRoot.compile();
53.
54.   return objRoot;
55.   } // end of CreateSceneGraph method of SimpleBehaviorApp

Se necesita muy poco c�digo para completar el programa de los fragmentos de c�digo 4-1 y 4-2. El programa completo est� en: SimpleBehaviorApp.java. La aplicaci�n completa renderiza un objeto ColorCube en una escena est�tica hasta que se pulsa una tecla. En respuesta a la pulsaci�n de la tecla, el ColorCube rota 0,1 radianes (unos 6�). La Figura 4-4 muestra el diagrama del escenario gr�fico para la rama de contenido gr�fico de esta aplicaci�n.

Figura 4-4, Diagrama del Escenario Gráfico de la Rama de Contenido Gráfico de SimpleBehaviorApp.java.

El diagrama anterior muestra claramente la relaci�n entre el objeto behavior y el objeto del cambio, el objeto TransformGroup. El ejemplo rota un ColorCube, pero la clase Behavior no est� limitada a esto. Puede rotar cualquier objeto visual, o porci�n de una escena gr�fica que sea hija de un objeto TransformGroup.

Este sencillo ejemplo no est� pensado para demostrar todas las posibilidades de los comportamientos; es s�lo un punto de arranque en la exploraci�n de los comportamientos. En secciones posteriores veremos el API de la clase Behavior.

Riesgos de Programaci�n al usar Objetos Behavior

En la receta de tres pasos para usar clases Behavior, los dos errores m�s comunes son:

  • no especificar (correctamente) los l�mites, y
  • no a�adir un behavior al escenario gr�fico.

La intersecci�n de los l�mites de un behavior con el volumen de activaci�n de una vista determina si el evento Java 3D considera el disparo del est�mulo para el behavior. Java 3D no avisar� si no ponemos los l�mites -- el comportamiento nunca se disparar�. Tambi�n debemos mantener los l�mites de cada objeto behavior tan peque�os como sea posible para una mejora global del rendimiento.

Como se mencion� arriba, un objeto behavior que no forma parte de un escenario gr�fico ser� considerado basura y ser� eliminado en el siguiente ciclo del recolector de basura. Esto, tambi�n suceder� sin errores ni avisos.

�D�nde Deber�a ir un Objeto Behavior en un Escenario Gr�fico?

Los comportamientos pueden situarse en cualquier lugar del escenario gr�fico. Los problemas para esta localizaci�n son: 1) el efecto de los l�mites, y 2) el mantenimiento del c�digo.

El objeto bounds referenciado por un objeto behavior est� sujeto al sistema local de coordenadas creado en SimpleBehaviorApp, el objeto SimpleBehavior y ColorCube no est�n sujetos al mismo sistema local de coordenadas. En la aplicaci�n de ejemplo esto no crea un problema. El objeto TransformGroup del ejemplo s�lo rota el ColorCube para que los l�mites del objeto myRotationBehavior siempre encierren el objeto ColorCube permitiendo la interacci�n con el ColorCube cuando es visible.

Sin embargo, si el objeto TransformGroup se usara para trasladar el objeto ColorCube, ser�a posible moverlo fuera de la vista. Como el objeto bounds permanece con el objeto behavior en la escena, el usuario podr�a continuar moviendo el objeto. Mientras que el volumen de activaci�n de una vista interesecciona los l�mites del comportamiento, �ste est� activo.

Siendo posible interactuar con un objeto visual que no est� en la vista no est� mal (si esto es lo que queremos). El problema viene si la vista a cambiar dicho volumen de activaci�n no intersecciona con l�mites del comportamiento, incluso para incluir el objeto visual, el comportamiento est� inactivo. Por eso el objeto visual con el que queremos interactuar podr�a estar a nuestra vista pero inactivo. La mayor�a de los usuarios consideran esto un problema (incluso si es intencional).

Hay dos soluciones a este problema. Una es cambiar el escenario gr�fico para mantener los l�mites del comportamiento con el objeto visual. Esto se consigue f�cilmente como se demuestra en la Figura 4-5. La soluci�n alternativa usa un objeto BoundingLeaf para los l�mites.

Figura 4-5, Una alternativa a la situación del escenario gráfico para el objeto Behavior en SimpleBehaviorApp.

Recomendaciones de Dise�o para la Clase Behavior

El mecanismo de escritura de un comportamiento personalizado es sencillo. Sin embargo, deber�amos tener en cuentra que un comportamiento pobremente escrito puede degradar el rendimiento del renderizado. Mientras que hay otras consideraciones en la escritura de un comportamiento, hay dos cosas que debemos evitar: quemar la memoria y condiciones de disparo innecesarios.

'Quemar la Memoria' es el t�rmino para la creacci�n de objetos innecesarios en Java. La quema de memoria excesiva causar� la recolecci�n de basura. Las pausas ocasionales en el renderizado son t�picas de la quema de memoria ya que durante la recolecci�n de basura, el renderizado se parar�.

Los m�todos de la clase Behavior frecuentemente son responsables de crear problemas de quema de memoria. Por ejemplo, en el Fragmento de C�digo 4-1 el processStimulus usa un 'new' en la invocaci�n de wakeupOn (l�nea 24). Esto causa que se cree un nuevo objeto cada vez que se invoca a este m�todo. El objeto se convierte en basura cada vez que se dispara el comportamiento.

Los problemas potenciales de la quema de memoria son f�ciles de indentificar y evitar. Buscamos cualquier uso de 'new' en el c�digo para encontrar la fuente de estos tipos de problemas. Siempre que sea posible, reemplazaremos el uso de 'new' con c�digo que reutilice un objeto.

.�API de la Clase Behavior

Esta secci�n presenta los detalles del API de la clase Behavior. La Figura 4-6 muestra el �rbol de clases del API Java 3D que incluye la clase Behavior. Como clase abstracta, la clase Behavior debe ser extendida antes de poder ejemplarizar un objeto behavior. Por supuesto, podemos escribir nuestras clases behavior personalizadas. Adem�s, hay muchas clases behavior existentes en los paquetes de utilidad de Java 3D. Como una extensi�n de la clase Leaf, los ejemplares que extienden Behavior pueden ser hijos de un group en un escenario gr�fico.

Figura 4-6, Árbol de Clases de Behavior

Anteriormente hemos visto los m�todos processStimulus() e initialize(). Ahora vamos a ver el resto de los m�todos de la clase Behavior.

El m�todo wakeupOn() se usa en los m�todos initialize() y processStimulus() para seleccionar el disparo para el comportamiento. El par�metro de este m�todo es un objeto WakeupCondition. En secciones posteriores veremos WakeupCondition, y las clases relacionadas.

El m�todo postId() permite a un comportamiento comunicarse con otro m�todo. Una de las condiciones de disparo es WakeupOnBehaviorPost. Los objetos Behavior pueden estar coordinados para crear colaboraciones complejas usando el m�todo postId() en conjunci�n con condiciones WakeupOnBehaviorPost apropiadas.

El m�todo setEnable() proporciona la forma de desactivar un comportamiento incluso si los l�mites est�n activos. El valor por defecto es true (es decir, el objeto comportamiento est� activado).

Un objeto behavior est� activo s�lo cuando sus l�mites intereseccionan con el volumen de activaci�n de un View. Como es posible tener varias vistas en un universo virtual, un comportamiento puede hacerse activo por m�s de una vista.

El m�todo getView() es �til con comportamientos que tratan con informaci�n por-vista (por ejemplo, Billboard, LOD) y con comportamientos en general para programar en el tiempo. Este m�todo devuelve una referencia al objeto View primario asociado actualmente con el comportamiento. No existe el correspondiente m�todo setView. La vista "primaria" se define como la primera vista adjunta a un ViewPlatform vivo, si hay m�s de una vista activa. Por eso, por ejemplo, los comportamientos Billboard podr�an orientar hacia adelante esta vista primaria, en caso de varias vistas activas dentro del mismo escenario gr�fico.

Sumario de M�todos de la Clase Behavior

Behavior es una clase abstracta que contiene el marco de trabajo para los componentes de comportamiento en Java 3D.

View getView()

Devuelve la vista primaria asociada con este comportamiento.

void initialize()

Inicializa este comportamiento.

void postId(int postId)

Postea la identidad especificada.

void processStimulus(java.util.Enumeration criteria)

Procesa un est�mulo para este comportamiento.

void setEnable(boolean state)

Activa o desactiva este comportamiento.

void setSchedulingBoundingLeaf(BoundingLeaf region)

Selecciona la regi�n de l�mites del comportamiento con los l�mites del leaf especificado.

void setSchedulingBounds(Bounds region)

Selecciona la regi�n de l�mites del comportamiento con los l�mites especificados.

void wakeupOn(WakeupCondition criteria)

Define este criterio de disparo del comportamiento.

API ViewPlatform

Los Comportamientos est�n activos (dispuestos para ser disparados) s�lo cuando sus l�mites (o BoundingLeaf) intersecciona con el volumen de activaci�n de una ViewPlatform.

Lista Parcial de M�todos de la Clase ViewPlatform

Estos m�todos de la clase ViewPlatform obtienen y seleccionan el radio del volumen de activaci�n (esfera). El valor por defecto es 62.

float getActivationRadius()

Obtiene el radio de activaci�n del ViewPlatform.

void setActivationRadius(float activationRadius)

Selecciona el radio de activaci�n del ViewPlatform que define un volumen de activaci�n alrededor de la plataforma.

.�Condiciones de Disparo: C�mo se Disparan los Comportamientos

Los comportamientos activados se disparan por la ocurrencia de uno o m�s estimulos especificados. El estimulo de disparo para un comportamiento se especifica usando descendientes de la clase WakeupCondition.

La clase abstracta, WakeupCondition, es la base para todas las clases de disparo del API Java 3D. Cinco clases extienden WakeupCondition, una es la clase abstracta WakeupCriterion, las otras cuatro permiten la composici�n de m�ltiples condiciones de disparo en una �nica condici�n de disparo. La Figura 4-7 muestra el �rbol de clases.

Figura 4-7, el Árbol de Clases para WakeupCondition y clases relacionadas.

Una condici�n de disparo para un objeto behavior se puede especificar como un criterio de disparo espec�fico o como una combinaci�n de criterios usando clases compuestas. Las siguientes secciones describen WakeupCondition y sus subclases.

.�WakeupCondition

La clase WakeupCondition proporciona dos m�todos. El primer m�todo, allElements, devuelve una lista enumeration de todos los criterios de disparo para el objeto WakeupCondition. El otro m�todo, triggeredElements, enumera qu� criterio ha causado que el comportamiento sea disparado. Este m�todo podr�a ser muy �til en el m�todo processStimulus de un objeto Behavior.

Sumario de M�todos de WakeupCondition

La clase abstracta WakeupCondition es la base para todas las clases wakeup. Proporciona los siguientes m�todos:

Enumeration allElements()

Devuelve una enumeraci�n con todos los objetos WakeupCriterion en esta condici�n.

Enumeration triggeredElements()

Devuelve una enumeraci�n de todos los objetos WakeupCriterion disparados en esta condici�n.

.�WakeupCriterion

WakeupCriterion es una clase abstracta para todas las clases wakeup. WakeupCriterion s�lo proporciona un m�todo: hasTriggered. Probablemente no necesitaremos usar este m�todo ya que el m�todo triggeredElements de WakeupCondition realiza esta operaci�n por nosotros.

Sumario de M�todos de WakeupCriterion

boolean hasTriggered()

Devuelve true si el criterio dispar� el comportamiento.

.�Clases WakeupCriterion Espec�ficas

La Tabla 4-2 presenta las 14 clases WakeupCriterion espec�ficas. Estas clases se usan para especificar las condiciones de disparo de los objetos behavior. Los ejemplares de estas clases se usan individualmente o en combinaciones.

Clase Criterio Disparo
WakeupOnActivation en la primera detecci�n de una intersecci�n del volumen de activaci�n de un ViewPlatform con la regi�n l�mite del objeto.
WakeupOnAWTEvent cuando ocurre un evento AWT espec�fico
WakeupOnBehaviorPost cuando un objeto behavior env�a un evento espec�fico
WakeupOnCollisionEntry en la primera detecci�n de colisi�n del objeto especificaco con otro objeto del escenario gr�fico.
WakeupOnCollisionExit cuando el objeto especifico no colisiona con ning�n otro objeto del escenario gr�fico.
WakeupOnCollisionMovement cuando el objeto especificado se mueve mientras colisiona con otro objeto del escenario gr�fico
WakeupOnDeactivation cuando el volumen de activaci�n de un ViewPlatform deja de intereseccionar con los l�mites del objeto
WakeupOnElapsedFrames cuando ha pasado un n�mero determinado de frames
WakeupOnElapsedTime cuando ha pasado un n�mero de segundos determinado
WakeupOnSensorEntry en la primera detecci�n de cualquier sensor que intersecciona con los l�mites especificados
WakeupOnSensorExit cuando un sensor que interseccionava con los l�mites del objeto deja de interseccionar con los l�mites especificados
WakeupOnTransformChange cuando cambia la transformaci�n dentro de un TransformGroup especificado
WakeupOnViewPlatformEntry en la primera detecci�n de intersecci�n del volumen de activaci�n de un ViewPlatform con los l�mites especificados
WakeupOnViewPlatformExit cuando el volumen de activaci�n de una vista deja de intereseccionar con los l�mites especificados

Comentarios Generales sobre WakeupCriterion

Varias clases WakeupCriterion se disparan con la "primera detecci�n" de un evento. Lo que significa que el criterio s�lo se disparar� una vez por cada evento. Por ejemplo, un objeto WakeupOnActivation disparar� la intersecci�n del volumen de activaci�n de un ViewPlatform y la regi�n de l�mites del objeto behavior asociado. Mientras que la intersecci�n persista, el WakeupCondition no se disparar� de nuevo. Lo mismo es cierto para cualquier marco secuencial. Hasta que Java 3D detecte que los volumenes no intereseccionan m�s no se podr� disparar de nuevo el WakeupCondition.

Hay varias parejas de clases WakeupCriterion correspondientes (Entry/Exit o Activation/Deactivation). Este criterio s�lo se disparar� en elternancias estrictas empezando con los criterios de Entry o Activation.

WakeupOnActivation

Es posible que una regi�n de l�mites interseccione con el volumen de activaci�n de un ViewPlatform tan brevemente que no sea detectada. Consecuentemente, no se disparar� ninguna condici�n de Activation o Deactivation. Bajo estas circunstancias, el comportamiento no se activa nunca.

Sumario de Constructores de WakeupOnActivation

Extiende: WakeupCriterion

Esta clase especifica la condici�n de disparo en la primera detecci�n de una interesecci�n del volumen de activaci�n de un ViewPlatform con la regi�n l�mite de su objeto. WakeupOnActivation est� emparejado con WakeupOnDeactivation que veremos m�s adelante.

WakeupOnActivation()

Construye un nuevo criterio WakeupOnActivation.

WakeupOnAWTEvent

Varias de las clases WakeupCriterion tienen constructores y m�todos dependientes del disparo. Por ejemplo, WakeupOnAWTEvent tiene dos constructores y un m�todo. Los constructores permiten la especificaci�n de eventos AWT usando constantes de clases AWT. El m�todo devuelve el array de eventos AWT consecutivos que causaron el disparo.

Sumario de Constructores de WakeupOnAWTEvent

Extiende: WakeupCriterion

Esta clase especifica el disparo de un Behavior cuando ocurre un evento AWT espec�fico.

WakeupOnAWTEvent(int AWTId)

Construye un nuevo objeto WakeupOnAWTEvent, donde AWTId es uno de KeyEvent.KEY_TYPED, KeyEvent.KEY_PRESSED, KeyEvent.KEY_RELEASED, MouseEvent.MOUSE_CLICKED, MouseEvent.MOUSE_PRESSED, MouseEvent.MOUSE_RELEASED, MouseEvent.MOUSE_MOVED, MouseEvent.MOUSE_DRAGGED, o uno de los otros muchos valores de eventos.

WakeupOnAWTEvent(long eventMask)

Construye un nuevo objeto WakeupOnAWTEvent usando valores ORed EVENT_MASK. Estos valores son: KEY_EVENT_MASK, MOUSE_EVENT_MASK, MOUSE_MOTION_EVENT_MASK, u otros valores.

Sumario de m�todos de WakeupOnAWTEvent

AWTEvent[] getAWTEvent()

Recupera el array de eventos AWT consecutivos que ocasionaron el disparo.

WakeupOnBehaviorPost

La condici�n WakeupOnBehaviorPost junto con el m�todo postID de la clase Behavior proporcionan un mecanismo a trav�s del cual se pueden coordinar los comportamientos. Un objeto Behavior puede postear un valor entero ID particular. Otro comportamiento puede especificar su condici�n de disparo, usando un WakeupOnBehaviorPost, c�mo enviando un ID particular desde un objeto Behavior espec�fico. Esto permite la creacci�n de objetos Behavior parentales como que uno abra una puerta y otro diferente la cierre. Para esta materia, incluso se pueden formular comportamientos m�s complejos usando comportamientos y coordinaci�n posterior.

Sumario de Constructores de WakeupOnBehaviorPost

Extiende: WakeupCriterion

Esta clase especifica un disparo de un objeto Behavior cuando un comportamiento espec�fico postea un evento espec�fico.

WakeupOnBehaviorPost(Behavior behavior, int postId)

Construye un nuevo criterio WakeupOnBehaviorPost.

Como un WakeupCondition puede estar compuesto por varios objetos WakeupCriterion, incluyendo m�s de un WakeupOnBehaviorPost, los m�todos para determinar la especificidad son necesarios para interpretar un evento de disparo.

Sumario de M�todos de WakeupOnBehaviorPost

Behavior getBehavior()

Devuelve el comportamiento especificado en este constructor.

int getPostId()

Recupera el posId especificado en el WakeupCriterion.

Behavior getTriggeringBehavior()

Devuelve el comportamiento que disparo este evento.

int getTriggeringPostId()

Devuelve el postId que caus� el disparo del comportamiento.

El Fragmento de C�digo 4-3 y el Fragmento de C�digo 4-4 muestran un c�digo parcial para un programa de ejemplo que usa posteo de comportamientos para coordinar comportamientos. El ejemplo abre y cierra una puerta. El c�digo incluye una clase: OpenBehavior, y el c�digo que crea los dos objetos behavior. El segundo objeto es un ejemplar de CloseBehavior, que es casi un duplicado exacto de OpenBehavior. En CloseBehavior, la condici�n es compartida en el m�todo initialization (y el comportamiento opuesto completado).

Fragmento de C�digo 4-3, clase OpenBehavior, y un ejemplo de clases de comportamiento coordinadas
1.     public class OpenBehavior extends Behavior{
2.
3.         private TransformGroup targetTG;
4.         private WakeupCriterion pairPostCondition;
5.         private WakeupCriterion AWTEventCondition;
6.
7.         OpenBehavior(TransformGroup targetTG){
8.             this.targetTG = targetTG;
9.             AWTEventCondition = new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED);
10.       }
11.
12.       public void setBehaviorObjectPartner(Behavior behaviorObject){
13.           pairPostCondition = new WakeupOnBehaviorPost(behaviorObject, 1);
14.      }
15.
16.       public void initialize(){
17.           this.wakeupOn(AWTEventCondition);
18.       }
19.
20.       public void processStimulus(Enumeration criteria){
21.           if (AWTEventCondition.hasTriggered()){
22.               // make door open � code excluded
23.               this.wakeupOn(pairPostCondition);
24.               postId(1);
25.          } else {
26.               this.wakeupOn(AWTEventCondition);
27.          }
28.       }
29.
30.   } // end of class OpenBehavior
Fragmento de C�digo 4-4, c�digo para usar las clases OpenBehavior y CloseBehavior
1.     // inside a method to assemble the scene graph ...
2.
3.         // create the relevant objects
4.         TransformGroup doorTG = new TransformGroup();
5.         OpenBehavior openObject = new OpenBehavior(doorTG);
6.         CloseBehavior closeObject = new CloseBehavior(doorTG);
7.
8.         //prepare the behavior objects
9.         openObject.setBehaviorObjectPartner(closeObject);
10.       closeObject.setBehaviorObjectPartner(openObject);
11.
12.       // set scheduling bounds for behavior objects � code excluded
13.
14.       // assemble scene graph � code excluded
15.

Los objetos de estas dos clases responder�n en estricta alternancia a los eventos de pulsaci�n de teclas. El comportamiento OpenBehavior se disparar� en respuesta a la primera pulsaci�n. En su respuesta, se�ala el comportamiento CloseBehavior y selecciona su condici�n de disparo para que sea una se�al para este objeto. El objeto CloseBehavior selecciona su condici�n de disparo para que sea una pulsaci�n de tecla en respuesta a la se�al desde el objeto OpenBehavior. Puedes encontrar un programa de ejemplo en DoorApp.java.

La siguiente pulsaci�n de tecla dispara el objeto CloseBehavior. Este objeto ahora realiza la misma funci�n que acaba de realizar el objeto OpenBehavior: env�a una se�al y resetea su propia condici�n de disparo. El objeto CloseBehavior cierra la puerta en respuesta a la pulsaci�n de tecla. De vuelta a las condiciones iniciales, la siguiente pulsaci�n empezar� de nuevo todo el proceso.

WakeupOnCollisionEntry

Java 3D puede detectar la colisi�n de objetos en el mundo virtual. Hay tres clases WakeupCriterion �tiles para procesar la colisi�n de objetos: WakeupOnCollisionEntry, WakeupOnCollisionMovement, y WakeupOnCollisionExit.

Un Criterio WakeupOnCollisionEntry se disparar� cuando un objeto colisione por primera vez. Luego, el criterio WakeupOnCollisionMovement disparar� (potencialmente varios disparos) mientras dos objetos est�n en colisi�n hay un movimiento relativo entre los objetos. Finalmente, un s�lo WakeupOnCollisionExit se diparar� cuando finalice la colisi�n.

Java 3D s�lo puede manejar una colisi�n por cada objeto a la vez. Una vez que se ha detectado una colisi�n de un objeto, las colisiones con otros objetos no se detectar�n hasta que finalice la primera colisi�n. Tambi�n puede ocurrir que una colisi�n sea tan breve que no sea detectada y por lo tanto no se disparar� ninguna condici�n.

La detecci�n de colisiones es m�s compleja que esta discusi�n sobre las condiciones de disparo. Sin embargo este tutorial no cubre la detecci�n de colisiones en detalle, para esto puedes referirte a la Especificaci�n del API Java 3D.

Sumario de Constructores de WakeupOnCollisionEntry

Extiende: WakeupCriterion

Esta clase especifica un disparo en la primera detecci�n de colisi�n de un objeto especificado con otro objeto en el escenario gr�fico. Tambi�n puedes ver: WakeupOnCollisionMovement, y WakeupOnCollisionExit.

WakeupOnCollisionEntry(Bounds armingBounds)

Construye un nuevo criterio WakeupOnCollisionEntry.

WakeupOnCollisionEntry(Node armingNode)

Construye un nuevo cirterio WakeupOnCollisionEntry.

WakeupOnCollisionEntry(Node armingNode, int speedHint)

Construye un nuevo criterio WakeupOnCollisionEntry, donde speedHint es:

  • USE_BOUNDS - Usa l�mites geom�tircos como una aproximaci�n al c�lculo de colisiones.
  • USE_GEOMETRY - Usa geometr�a en el c�lculo de colisiones.
WakeupOnCollisionEntry(SceneGraphPath armingPath)

Construye un nuevo criterio WakeupOnCollisionEntry con USE_BOUNDS como velocidad de choque.

WakeupOnCollisionEntry(SceneGraphPath armingPath, int speedHint)

Construye un nuevo criterio WakeupOnCollisionEntry, donde speedHint es USE_BOUNDS o USE_GEOMETRY.

WakeupOnCollisionExit

Sumario de Constructores de WakeupOnCollisionExit

Extiende: WakeupCriterion

Esta clase especifica un disparo cuando se termina la colisi�n de un objeto especificado con otro objeto en el escenario gr�fico. Tambi�n puedes ver: WakeupOnCollisionMovement, y WakeupOnCollisionExit.

WakeupOnCollisionExit(Bounds armingBounds)

Construye un nuevo criterio WakeupOnCollisionExit.

WakeupOnCollisionExit(Node armingNode)

Construye un nuevo criterio WakeupOnCollisionExit.

WakeupOnCollisionExit(Node armingNode, int speedHint)

Construye un nuevo criterio WakeupOnCollisionExit, donde speedHint es:

  • USE_BOUNDS - Usa l�mites geom�tircos como una aproximaci�n al c�lculo de colisiones.
  • USE_GEOMETRY - Usa geometr�a en el c�lculo de colisiones.
WakeupOnCollisionExit(SceneGraphPath armingPath)

Construye un nuevo criterio WakeupOnCollisionExit.

WakeupOnCollisionExit(SceneGraphPath armingPath, int speedHint)

Construye un nuevo criterio WakeupOnCollisionExit, donde speedHint es USE_BOUNDS, o USE_GEOMETRY.

Sumario de M�todos de WakeupOnCollisionExit

Bounds getArmingBounds()

Devuelve los l�mites del objeto usado en la especificaci�n de la condici�n de colisi�n.

SceneGraphPath getArmingPath()

Devuelve el path usado en la especificaci�n de la condici�n de colisi�n.

Bounds getTriggeringBounds()

Devuelve el objeto Bounds que caus� la colisi�n.

SceneGraphPath getTriggeringPath()

Devuelve el path que describe el objeto que caus� la colisi�n.

WakeupOnCollisionMovement

Sumario de Constructores de WakeupOnCollisionMovement

Extiende: WakeupCriterion

Esta clase especifica un disparo cuando el objeto especificado se mueve durante la colisi�n con otro objeto en el escenario gr�fico. Tambi�n puedes ver: WakeupOnCollisionEntry, y WakeupOnCollisionExit.

WakeupOnCollisionMovement(Bounds armingBounds)

Construye un nuevo criterio WakeupOnCollisionMovement.

WakeupOnCollisionMovement(Node armingNode)

Construye un nuevo criterio WakeupOnCollisionMovement.

WakeupOnCollisionMovement(Node armingNode, int speedHint)

Construye un nuevo criterio WakeupOnCollisionMovement, donde speedHint es:

  • USE_BOUNDS - Usa l�mites geom�tircos como una aproximaci�n al c�lculo de colisiones.
  • USE_GEOMETRY - Usa geometr�a en el c�lculo de colisiones.
WakeupOnCollisionMovement(SceneGraphPath armingPath)

Construye un nuevo criterio WakeupOnCollisionMovement.

WakeupOnCollisionMovement(SceneGraphPath armingPath, int speedHint)

Construye un nuevo criterio WakeupOnCollisionMovement, donde speedHint es USE_BOUNDS, o USE_GEOMETRY.

Sumario de M�todos de WakeupOnCollisionMovement

Bounds getArmingBounds()

Devuelve el objeto Bounds usado para especificar la condici�n de colisi�n.

SceneGraphPath getArmingPath()

Devuelve el path usado en la especificaci�n de la condici�n de colisi�n.

Bounds getTriggeringBounds()

Devuelve el objeto Bounds que caus� la colisi�n.

SceneGraphPath getTriggeringPath()

Devuelve el path que describe el objeto que caus� la colisi�n.

WakeupOnDeactivation

Sumario de Constructores de WakeupOnDeactivation

Extiende: WakeupCriterion

Esta clase especifica un disparo para la primera detecci�n de que el volumen de activaci�n deja de interseccionar con la regi�n de l�mites de este objeto. Tambi�n puedes ver WakeupOnActivation.

WakeupOnDeactivation()

Construye un nuevo criterio WakeupOnDeactivation.

WakeupOnElapsedFrames

El objeto WakeupOnElapsedFrames se usa para disparar un objeto activo despu�s de que haya pasado un n�mero especificado de frames. Un frameCount de 0 especifica que se dispare en el siguiente frame.

Sumario de Constructores de WakeupOnElapsedFrames

Extiende: WakeupCriterion

Esta clase especifica un disparo cuando han pasado un n�mero especificado de frames.

WakeupOnElapsedFrames(int frameCount)

Construye un nuevo criterio WakeupOnElapsedFrames.

Sumario de M�todos de WakeupOnElapsedFrames

int getElapsedFrameCount()

Devuelve el contador de marcos WakeupCriterion que fue utilizado cuando se construy� este objeto.

WakeupOnElapsedTime

Java 3D no puede garantizar el tiempo exacto entre disparos para un criterio WakeupOnElapsedTime. Un disparo ocurrir� en el momento especificado, o muy cercano.

Sumario de Constructores de WakeupOnElapsedTime

Extiende: WakeupCriterion

Esta clase especifica un disparo despu�s de que hayan pasado un n�mero de milisegundos especificado.

WakeupOnElapsedTime(long milliseconds)

Construye un nuevo criterio WakeupOnElapsedTime.

Sumario de M�todos de WakeupOnElapsedTime

long getElapsedFrameTime()

Devuelve el valor de tiempo que se utiliz� en la construcci�n de este objeto.

WakeupOnSensorEntry

En Java 3D, cualquier dispositivo de entrada distinto del teclado o el rat�n es un sensor. Un sensor es un concepto abstracto para un dispositivo de entrada. Cada sensor tiene un punto caliente definido en el sistema de coordenadas del sensor. La intersecci�n del punto caliente de un sensor con una regi�n puede detectarse con las clases WakeupOnSensorEntry y WakeupOnSensorExit.

Es posible que un sensor entre y salga de una regi�n armada tan r�pidamente que ninguna de las condiciones se dispare.

Sumario de Constructores de WakeupOnSensorEntry

Extiende: WakeupCriterion

Esta clase especifica un disparo en la primera detecci�n de la intersecci�n de cualquier sensor con los l�mites especificados.

WakeupOnSensorEntry(Bounds region)

Construye un nuevo criterio WakeupOnEntry.

Sumario de M�todos de WakeupOnSensorEntry

Bounds getBounds()

Devuelve la especificaci�n de l�mites de este objeto.

WakeupOnSensorExit

Sumario de Constructores de WakeupOnSensorExit

Extiende: WakeupCriterion

Esta clase especifica un disparo en la primera detecci�n de que un sensor que previamente intereseccionaba con los l�mites deja de intereseccionar con los l�mites especificados. Tambi�n puedes ver WakeupOnSensorEntry.

WakeupOnSensorExit(Bounds region)

Construye un nuevo criterio WakeupOnExit.

Sumario de M�todos de WakeupOnSensorExit

Bounds getBounds()

Devuelve la especificaci�n de l�mites de este objeto.

WakeupOnTransformChange

El criterio WakeupOnTransformChange es �til para detectar cambios en la posici�n o la orientaci�n de objetos visuales en el escenario gr�fico. Este criterio ofrece un alternativa a usar el m�todo postId para crear comportamientos coordinados. Es especialmente �til cuando el comportamiento con el cual se desea coordinar ya est� escrito, por ejemplo las utilidades de comportamientos presentadas anteriormente.

Sumario de Constructores de WakeupOnTransformChange

Extiende: WakeupCriterion

Esta clase especifica un disparo cuando cambia la transformaci�n dentro de un TransformGroup especificado.

WakeupOnTransformChange(TransformGroup node)

Construye un nuevo criterio WakeupOnTransformChange.

Sumario de M�todos de WakeupOnTransformChange

TransformGroup getTransformGroup()

Devuelve el nodo TransformGroup usado en la creacci�n de este WakeupCriterion

WakeupOnViewPlatformEntry

La detecci�n de la intersecci�n del ViewPlatform con una regi�n especificada se hace posible con las clases del criterio de WakeupOnViewPlatfomEntry y de WakeupOnViewPlatformExit.

Es posible que el l�mite especificado interseccione con un volumen de la activaci�n de ViewPlatform tan brevemente que no sea detectada. En este caso ni se accionan las condiciones de WakeupOnViewPlatformEntry ni de WakeupOnViewPlatformExit.

Sumario de Constructores de WakeupOnViewPlatformEntry

Extiende: WakeupCriterion

Esta clase especifica un disparo en la primera intersecci�n del ViewPlatform con los l�mites especificados.

WakeupOnViewPlatformEntry(Bounds region)

Construye un nuevo criterio WakeupOnEntry.

Sumario de M�todos de WakeupOnViewPlatformEntry

Bounds getBounds()

Devuelve la especificaci�n de l�mites de este objeto.

WakeupOnViewPlatformExit

Sumario de Constructores de WakeupOnViewPlatformExit

Extiende: WakeupCriterion

Esta Class especifica un disparo en la primera detecci�n de un Viewplatform que deja de interseccionar con el l�mite especificado. Tambi�n puedes ver WakeupOnViewPlatformEntry.

WakeupOnViewPlatformExit(Bounds region)

Construye un nuevo criterio WakeupOnExit.

Sumario de M�todos de WakeupOnViewPlatformExit

Bounds getBounds()

Devuelve la especificaci�n de l�mites de este objeto

.�WakeupCondition Composition

Varios objetos WakeupCriteron pueden componer un solo WakeupCondition usando las cuatro clases presentadas en esta secci�n. Las primeras dos clases permiten la composici�n de un WakeupCondition desde una colecci�n de objetos WakeupCriterion que son l�gicamente ANDed u ORed juntos, respectivamente. El tercero y siguientes permiten la composici�n de ejemplares de las dos primeras clases en objeto WakeupCondition m�s complejos.

WakeupAnd

Sumario de Constructores de WakeupAnd

Extiende: WakeupCondition

Esta clase especifica cualquier n�mero de criterios de disparo que son (AND) juntos de forma l�gica.

WakeupAnd(WakeupCriterion[] conditions)

Construye una nueva condici�n WakeupAnd.

WakeupOr

Sumario de Consctructores de WakeupOr

Extiende: WakeupCondition

Esta clase especifica cualquiere n�mero de criterios de disparo que son (OR) juntos de forma l�gica.

WakeupAnd(WakeupCriterion[] conditions)

Construye una nueva condici�n WakeupOr.

WakeupAndOfOrs

Sumario de Consctructores de WakeupAndOfOrs

Extiende: WakeupCondition

Esta clase especifica cualquier n�mero de criterios de disparo WakeupOr que son (AND) juntos de forma l�gica.

WakeupAndOfOrs(WakeupOr[] conditions)

Construye una nueva condici�n WakeupAndOfOrs.

WakeupOrOfAnds

Sumario de Consctructores de WakeupOrOfAnds

Extiende: WakeupCondition

Esta clase especifica cualquier n�mero de criterios de disparo WakeupAnd que son (OR) juntos de forma l�gica.

WakeupOrsOfAnds(WakeupAnd[] conditions)

Construye una nueva condici�n WakeupOrOfAnds.

.�Clases de Comportamientos �tiles para la Navegaci�n por Teclado

Hasta este momento, el espectador ha estado en una localizaci�n fija con una orientaci�n fija. El poder mover el espectador es una capacidad importante en muchas aplicaciones de los gr�ficos 3D. Java 3D es capaz de mover el espectador. De echo hay clases utilitarias de Java 3D que implementan esta funcionalidad.

La Figura 4-8 muestra la rama gr�fica b�sica para un universo virtual de Java 3D. En esta figura, se considera la plataforma de la visi�n transform. Si se cambia la transformaci�n, el efecto es mover, o reorientar, o ambas, al espectador. De esto, podemos ver que el dise�o b�sico de la navegaci�n del teclado es simple: hacemos que un objeto behavior cambie la transformaci�n de la vista de la plataforma en respuesta a los movimientos dominantes.

Este dise�o simple es exactamente el modo de trabajo de las clases utilitarias del teclado de Java 3D. Por supuesto podr�amos construir nuestro propio comportamiento de navegaci�n del teclado. El resto de esta secci�n explica c�mo utilizar las clases de la navegaci�n del teclado de Java 3D.

Figura 4-8, la Rama Gráfica Básica mostrando la Transformación de la Vista de la Plataforma

C�mo Navegar en un SimpleUniverse

Podr�a ser que pensaramos que necesitar el acceso a los grupos de objeto Transform de la plataforma significa abandonar la utilidad SimpleUniverse. Sin embargo, SimpleUniverse, y las clases relacionadas, proporcionan una combinaci�n de m�todos para extraer el objeto ViewPlatformTransform. Por lo tanto, podemos tener nuestro SimpleUniverse y navegar en �l tambi�n!

Espec�ficamente, la siguiente l�nea de c�digo extrae el ViewPlatformTransform de un objeto de SimpleUniverse, su.

TransformGroup vpt = su.getViewingPlatform().getViewPlatformTransform();

.�Programa de Ejemplo de KeyNavigatorBehavior

Es f�cil utilizar la clase de utilidad KeyNavigatorBehavior en un programa de Java 3D. Esta secci�n demuestra el uso de la clase en el programa del ejemplo de KeyNavigatorApp.java. En este programa podemos ver que los pasos necesarios para usar la clase KeyNavigatorBehavior son esencialmente id�nticos a los de usar cualquier clase de comportamiento. Los pasos para usar KeyNavigatorBehavior se resumen en la siguiente lista.

  1. crear un objeto KeyNavigatorBehavior, seleccionado el grupo de transformaci�n
  2. a�adir el objeto KeyNavigatorBehavior al escenario gr�fico
  3. proporcionar unos l�mites (o BoundingLeaf) para el objeto KeyNavigatorBehavior

Como cualquier problema de programaci�n, hay una variedad de maneras de implementar los pasos de esta receta. Un acercamiento es incorporar estos pasos en el m�todo de createSceneGraph. El Fragmento de C�digo 4-5 muestra los pasos de la receta seg�n la implementaci�n para el programa del ejemplo de KeyNavigatorApp.java.

Fragmento de C�digo 4-5, usar la clase KeyNavigatorBehavior (parte 1)
1.     public BranchGroup createSceneGraph(SimpleUniverse su) {
2.         // Create the root of the branch graph
3.         TransformGroup vpTrans = null;
4.
5.         BranchGroup objRoot = new BranchGroup();
6.
7.         objRoot.addChild(createLand());
8.
9.        // create other scene graph content
10.
11.
12.      vpTrans = su.getViewingPlatform().getViewPlatformTransform();
13.      translate.set( 0.0f, 0.3f, 0.0f); // 3 meter elevation
14.      T3D.setTranslation(translate); // set as translation
15.      vpTrans.setTransform(T3D); // used for initial position
16.      KeyNavigatorBehavior keyNavBeh = new KeyNavigatorBehavior(vpTrans);
17.      keyNavBeh.setSchedulingBounds(new BoundingSphere(
18.                                         new Point3d(),1000.0));
19.      objRoot.addChild(keyNavBeh);
20.
21.      // Let Java 3D perform optimizations on this scene graph.
22.      objRoot.compile();
23.
24.      return objRoot;
25.   } // end of CreateSceneGraph method of KeyNavigatorApp

La ejecuci�n del paso 1 de la receta en el m�todo de createSceneGraph requiere el acceso al grupo de transformaci�n de ViewPlatform. Esta implementaci�n pasa el objeto SimpleUniverse (l�nea 34 del Fragmento de C�digo 4-6) al m�todo createSceneGraph que lo hace disponible para tener acceso a la transformaci�n de ViewPlatform (la l�nea 12 del Fragmento de C�digo 4-5).

Pasar el objeto SimpleUniverse al m�todo de createSceneGraph permite acceder a otras caracter�sticas de la rama gr�fica de la vista de SimpleUniverse, tales como PlatformGeometry, ViewerAvatar, o de agregar un BoundingLeaf a la rama gr�fica de la vista.

La l�neas 13 a 15 del Fragmento de C�digo 4-5 proporcionan una posici�n inicial para el espectador. En este caso, el espectador se mueve a una posici�n 0,3 metros sobre el origen del mundo virtual. Esto es solamente una posici�n inicial, y de ninguna manera limita la posici�n futura o la orientaci�n del espectador.

Fragmento de C�digo 4-6, usar la clase KeyNavigatorBehavior (parte 2)
26.   public KeyNavigatorApp() {
27.       setLayout(new BorderLayout());
28.       Canvas3D canvas3D = new Canvas3D(null);
29.       add("Center", canvas3D);
30.
31.       // SimpleUniverse is a Convenience Utility class
32.       SimpleUniverse simpleU = new SimpleUniverse(canvas3D);
33.
34.       BranchGroup scene = createSceneGraph(simpleU);
35.
36.       simpleU.addBranchGraph(scene);
37.   } // end of KeyNavigatorApp (constructor)

C�mo Crear una Aplicaci�n Universal de un Comportamiento

Como con cualquier objeto comportamiento, el objeto KeyNavigtorBehavior est� solo activo cuando sus l�mites interseccionan con el volumen de activaci�n de un ViewPlatform. Esto puede estar particularmente limitado para un comportamiento de navegaci�n, donde el comportamiento debe siempre estar activado. El Cap�tulo 3 discute una soluci�n a este problema usando un BoundingLeaf.

.�Clases KeyNavigatorBehavior y KeyNavigator

La utilidad de navegaci�n del teclado se implementa como dos clases. En el tiempo de ejecuci�n hay dos objetos. El primer objeto es el objeto KeyNavigatorBehavior, el segundo es un objeto KeyNavigator. La segunda clase no se documenta aqu� ya que ni el programador ni el cliente deben saber que existe la segunda clase u objeto.

El objeto KeyNavigatorBehavior realiza todas las funciones t�picas de una clase de comportamiento, excepto que llama al objeto KeyNavigator para realizar la funci�n de processStimulus. La clase KeyNavigator toma el AWTEvent y lo procesa bajo al nivel de pulsaciones de teclas individuales. La Tabla siguiente muestra el efecto de las pulsaciones de teclas individuales. KeyNavigator implementa el movimiento con aceleraci�n.

Movimientos de KeyNavigatorBehavior

Tecla Movimiento Movimiento Alt-tecla
<- rotar a la izquierda traslaci�n lateral izquierda
-> rotar a la derecha traslaci�n lateral derecha
^ mover hacia adelante

�

v mover hacia atr�s

�

PgUp rotar arriba translaci�n hacia arriba
PgDn rotar abajo translaci�n hacia abajo
+ aumenta la distancia de salto (y vuelve al origen)

�

- reduce la distancia de salto

�

= vuelve al centro del universo

�

Sumario de Constructores de KeyNavigatorBehavior

Paquete: com.sun.j3d.utils.behaviors.keyboard

Extiende: Behavior

Esta clase es un sencillo comportamiento que invoca el KeyNavigator para modificar la transformaci�n de la vista de la plataforma.

KeyNavigatorBehavior(TransformGroup targetTG)

Construye un nuevo comportamiento de navegaci�n por teclado que opera sobre el grupo de transformaci�n especificado.

Sumario de M�todos de KeyNavigatorBehavior

void initialize()

Sobreescribe el m�todo initialize de Behavior para configurar los criterios de disparo.

void processStimulus(java.util.Enumeration criteria)

Sobreescribe el m�todo stimulus de Behavior para manejar el evento.

.�Clases de Utilidad para Interactuar con el Rat�n

El paquete de comportamientos de rat�n (com.sun.j3d.utils.behaviors.mouse) contiene las clases del comportamiento en las cuales el rat�n se utiliza como entrada de informaci�n para la interacci�n con los objetos visuales. Incluyendo las clases para traslaciones (movi�ndose en un plano paralelo a la placa de la imagen), enfocando (que mueve hacia atr�s y adelante), y los objetos visuales que rotan en respuesta a los movimientos del rat�n.

La siguiente tabla resume las tres clases espec�ficas del comportamiento del rat�n incluidas en el paquete. Adem�s de estas tres clases, est� la clase abstracta MouseBehavior, y el interface MouseCallback. Esta clase abstracta y el interface se utilizan en la creaci�n de las clases espec�ficas del comportamiento del rat�n y son �tiles para crear comportamientos personalizados del rat�n.

Sumario de las clases esp�cificas de MouseBehavior

Clase MouseBehavior Acci�n en Respuesta a la Acci�n del Rat�n Acci�n del rat�n
MouseRotate rota el objeto visual sin moverlo bot�n izquierdo pulsado con movimiento del rat�n
MouseTranslate translada el objeto visual en un plano paralelo al plato de imagen boton derecho pulsado con movimiento del rat�n
MouseZoom translada el objeto visual en un plano orthogonal al plato de imagen bot�n central pulsado con movimiento del rat�n

.�Usar las Clases de Comportamiento del Rat�n

La clases de comportamientos espec�ficos del rat�n son f�ciles de usar; es esencialmente lo mismo que el de otras clases de comportamientos. La siguiente lista representa la receta para usarlas:

  1. proporcionar capacidades de lectura y escritura para el transformGroup fuente
  2. crear uno bjeto MouseBehavior
  3. seleccionar el transformGroup fuente
  4. proporcionar unos l�mites (o BoundingLeaf) para el objeto MouseBehavior
  5. a�adir el objeto MouseBehavior al escenario gr�fico

Como con algunas otras recetas, los pasos no tienen que ser realizados en el orden dado. El paso dos se debe realizar antes del tres, del cuatro, y del cinco; los otros pasos se pueden realizar en cualquier orden. Tambi�n, los pasos dos y tres se pueden combinar usando un constructor diferente.

El Fragmento de C�digo 4-7 presenta el m�todo createSceneGraph del programa del ejemplo de MouseRotateApp.java. El escenario gr�fico incluye el objeto ColorCube. El usuario puede rotar el ColorCube usando el rat�n debido a la inclusi�n de un objeto MouseRotate en el escenario gr�fico.

Fragmento de C�digo 4-7, usar la clase de utilidad MouseRotate
1.     public class MouseRotateApp extends Applet {
2.
3.         public BranchGroup createSceneGraph() {
4.             // Create the root of the branch graph
5.             BranchGroup objRoot = new BranchGroup();
6.
7.             TransformGroup objRotate = new TransformGroup();
8.             objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
9.             objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
10.
11.           objRoot.addChild(objRotate);
12.           objRotate.addChild(new ColorCube(0.4));
13.
14.           MouseRotate myMouseRotate = new MouseRotate();
15.           myMouseRotate.setTransformGroup(objRotate);
16.           myMouseRotate.setSchedulingBounds(new BoundingSphere());
17.           objRoot.addChild(myMouseRotate);
18.
19.           // Let Java 3D perform optimizations on this scene graph.
20.           objRoot.compile();
21.
22.           return objRoot;
23.   } // end of CreateSceneGraph method of MouseRotateApp

La misma receta funcionar� para las otras clases de comportamiento del rat�n. De hecho los tres comportamientos se pueden utilizar en la misma aplicaci�n que funciona en el mismo objeto visual. Puesto que cada uno de los comportamientos del rat�n lee el transform fuente antes de escribirlo, s�lo se necesita un objeto TransformGroup incluso con tres comportamientos de rat�n. El programa del ejemplo de MouseRotateApp.java hace apenas eso.

El siguiente ejemplo muestra c�mo dos comportamientos del rat�n trabajan en un solo mundo virtual. El programa MouseRotate2App.java del ejemplo crea un escenario gr�fico con dos objetos ColorCube uno junto al otro en el mundo virtual. Cada uno de los ColorCubes tiene un objeto MouseRotate asociado a �l. Puesto que ambos objetos de comportamiento del rat�n est�n activos, cuando el usuario hace clic y mueve el rat�n, ambos ColorCubes rotan.

Si no quisieramos que ambos objetos rotaran, hay dos soluciones: 1) cambiar la posici�n del espectador, o cambiar los l�mites del comportamiento, de modo que solamente un comportamiento sest� activo, o 2) usar un mecanismo de selecci�n para aislar el comportamiento.

.�Fundamentos del Comportamiento del Rat�n

Las clases espec�ficas de comportamiento del rat�n (MouseRotate, MouseTranslate, y MouseZoom) son extensiones de la clase abstracta MouseBehavior e implementan el interface MouseCallback.

La Clase Abstracta MouseBehavior

Esta clase abstracta se presenta aqu� en el evento que deseamos ampliarlo para escribir una clase personaliza de comportamiento del rat�n. El m�todo SetTransformGroup() es probablemente el �nico que utilizar�n los usuarios de un ejemplar de MouseBehavior. Los otros m�todos se crear�n para los autores de las clases de comportamientos personalizados del rat�n.

Sumario de M�todos de MouseBehavior

La clase base para todos los manipuladores de rat�n (puedes ver MouseRotate y MouseZoom para ejemplos).

void initialize()

Inicializa el comportamiento.

void processMouseEvent(java.awt.event.MouseEvent evt)

Maneja eventos del rat�n.

void processStimulus(java.util.Enumeration criteria)

Todos los manipuladores de rat�n deben implementar este m�todo de Behavior (para responder a los estimulos).

void setTransformGroup(TransformGroup transformGroup)

Selecciona el TransformGroup para el comportamiento.

void wakeup()

Dispara manualmente el comportamiento.

Interface MouseCallback

Una clase que implementa este interfaz proporciona al m�todo transformChanged que ser� llamado cuando cambie el transform fuente de la manera especificada. Cada uno de los tres comportamientos espec�ficos del rat�n implementa esta clase. Un programador simplemente puede reemplazar el m�todo transformChanged de una de esas clases para especificar un m�todo que se llamar� cuando se modifique el transform.

Sumario de M�todos del Interface MouseBehaviorCallback

Paquete: com.sun.j3d.utils.behaviors.mouse

void transformChanged(int type, Transform3D transform)

Las clases que implementan este interface que se registran con un MouseBehaviors ser�n llamadas cada vez que el comportamient actualice el Transform. El tipo es uno de MouseCallback.ROTATE, MouseCallback.TRANSLATE, o MouseCallback.ZOOM.

.�Clases Espec�ficas de Comportamientos de Rat�n

MouseRotate

Un escenario gr�fico que incluye un objeto MouseRotate permite que el usuario rote objetos visuales en el mundo virtual. Los programas de ejemplo MouseRotateApp, MouseRotate2App, y MouseBehaviorApp demuestran el uso de esta clase.

Sumario de Constructores de MouseRotate

Paquete: com.sun.j3d.utils.behaviors.mouse

Extiende: MouseBehavior

MouseRotate es un objeto de comportamiento de Java3D que deja a los usuarios controlar la rotaci�n de un objeto mediante una pulsaci�n del bot�n izquierdo del rat�n. Para utilizar esta utilidad, primero creamos un TransformGroup sobre el que operar� este comportamiento. El usuario puede rotar cualquier objeto hijo del TransformGroup fuente.

MouseRotate()

Crea un comportamiento mouseRotate por defecto.

MouseRotate(TransformGroup transformGroup)

Crea un comportamiendo dando el transformgroup.

MouseRotate(int flags)

Crea un comportamiento con las banderas seleccionadas, donde las banderas son:

  • MouseBehavior.INVERT_INPUT. Invierte la entradas.
  • MouseBehavior.MANUAL_WAKEUP. Dispara manualmente el comportamiento.

Sumario de M�todos de MouseRotate

void setFactor(double factor)

Selecciona el factor multiplicador para los movimientos en los ejes x e y al valor factor

void setFactor(double xFactor, double yFactor)

Selecciona el factor multiplicador para los movimientos en los ejes x e y a los valores xFactor e yFactor respectivamente.

void setupCallback(MouseBehaviorCallback callback)

El m�todo que se llama cada vez que se actualiza el transformgroup

void transformChanged(Transform3D transform)

Los usuarios pueden sobreescribir este m�todo que es llamado cada vez que el comportamiento actualiza el transformgroup. La implementaci�n por defecto no hace nada.

MouseTranslate

Un escenario gr�fico que incluye un objeto MouseTranslate permite que el usuario mueva objetos visuales en un plano paralelo a la placa de la imagen en el mundo virtual.

Sumario de Constructores de MouseTranslate

Paquete: com.sun.j3d.utils.behaviors.mouse

Extiende: MouseBehavior

MouseTranslate es un objeto comportamiento de Java3D que permite a los usuarios controlar la traslaci�n (X,Y) de un objeto mediante un movimiento de arrastre del rat�n con el bot�n derecho.

MouseTranslate()

Crea un comportamiento de movimiento por defecto.

MouseTranslate(TransformGroup transformGroup)

Crea un comportamiento de movimiento dando un transformgroup.

MouseTranslate(int flags)

Crea un comportamiento de movimiento con banderas, donde las banderas son:

  • MouseBehavior.INVERT_INPUT. Invierte la entradas.
  • MouseBehavior.MANUAL_WAKEUP. Dispara manualmente el comportamiento.

Sumario de M�todos de MouseTranslate

void setFactor(double factor)

Selecciona el factor multiplicador para los movimientos en los ejes x e y al valor factor

void setFactor(double xFactor, double yFactor)

Selecciona el factor multiplicador para los movimientos en los ejes x e y a los valores XFactor e yFactor respectivamente.

void setupCallback(MouseBehaviorCallback callback)

El m�todo que se llama cada vez que se actualiza el transformgroup

void transformChanged(Transform3D transform)

Los usuarios pueden sobreescribir este m�todo que es llamado cada vez que el comportamiento actualiza el transformgroup. La implementaci�n por defecto no hace nada.

MouseZoom

Un escenario gr�fico que incluye un objeto MouseZoom permite a los usuarios mover objetos visuales en un plano orthogonal al plato de imagen en un mundo virtual.

Sumario de Constructores de MouseZoom

Paquete: com.sun.j3d.utils.behaviors.mouse

Extiende: MouseBehavior

MouseZoom es un objeto de comportamiento Java3D que permite a los usuarios controlar la traslaci�n en el eje Z de un objeto mediante un movimiento de arrastre del rat�n con el bot�n central (alt-tecla en el PC con el rat�n de dos botones).

MouseZoom()

Crea un comportamiento de zoom con rat�n por defecto.

MouseZoom(TransformGroup transformGroup)

Crea un comportamiento de zoom dando el transformgroup.

MouseZoom(int flags)

Crea un comportamiento de zoom con banderas, donde las banderas son:

  • MouseBehavior.INVERT_INPUT. Invierte la entradas.
  • MouseBehavior.MANUAL_WAKEUP. Dispara manualmente el comportamiento.

Sumario de M�todos de MouseZoom

void setFactor(double factor)

Selecciona el factor multiplicador del movimiento sobre el eje Z al valor factor.

void setupCallback(MouseBehaviorCallback callback)

El m�todo que se llama cada vez que se actualiza el transformgroup

void transformChanged(Transform3D transform)

Los usuarios pueden sobreescribir este m�todo que es llamado cada vez que el comportamiento actualiza el transformgroup. La implementaci�n por defecto no hace nada.

.�MouseNavigation

Las tres clases espec�ficas de comportamiento del rat�n se pueden utilizar para crear un universo virtual en el cual el rat�n se utilice para la navegaci�n. Cada una de las clases espec�ficas del comportamiento del rat�n tiene un constructor que toma un solo par�metro entero para las banderas. Cuando se utiliza MouseBehavior.INVERT_INPUTS como argumento a este constructor, el comportamiento del rat�n responde en la direcci�n opuesta. Este comportamiento inverso es apropiado para cambiar el transform ViewPlatform. Es decir las clases del comportamiento del rat�n se pueden utilizar para el control navegacional.

El programa de ejemplo MouseNavigatorApp.java utiliza casos de las tres clases espec�ficas del comportamiento del rat�n para la interacci�n navegacional. El Fragmento de C�digo 4-8 muestra el m�todo createSceneGraph de este programa del ejemplo.

El TransformGroup fuente para cada uno de los objetos del comportamiento del rat�n es el ViewPlatform transform. El objeto SimpleUniverse es un argumento al m�todo createSceneGraph de modo que se puedan alcanzar los objetos transform de ViewPlatform.

Fragmento de C�digo 4-8 ,Usar clases de Comportamientos del Rat�n para Navegaci�n Interactiva en un Mundo Virtual.
1.     public BranchGroup createSceneGraph(SimpleUniverse su) {
2.         // Create the root of the branch graph
3.         BranchGroup objRoot = new BranchGroup();
4.         TransformGroup vpTrans = null;
5.         BoundingSphere mouseBounds = null;
6.
7.         vpTrans = su.getViewingPlatform().getViewPlatformTransform();
8.
9.         objRoot.addChild(new ColorCube(0.4));
10.       objRoot.addChild(new Axis());
11.
12.       mouseBounds = new BoundingSphere(new Point3d(), 1000.0);
13.
14.       MouseRotate myMouseRotate = new
                                   MouseRotate(MouseBehavior.INVERT_INPUT);
15.       myMouseRotate.setTransformGroup(vpTrans);
16.       myMouseRotate.setSchedulingBounds(mouseBounds);
17.       objRoot.addChild(myMouseRotate);
18.
19.       MouseTranslate myMouseTranslate = new
                                   MouseTranslate(MouseBehavior.INVERT_INPUT);
20.       myMouseTranslate.setTransformGroup(vpTrans);
21.       myMouseTranslate.setSchedulingBounds(mouseBounds);
22.       objRoot.addChild(myMouseTranslate);
23.
24.       MouseZoom myMouseZoom = new 
                                   MouseZoom(MouseBehavior.INVERT_INPUT);
25.       myMouseZoom.setTransformGroup(vpTrans);
26.       myMouseZoom.setSchedulingBounds(mouseBounds);
27.       objRoot.addChild(myMouseZoom);
28.
29.       // Let Java 3D perform optimizations on this scene graph.
30.       objRoot.compile();
31.
32.       return objRoot;
33.   } // end of createSceneGraph method of MouseNavigatorApp

Los objetos bounds para los objetos de comportamientos de rat�n se especifican como un BoundingSphere con un radio de 1000 metros. Si el usuario se sale de esta esfera, los objetos comportamiento se desactivar�n.

.�Picking

En el programa de ejemplo MouseNavigatorApp.java, ambos objetos ColorCube giran en respuesta a acciones del usuario. En esta aplicaci�n, no hay forma de manipular los cubos de forma separada. "Picking" (Elecci�n) le da al usuario una forma de interactuar con objetos visuales individuales en la escena.

Picking (elecci�n) est� implementado por un comportamiento tipicamente disparado por eventos de botones del rat�n. En la selecci�n de un objeto visual, el usuario sit�a el puntero del rat�n sobre el objeto elegido y pulsa el bot�n del rat�n. El objeto behavior se dispara por la pulsaci�n de este bot�n y empieza la operaci�n de selecci�n. Se proyecta un rayo dentro del mundo virtual desde la posici�n del puntero del rat�n paralela con la proyecci�n. Se calcula la intersecci�n de este rayo con los objetos del mundo virtual. El objeto visual que interseccione m�s cerca al plato de la imagen se selecciona para interacci�n. La Figura 4-11 muestra un rayo de selecci�n proyectado en un mundo virtual.

Figura 4-11,  Proyección de un PickRay en el Mundo Virtual

En algunos casos la interacci�n no se hace directamente con el objeto seleccionado, sino con un objeto en el camino del escenario gr�fico hasta el objeto. Por ejemplo, al seleccionar un objeto ColorCube para rotaci�n, este objeto no se manipula, se manipula el objeto TransformGroup que hay sobre el ColorCube en el path del escenario gr�fico. Por otro lado, su la operaci�n de selecci�n selecciona un objeto visual para el que se pens� un cambio de color, entonces el objeto visual seleccionado es requerido.

La determinaci�n del objeto para un posterior procesamiento no siempre es sencilla. Si in objeto visual c�bico que va a ser rotado est� compuesto por seis objetos Shape3D individuales junto con seis objetos TransformGroup, como en el escenario gr�fico de la Figura 4-12, no es el objeto TransformGroup sobre el objeto Shape3D interseccionado el que necesita ser modificado. El 'cubo' se rota por la manipulaci�n del objeto TransformGroup que es hijo del objeto BranchGroup en el escenario gr�fico. Por esta raz�n, el resultado de algunas operaciones de selecci�n es devolver el path del escenario gr�fico para su posterior procesamiento.

Figura 4-12, Diagrama del Escenario Gráfico para un Cubo Compuesto por objetos Shape3D planos.

La comprobaci�n de intersecciones es necesita mucho c�lculo. Por lo tanto, la selecci�n es cara y se vuelve m�s cara con la complejidad del escena. El API Java 3D proporciona varias formas para que un programador pueda limitar la cantidad de c�lculos realizados por la selecci�n. Una forma importante es atrav�s de las capacidades y atributos de los nodos del escenario gr�fico. Si un nodo es o no elegible se selecciona con el m�todo setPickable() de la clase. Un nodo con setPickable() seleccionado a false no es elegible ni ninguno de sus hijos tampoco. Consecuentemente, estos nodos no se tienen en cuenta cuando se calculan las intersecciones.

Otra caracter�stica relacionada con la selecci�n en la clase Node es la capacidad ENABLE_PICK_REPORTING. Esta capacidad s�lo se aplica a nodos Group. Cuando se selecciona para un grupo, este objeto group siempre ser� incluido en el escenario gr�fico devuelto por una operaci�n de selecci�n. Los nodos Group no se necesitan para unidades en un escenario gr�fico que ser�n excluidas cuando la capacidad no est� seleccionada. No tener seleccionado correctamente los nodos del escenario gr�fico es un fuente com�n de frustacciones en el desarrollo de aplicaciones que utilizan operaciones de selecci�n.

Lista Parcial de M�todos de Node

Extiende: SceneGraphObject

Subclases: Group, Leaf

La clase Node proporciona una clase abstracta para todos los nodos Group y Leaf. Porporciona un marco de trabajo com�n para construir un escenario gr�fico Java 3D, especificamente vol�menes, y las capacidades de selecci�n y colisi�n.

void setBounds(Bounds bounds)

Selecciona los l�mites geom�tricos de un nodo.

void setBoundsAutoCompute(boolean autoCompute)

Activa/desactiva el c�lculo autom�tico de los l�mites geom�tricos de un nodo.

setPickable(boolean pickable)

Cuando se selecciona a true este nodo puede ser elegido. Cuando se selecciona a false indica que este nodo y sus hijos no son elegibles.

Lista Parcial de Capacidades de Node

ENABLE_PICK_REPORTING

Especifica que este nodo ser� reportado en el SceneGraphPath si ocurre una selecci�n. Esta capacidad es s�lo aplicable para nodos Group; es ignorado para nodos leaf. El valor por defecto para nodos Group es false. Los nodos interiores no necesitan ser �nicos en un SceneGraphPath que no tiene seleccionado ENABLE_PICK_REPORTING ser�n excluidos del SceneGraphPath.

ALLOW_BOUNDS_READ | WRITE
Especifica que este nodo permite leer (escribir) la informaci�n de sus l�mites.

ALLOW_PICKABLE_READ | WRITE
Especifica que este nodo permite leer (escribir) su estado de selecci�n.

Otra forma en la que un programador puede reducir el c�culo de selecci�n es usar pruebas de interesecci�n de l�mites en vez de pruebas de intersecciones geom�tricas. Varias clases relacionadas con la selecci�n (pick) tiene constructores y/o m�todos con un par�metro que se selecciona a uno de: USE_BOUNDS o USE_GEOMETRY. Cuando se selecciona USE_BOUNDS, la selecci�n est� determinada usando los l�mites de los objetos visuales, no la geometr�a real. La determinaci�n de una selecci�n usando los l�mites es significativamente m�s sencilla (computacionalmente) para todo excepto para las formas geom�tricas sencillas y por lo tanto, resulta en un mejor rendimiento. Por supuesto, la p�rdida es que la selecci�n no es tan precisa cuando se utilizan l�mites para su determinaci�n.

Una tercera t�cnica de programaci�n para reducir el coste de c�lculo para la selecci�n es limitar el �mbito de la prueba de selecci�n a la porcion relevante del escenario gr�fico. En cada clase de utilidad de selecci�n se selecciona un nodo como el ra�z para el gr�fico a testear. Este nodo no es necesariamente el ra�z de la rama de contenido gr�fico. Por el contrario, el nodo pasado deber�a ser el ra�z de la subrama de contenido que s�lo contiene objetos elegibles, si es posible. Esta consideraci�n pordr�a ser una mayor factor de determinaci�n en la construcci�n de un escenario gr�fico para algunas aplicaciones.

.�Usar las Clases de Utilidad de Picking

Hay dos aproximaciones b�sicas para usar las caracter�sticas de selecci�n de Java 3D, usar objetos de clases picking, o crear clases picking personalizadas y usar ejemplares de estas clases. El paquete picking incluye clases para pick/rotate, pick/translate, y pick/zoom. Es decir, un usuario puede elegir y rotar un objeto presionando el bot�n del rat�n cuando el puntero est� sobre el objeto deseado y entonces arrastra el rat�n (mientras mantiene pulsado el bot�n). Cada una de estas clases de picking usa un bot�n diferente del rat�n haciendo posible el uso de objeto para las tres clases de picking en la misma aplicaci�n simult�neamente.

C�mo un objeto comportamiento picking operar� sobre cualquier objeto del escenario gr�fico (con las capacidades apropiadas), s�lo se necesita proporcionar un objeto picking. Las dos siguientes l�neas de c�digo son todo lo que necesitamos incluir en un programa Java 3D para usar las clases de selecci�n:

PickRotateBehavior behavior = new PickRotateBehavior(root, canvas, bounds);
root.addChild(behavior);

El objeto behavior monitorizar� cualquier evento de selecci�n en el escenario gr�fico (bajo el nodo ra�z) y meneja los arrastres y pulsaciones del rat�n. El root proporciona la porci�n del escenario gr�fico a chequear para la selecci�n, el canvas se situa donde est� el rat�n, y bounds son los l�mites del objeto de comportamiento picking.

Receta para usar las clases de utilidades de picking.

  1. Crear nuestro escenario gr�fico.
  2. Crear un objeto behavior picking con la especificaci�n de root, canvas, y bounds.
  3. A�adir el objeto behavior al escenario gr�fico.
  4. Activar las capacidades apropiadas para los objetos del escenario gr�fico.

Riesgos de Programaci�n cuando se usan Objetos Picking

Los Riesgos m�s comunes incluyen; olvidarse de incluir el objeto behavior en el escenario gr�fico, y no seleccionar los l�mites apropiados del objeto.

Otro problema com�n es no seleccionar las capacidades apropiadas para los objetos del escenario gr�fico. Hay otros dos problemas menores, que deber�amos chequear si nuestra aplicaci�n no funciona. Uno es no seleccionar apropiadamente el ra�z del escenario gr�fico. Otro problema potencial es no seleccionar apropiadamente el canvas. Ninguno de estos errores de programaci�n generar�n un aviso o mensaje de error.

Programa de Ejemplo MousePickApp

El Fragmento de C�digo 4-9 muestra el m�todo createSceneGraph de la aplicaci�n MousePickApp.java. Este programa usa un objeto PickRotate para proporcionar interacci�n.

Observa que como la construcci�n del objeto picking requiere un objeto Canvas3D, el m�todo createSceneGraph difiere de versiones anteriores por la inclusi�n del par�metro canvas. Por supuesto, tambi�n cambia la correspondiente invocaci�n a createSceneGraph.

Fragmento de C�digo 4-9, M�todo createSceneGraph de la aplicaci�n MousePickApp.
1.     public BranchGroup createSceneGraph(Canvas3D canvas) {
2.         // Create the root of the branch graph
3.         BranchGroup objRoot = new BranchGroup();
4.
5.         TransformGroup objRotate = null;
6.         PickRotateBehavior pickRotate = null;
7.         Transform3D transform = new Transform3D();
8.         BoundingSphere behaveBounds = new BoundingSphere();
9.
10.       // create ColorCube and PickRotateBehavior objects
11.       transform.setTranslation(new Vector3f(-0.6f, 0.0f, -0.6f));
12.       objRotate = new TransformGroup(transform);
13.       objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
14.       objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
15.       objRotate.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
16.
17.       objRoot.addChild(objRotate);
18.       objRotate.addChild(new ColorCube(0.4));
19.
20.       pickRotate = new PickRotateBehavior(objRoot,canvas, behaveBounds);
21.       objRoot.addChild(pickRotate);
22.
23.       // add a second ColorCube object to the scene graph
24.       transform.setTranslation(new Vector3f( 0.6f, 0.0f, -0.6f));
25.       objRotate = new TransformGroup(transform);
26.       objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
27.       objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
28.       objRotate.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
29.
30.       objRoot.addChild(objRotate);
31.       objRotate.addChild(new ColorCube(0.4));
32.
33.       // Let Java 3D perform optimizations on this scene graph.
34.       objRoot.compile();
35.
36.       return objRoot;
37.   } // end of createSceneGraph method of MousePickApp

Este c�digo es similar al de MouseRotate2App.java, pero es distinto en muchas cosas. Primero, en este programa s�lo se usa un objeto behavior, mientras que MouseRotate2App usaba dos objetos behavior - uno por cada objeto visual. Aunque el c�digo es similar, el comportamiento es diferente. Este programa permite al usuario seleccionar un objeto e interactuar con �l. MouseRotate2App rotaba los dos objetos o ninguno.

.�El API Coraz�n de Clases Picking de Java 3D

Hay tres niveles de clases picking en Java 3D. El API coraz�n de Java 3D proporciona la menor funcionalidad. El paquete de utilidad picking proporciona clases de comportamientos generales, elegibles para personalizaci�n. El paquete picking tambi�n proporciona clases picking espec�ficas que pueden usarse directamente en programas Java 3D.

Las clases coraz�n incluyen PickShape y SceneGraphPath, y m�todos de BranchGroup y Locale. Estas clases proporcionan el mecanismo para especificar una forma usada en la comprobaci�n de intersecciones con objetos visuales. Esta secci�n presenta el API de las clases PickShape y SceneGraphPath, y las clases y m�todos relacionados.

Clases PickShape

Esta clase abstracta no proprociona ni constructores ni m�todos. Proporciona abstracci�n para cuatro subclases: PickBounds, PickRay, PickSegment, y PickPoint.

PickShape

Subclases Conocidas: PickBounds, PickRay, PickSegment, PickPoint

Una clase general para describir un forma de selecci�n que puede usarse con m�todos de selecci�n de BranchGroup y Locale.

PickBounds

Los objetos PickBounds representan un l�mite para testear elecciones. Como una subclase de PickShape, los objetos PickBounds se usan con BranchGroup y Locale as� como con clases del paquete picking.

Sumario de Constructores de PickBounds

Extiende: PickShape

Un l�mite para suministrar a los m�todos de selecci�n de BranchGroup y Locale.

PickBounds()

Crea un PickBounds.

PickBounds(Bounds boundsObject)

Crea un PickBounds con los l�mites especificados.

Sumario de M�todos de PickBounds

Bounds get()

Obtiene el boundsObject desde este PickBounds.

void set(Bounds boundsObject)

Selecciona el boundsObject dentro de este PickBounds.

PickPoint

Los objetos PickPoint representan un punto para selecci�n. Como una subclase de PickShape, los objetos PickBounds se usan con BranchGroup y Locale as� como con clases del paquete picking.

Sumario de Constructores de PickPoint

Extiende: PickShape

Suministra un punto a los m�todos de selecci�n de BranchGroup y Locale

PickPoint()

Crea un PickPoint en (0, 0, 0).

PickPoint(Point3d location)

Crea un PickPoint en location.

Sumario de M�todos de PickPoint

void set(Point3d location)

Selecciona la posici�n de este PickPoint. Existe un m�todo get correspondiente.

PickRay

Los objetos PickRay representan un rayo (un punto y una direcci�n) para selecci�n. Como una subclase de PickShape, los objetos PickBounds se usan con BranchGroup y Locale as� como con clases del paquete picking.

Sumario de Constructores de PickRay

Extiende: PickShape

PickRay es una encapsulaci�n de un rayo para pasarlo a los m�todos de selecci�n en BranchGroup y Locale

PickRay()

Crea un PickRay con origen y direcci�n de (0, 0, 0).

PickRay(Point3d origin, Vector3d direction)

Crea un rayo desde origin con direcci�n a direction.

Sumario de M�todos de PickRay

void set(Point3d origin, Vector3d direction)

Selecciona el rayo que apunte desde origin en direcci�n direction. Existe el correspondiente m�todo get.

PickSegment

Los objetos PickSegment representan un segmento de l�nea (definida por dos puntos) para selecci�n. Como una subclase de PickShape, los objetos PickBounds se usan con BranchGroup y Locale as� como con clases del paquete picking.

Sumario de Constructores de PickSegment

Extiende: PickShape

PickRay es una encapsulaci�n de un segmento pasado a los m�todos de selecci�n de BranchGroup y Locale

PickSegment()

Crea un PickSegment.

PickSegment(Point3d start, Point3d end)

Crea un PickSegment desde el punto start hata el punto end.

Sumario de m�todos de PickSegment

void set(Point3d start, Point3d end)

Selecciona el segmento desde el punto start hasta el punto end. Existe el correspondiente m�todo get.

SceneGraphPath

La clase SceneGraphPath se usa en la mayor�a de las aplicaciones de selecci�n. Esto es porque normalmente la selecci�n implica encontrar un camino de escenario gr�fico en el que se encuentra un objeto para permite la manipulaci�n del objeto o de un objeto TransformGroup en el path.

Un objeto SceneGraphPath representa el camino del escenario gr�fico hacia el objeto elegido permitiendo la manipulaci�n del objeto o de un objeto TransformGroup en el camino del objeto.

Introducci�n a SceneGraphPath

Un objeto SceneGraphPath representa el camino desde un Locale hasta un nodo temrinal en el escenario gr�fico. Este camino consiste en un Locale, un nodo terminal, y un array de nodos internos que est�n en el path desde el Locale hasta el nodo terminal. El nodo terminal podr�a ser un nodo Leaf o un nodo Group. Un SceneGraphPath v�lido debe identificar �nicamente un ejemplar de un nodo terminal. Para nodos que no est�n bajo un SharedGroup, el SceneGraphPath m�nimo consiste en el Locale y el propio nodo terminal. Para nodos que est�n bajo un SharedGroup, el SceneGraphPath m�nimo consiste en el Locale, el nodo terminal, y una lista de todos los nodos Link en el camino desde el Locale hacia el nodo terminal. Un SceneGraphPath opcionalmente podr�a contener otros nodos interiores que est�n en el camino. Un SceneGraphPath se verifica contra errores cuando se env�a como argumento a otros m�todos de Java 3D.

En el array de nodos internos, el nodo en el �ndice 0 es el nodo m�s cercano al Locale. El �ndice se incrementa a lo largo del camino hacia el nodo terminal, con el nodo de �ndice longitud-1 siendo el nodo m�s cercano la nodo terminal. El array de nodos no contiene ni el Locale (que no es un nodo) ni el nodo terminal.

Sumario de Constructores de SceneGraphPath

Cuando un SceneGraphPath es devuelto desde m�todos de selecci�n o colisi�n de Java 3D, tambi�n contiene el valor del objeto transform LocalToVworld del nodo terminal que era en efecto en el momento en que ocurri� la colisi�n o la selecci�n. Obherva que ENABLE_PICK_REPORTING y ENABLE_COLLISION_REPORTING est�n desactivados por defecto. Esto significa que los m�todos de selecci�n y colisi�n devolver�n el SceneGraphPath m�nimo por defecto.

SceneGraphPath()

Construye un objeto SceneGraphPath con par�metros por defecto.

SceneGraphPath(Locale root, Node object)

Construye un nuevo objeto SceneGraphPath.

SceneGraphPath(Locale root, Node[] nodes, Node object)

Construye un nuevo objeto SceneGraphPath.

Lista Parcial de M�todos de SceneGraphPath

boolean equals(java.lang.Object o1)

Devuelve true si el objeto o1 es del tipo SceneGraphPath y todos los datos miembros de o1 son iguales a los miembros de datos correspondientes en este SceneGraphPath y si los valores de transformaci�n son iguales.

Transform3D getTransform()

Devuelve una copia del transform asociado con este SceneGraphPath; devuelve null si no hay transform.

int hashCode()

Devuelve un n�mero 'hash' basado en los valores de los datos de este objeto.

boolean isSamePath(SceneGraphPath testPath)

Determina si dos objetos SceneGraphPath representan el mismo path del escenario grafico; alg�n objeto podr�a incluir un subconjunto diferente de nodos internos; s�lo los nodos links internos, Locale, y el propio nodo son comparados.

int nodeCount()

Recupera el n�mero de nodos de este path.

void set(SceneGraphPath newPath)

Selecciona los valores del path al path especificado.

void setLocale(Locale newLocale)

Selecciona el Locale de este path a los Locale especificado.

void setNode(int index, Node newNode)

Reemplaza el nodo en el �ndice especificado con newNode.

void setNodes(Node[] nodes)

Selecciona el objeto nodo de este path con los objetos nodos especificados.

void setObject(Node object)

Selecciona el nodo terminal de este path al objeto nodo especificado.

void setTransform(Transform3D trans)

Selecciona el componente transform de este SceneGraphPath al valor del transform pasado.

java.lang.String toString()

Devuelve una representaci�n string de este objeto; el string contiene los nombres de las clases de todos los nodos en el SceneGraphPath, el m�todo toString() de cualquier usuario asociado, tambi�n imprime el transform si no es nulo.

M�todos de Selecci�n de BranchGroup y Local

En los siguientes bloques de referencia est�n los m�todos de las clases BranchGroup y Local para chequeo de intersecci�n con objetos PickShape. Este es el nivel de c�lculo de selecci�n m�s bajo proporcionado por el API Java 3D.

M�todos de selecci�n de BranchGroup y Locale para su uso con PickShape

SceneGraphPath[] pickAll(PickShape pickShape)

Devuelve un array que referencia todos los �tems que son elegibles bajo este BranchGroup que intereseccionan con PickShape. El array resultante no est� ordenado.

SceneGraphPath[] pickAllSorted(PickShape pickShape)

Devuelve un array ordenado de referencias a todos los �tems elegibles que interseccionan con el pickShape. Element [0] referencia el �tem m�s cercano al origen de PickShape, con los elementos siguientes alej�ndose del origen. Nota: si pickShape es del tipo PickBounds, el array resultante no est� ordenado.

SceneGraphPath pickClosest(PickShape pickShape)

Devuelve un SceneGraphPath que referencia el �tem elegible que est� m�s cercano al origen de pickShape. Nota: si pickShape es del tipo PickBounds, la respuesta es cualquier nodo elegible debajo de este BranchGroup.

SceneGraphPath pickAny(PickShape pickShape)

Devuelve una referencia a cualquir �tem elegible debajo de este BranchGroup que intersecciona con pickShape.

.�Clases Generales del Paquete Picking

Incluidas en el paquete com.sun.j3d.utils.behaviors.picking hay varias clases de comportamientos generales y espec�ficos. Las clases generales son �tiles para crear nuevos comportamientos de selecci�n, entre las que se incluyen PickMouseBehavior, PickObject, y PickCallback. Las clases espec�ficas de comportamiento del rat�n, presentadas en la siguiente secci�n, son subclases de PickMouseBehavior.

Clase PickMouseBehavior

Esta es la clase base para los comportamientos de selecci�n espec�ficos proporcionados en el paquete. Tambi�n es �til para extender clases de comportamientos de selecci�n personalizados.

Sumario de M�todos de PickMouseBehavior

Paquete: com.sun.j3d.utils.behaviors.picking

Extiende: Behavior

Clase base que permite a los programadores a�adir selecci�n y manipulaci�n del rat�n en un escenario gr�fico (puedes ver PickDragBehavior para un ejemplo de c�mo extender esta clase base).

void initialize()

Este m�todo deber�a ser sobreescrito para proporcionar estado inicial y la condici�n de disparo inicial.

void processStimulus(java.util.Enumeration criteria)

Este m�todo deber�a sobreescribirse para proporcionar el comportamiento en respuesta a una condici�n de disparo.

void updateScene(int xpos, int ypos)

Las subclases deber�an implementar esta funci�n update.

Clase PickObject

La clase PickObject proporciona m�todos para determinar qu� objeto fu� seleccionado por una operaci�n de selecci�n del usuario. Una amplia variedad de m�todos resulta de las distitnas formas posibles de aplicaciones de selecci�n. Es �til crear clases de selecci�n personalizadas.

Sumario de Constructores de PickObject

Paquete: com.sun.j3d.utils.behaviors.picking

Extiende: java.lang.Object

Contiene m�todos para ayudar en la selecci�n. Un PickObject se crea dando un Canvas3D y un BranchGroup. SceneGraphObjects bajo el BranchGroup especificado pueden chequearse para determinar si han sido seleccionados.

PickObject(Canvas3D c, BranchGroup root)

Crea un PickObject.

Lista Parcial de M�todos de PickObject

PickObject tiene numerosos m�todos para el c�lculo de intersecciones de un pickRay con objeto del escenario gr�fico. Algunos de los m�todos s�lo difieren en un par�metro. Por ejemplo el segundo m�todo pickAll (no listado) existe con el firma de m�todo: SceneGraphPath[] pickAll(int xpos, int ypos, int flag), donde flag es uno de: PickObject.USE_BOUNDS, o PickObject.USE_GEOMETRY.

Esta lista ha sido ordenada para excluir los m�todos con par�metros de bandera. Estos m�todos son id�nticos a los incluidos en esta lista con la diferencia del par�metro bandera. Estos m�todos son: pickAll, pickSorted, pickAny, y pickClosest.

PickShape generatePickRay(int xpos, int ypos)

Crea un PickRay que empieza en la posici�n del espectador y apunta dentro de la escena en direcci�n a (xpos, ypos) especificados en el espacio de la ventana.

SceneGraphPath[] pickAll(int xpos, int ypos)

Devuelve un array que referencia todos los �tems que son elegibles debajo del BranchGroup (especificado en el constructor de PickObject) que interseccionan con un rayo que empieza en la posici�n del espectador y apunta dentro de la escena en direcci�n (xpos, ypos) especificados en el espacio de la ventana.

SceneGraphPath[] pickAllSorted(int xpos, int ypos)

Devuelve un array ordenado de referencias a todos los �tems Pickable bajo el BranchGroup (especificado en el constructor de PickObject) que interesecciona con el rayo que empieza en la posici�n del espectador y apunta a la direcci�n de (xpos, ypos) en el espacio de la ventana.

SceneGraphPath pickAny(int xpos, int ypos)

Devuelve una referencia a cualquier �tem que sea elegible debajo del BranchGroup (especificado en el constructor de PickObject) que interesecciona con el rayo que empieza en la posici�n del espectador y apunta a la direcci�n (xpos, ypos) en el espacio de la ventana.

SceneGraphPath pickClosest(int xpos, int ypos)

Devuelve una referencia al �tem que est� m�s cercano al espectador y es elegible bajo el BranchGroup (especificado en el constructor de PickObject) que interesecciona con el rayo que empieza en la posici�n del espectador y apunta a la direcci�n (xpos, ypos) en el espacio de la ventana.

Node pickNode(SceneGraphPath sgPath, int node_types)

Devuelve una referencia a un nodo elegible que es del tipo especificado que est� contenido en el SceneGraphPath especificado. Donde node_types es la OR l�gica de uno o m�s: PickObject.BRANCH_GROUP, PickObject.GROUP, PickObject.LINK, PickObject.MORPH, PickObject.PRIMITIVE, PickObject.SHAPE3D, PickObject.SWITCH, PickObject.TRANSFORM_GROUP.

Node pickNode(SceneGraphPath sgPath, int node_types, int occurrence)

Devuelve una referencia a un nodo elegible que es del tipo especificado que est� contenido en el SceneGraphPath especificado. Donde node_types est� definido en el m�todo anterior. El par�metro occurrence indica qu� objeto devolver.

Interface PickingCallback

El interface PickingCallback proporciona un marco de trabajo para extender una clase de selecci�n existente. En particular cada una de las clases espec�ficas implementa este interface permitiendo al programador proporcionar un m�todo que sea llamado cuando la operaci�n de selecci�n tenga lugar.

Sumario de M�todos del Interface PickingCallback

Paquete: com.sun.j3d.utils.behaviors.picking

void transformChanged(int type, TransformGroup tg)

Llamado por el Behavior Pick que es retro-llamado que es registrado cada vez que se intenta la selecci�n. Los valores de tipos v�lidos son: ROTATE, TRANSLATE, ZOOM o NO_PICK (el usuario hace una selecci�n pero no hay nada seleccionado realmente).

Clase Intersect

La clase Intersect proporciona varios m�todos para comprobar la intersecci�n de un objeto PickShape (clase coraz�n) y geometr�as primitivas. Esta clases es �til para la creacci�n de clases picking personalizadas.

Sumario de Constructores de Intersect

Paquete: com.sun.j3d.utils.behaviors.picking

Extiende: java.lang.Object

Contiene m�todos est�ticos para ayudar a las comprobaciones de intersecci�n entre varias clases PickShape y geometr�as primitivas (como quad, triangle, line y point).

Intersect()

Crea un objeto intersect.

Lista Parcial de M�todos de Intersect

Esta clase tiene vaios m�todos de intersecci�n, algunos de los cuales s�lo se diferencian por un tipo de par�metro. Por ejemplo el m�todo: boolean pointAndPoint(PickPoint point, Point3f pnt) se diferencia del segundo m�todo listado aqu� en el tipo del par�metro pnt. La mayor�a de los m�todos listado aqu� con un par�metro del tipo Point3d tienen un m�todo correspondiente con un par�metro del tipo Point3f.

boolean pointAndLine(PickPoint point, Point3d[] coordinates, int index)

Devuelve true si el PickPoint y el objeto Line interseccionan. coordinates[index] y coordinates[index+1] definen la l�nea.

boolean pointAndPoint(PickPoint point, Point3d pnt)

Devuelve true si el PickPoint y el objeto Point3d interseccionan.

boolean rayAndLine(PickRay ray, Point3d[] coordinates, int index,
double[] dist)

Devuelve true si el PickPoint y el objeto Line interseccionan. coordinates[index] y coordinates[index+1] definen la l�nea.

boolean rayAndPoint(PickRay ray, Point3d pnt, double[] dist)

Devuelve true si el PickPoint y el objeto Point3d interseccionan.

boolean rayAndQuad(PickRay ray, Point3d[] coordinates, int index,
double[] dist)

Devuelve true si el PickPoint y el objeto cuadril�tero interseccionan.

boolean rayAndTriangle(PickRay ray, Point3d[] coordinates, int index,
double[] dist)

Devuelve true si el tri�ngulo intersecciona con el rayo, la distancia desde el origen del rayo al punto de intersecci�n, se almacena en dist[0]. coordinates[index], coordinates[index+1], ycoordinates[index+2] definen el tri�ngulo.

boolean segmentAndLine(PickSegment segment, Point3d[] coordinates, int index,
double[] dist)

Devuelve true si la l�na intersecciona con el segmento; la distanta desde el inicio del segmento a la intersecci�n se almacena dist[0]. coordinates[index] y coordinates[index+1] definen la l�nea.

boolean segmentAndPoint(PickSegment segment, Point3d pnt, double[] dist)

Devuelve true si el PickSegment y el objeto Point3d interseccionan.

boolean segmentAndQuad(PickSegment segment, Point3d[] coordinates, int index,
double[] dist)

Devuelve true si el quad intersecciona con el segmento; la distancia desde el inicio del segmento al punto de intersecci�n se almacena en dist[0].

boolean segmentAndTriangle(PickSegment segment, Point3d[] coordinates,
int index, double[] dist)

Devuelve true si el triangulo intersecciona con el segmento; la distancia desde el inicio del segmento al punto de intersecci�n se almacena en dist[0].

.�Clases de Comportamientos Picking Espec�ficas

Incluidas en el paquete com.sun.j3d.utils.behaviors.picking hay clases de comportamientos espec�ficas: PickRotateBehavior, PickTranslateBehavior, y PickZoomBehavior. Estas clases permiten al usuario interactuar con un objeto seleccionado con el rat�n. Los comportamientos individuales responden a los diferentes botones del rat�n (izquierdo=rotar, derecho=trasladar, central=zoom). Estas clases son subclases de PickMouseBehavior.

Los objetos de estas clases pueden incorporarse en mundos virtuales de Java 3D para proporcionar interacci�n siguiendo la receta anterior. Como todas estas clases implementan el interface PickingCallback, la operaci�n de elecci�n pueden mejorarse con una llamada a un m�todo definido por el usuario.

PickRotateBehavior

Esta clase permite al usuario seleccionar y rotar interactivamente un objeto visual. El usuario usa el bot�n izquierdo del rat�n para seleccionar y rotar. Se puede usar un ejemplar de PickRotateBehavior en conjunci�n con otras clases de selecci�n espec�ficas.

Sumario de Constructores de PickRotateBehavior

Paquete: com.sun.j3d.utils.behaviors.picking

Extiende: PickMouseBehavior

Implementa: PickingCallback

Un comportamiento de rat�n que permite al usuario seleccionar y rotar objetos de un escenario gr�fico; exp�ndible a trav�s de retro-llamada.

PickRotateBehavior(BranchGroup root, Canvas3D canvas, Bounds bounds)

Crea un comportamiento que espera eventos del rat�n en el escenario gr�fico.

PickRotateBehavior(BranchGroup root, Canvas3D canvas, Bounds bounds,
int pickMode)

Crea un comportamiento que espera eventos del rat�n en el escenario gr�fico. El par�metro pickMode se especifica como uno de PickObject.USE_BOUNDS o PickObject.USE_GEOMETRY. Nota: si pickMode se selecciona a PickObject.USE_GEOMETRY, todos los objetos geom�tricos del escenario gr�fico est�n disponibles para su selecci�n y deben tener activado su ALLOW_INTERSECT.

Sumario de M�todos de PickRotateBehavior

void setPickMode(int pickMode)

Selecciona el componente pickMode de este PickRotateBehavior a uno de PickObject.USE_BOUNDS o PickObject.USE_GEOMETRY. Nota: si pickMode se selecciona a PickObject.USE_GEOMETRY, todos los objetos geom�tricos del escenario gr�fico est�n disponibles para su selecci�n y deben tener activado su ALLOW_INTERSECT.

void setupCallback(PickingCallback callback)

Registra la clase retrollamada a llamar cada vez que el objeto seleccionado se mueve.

void transformChanged(int type, Transform3D transform)

M�todo de retrollamda desde MouseRotate. Se usa cuando al selecci�n con retrollamada est� activa.

void updateScene(int xpos, int ypos)

Actualiza la escena para manipular cualquier nodo.

PickTranslateBehavior

Esta clase permite al usuario seleccionar y trasladar interactivamente un objeto visual. El usuario usa el bot�n derecho del rat�n para seleccionar y trasladar. Se puede usar un ejemplar de PickTranslateBehavior en conjunci�n con otras clases de selecci�n espec�ficas.

Sumario de Constructores de PickTranslateBehavior

Paquete: com.sun.j3d.utils.behaviors.picking

Extiende: PickMouseBehavior

Implementa: PickingCallback

Un comportamiento de rat�n que permite al usuario seleccionar y trasladar objetos de un escenario gr�fico; exp�ndible a trav�s de retro-llamada.

PickTranslateBehavior(BranchGroup root, Canvas3D canvas, Bounds bounds)

Crea un comportamiento que espera eventos del rat�n para el escenario gr�fico

PickTranslateBehavior(BranchGroup root, Canvas3D canvas, Bounds bounds,
int pickMode)

Crea un comportamiento que espera eventos del rat�n en el escenario gr�fico. El par�metro pickMode se especifica como uno de PickObject.USE_BOUNDS o PickObject.USE_GEOMETRY. Nota: si pickMode se selecciona a PickObject.USE_GEOMETRY, todos los objetos geom�tricos del escenario gr�fico est�n disponibles para su selecci�n y deben tener activado su ALLOW_INTERSECT.

Sumario de M�todos de PickTranslateBehavior

void setPickMode(int pickMode)

Selecciona el componente pickMode de este PickTranslateBehavior al valor pasado en pickMode.

void setupCallback(PickingCallback callback)

Registra la clase de retrollamada que ser� llamada cada vez que el objeto seleccionado se mueva.

void transformChanged(int type, Transform3D transform)

M�todo de retrollamada desde MouseTranslate. Se usa cuando la selecci�n por retrollamada est� activa.

void updateScene(int xpos, int ypos)

Actualiza la escena para manipular cualquier nodo.

PickZoomBehavior

Esta clase permite al usuario seleccionar y hacer zoom interactivamente un objeto visual. El usuario usa el bot�n central del rat�n para seleccionar y hacer zoom. Se puede usar un ejemplar de PickZoomBehavior en conjunci�n con otras clases de selecci�n espec�ficas.

Sumario de Constructores de PickZoomBehavior

Paquete: com.sun.j3d.utils.behaviors.picking

Extiende: PickMouseBehavior

Implementa: PickingCallback

Un comportamiento de rat�n que permite al usuario seleccionar y hacer zoom a objetos de un escenario gr�fico; exp�ndible a trav�s de retro-llamada.

PickZoomBehavior(BranchGroup root, Canvas3D canvas, Bounds bounds)

Crea un comportamiento que espera eventos del rat�n para el escenario gr�fico.

PickZoomBehavior(BranchGroup root, Canvas3D canvas, Bounds bounds,
int pickMode)

Crea un comportamiento que espera eventos del rat�n en el escenario gr�fico. El par�metro pickMode se especifica como uno de PickObject.USE_BOUNDS o PickObject.USE_GEOMETRY. Nota: si pickMode se selecciona a PickObject.USE_GEOMETRY, todos los objetos geom�tricos del escenario gr�fico est�n disponibles para su selecci�n y deben tener activado su ALLOW_INTERSECT.

Sumario de M�todos de PickZoomBehavior

void setPickMode(int pickMode)

Selecciona el componente pickMode de este PickZoomBehavior al valor pasado en pickMode.

void setupCallback(PickingCallback callback)

Registra la clase de retrollamada a llamar cada vez que el objeto se seleccione.

void transformChanged(int type, Transform3D transform)

Metodo de retrollamada desde MouseZoom. Se usa cuando la selecci�n con retrollamada est� activa.

void updateScene(int xpos, int ypos)

Actualiza la escena para manipular cualquier nodo.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO