Java 3D

La interaccin y la animacin se especifican con objetos Behavior. La clase Behavior es una subclase abstracta que proporciona el mecanismo para incluir cdigo que modifique el escenario grfico. La clase Behavior, y sus descendientes, son enlaces a cdigo del usuario que proporciona las modificaciones para los grficos y los sonidos del universo virtual.

El propsito del objeto Behavior en un escenario grfico es modificar el propio escenario grfico, o los objetos que hay dentro de l, en respuesta a algunos estmulos. Un estmulo puede ser una pulsacin de tecla, un movimiento del ratn, la colisin de objetos, el paso del tiempo, algn otro evento, o una combinacin de estos. Los cambios producidos incluyen la adiccin de objetos al escenario grfico, la eliminacin de objetos, cambio de atributos de los objetos del escenario grfico, reordenacin de los objetos del escenario grfico, o una combinacin de estos. Las posibilidades slo estn limitadas por las capacidades de los objetos del escenarios grfico.

.Aplicaciones de Behavior

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

La tabla no lista todas las combinaciones posibles, slo las ms simples (un estmulo resulta en un cambio). Algunas combinaciones de estmulos y cambios slo tienen sentido en un entorno especfico; estas se listan como "especficas de la aplicacin".

Estmulo Objeto del cambio

(razn para el cambio) TransformGroup
(los objetos visuales cambian la orientacin o la localizacin)
Geometry
(los objetos visuales cambian la forma o el color)
Scene Graph
(aadir, eliminar o intercambiar objetos)
View
(cambiar la localizacin o direccin de la vista)
usuario interaccin especfico de la aplicacin especfico de la aplicacin navegacin
colisiones Los objetos visuales cambian su orientacin o posicin Los objetos visuales cambian su apariencia con la colisin Los objetos visuales desaparecen con la colisin La vista cambia con la colisin
tiempo animacin animacin animacin animacin
Posicin de la Vista cartelera nivel de detalles (LOD) especfico de la aplicacin especfico de la aplicacin

La cosas naturales, como los rboles, utilizan una tremenda cantidad de geometra para representar de forma segura todas la estructura de ramas, hojas y tronco. Una alternativa es usar un polgono texturado en lugar de la geometra. Esta tcnica algunas veces es referida como la aproximacin cartelera. Esto es cierto especialmente cuando se usa un comportamiento para orientar automticamente el polgono texturado hacia el espectador para que slo se vea el frente de la superficie texturada. Este comportamiento de orientacin se llama comportamiento cartelera.

Esta aproximacin es efectiva cuando el objeto a representar por la textura est lejano para que las partes individuales del objeto visual no sean fcilmente 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 clculo para representar todas las hojas del rbol. Esta tcnica est recomendada para cualquier aplicacin 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 polgono textura podra ser detectado por el espectador.

El comportamiento de nivel de detalle (LOD) tiene una aplicacin relacionada. Con LOD, los objetos visualmente complejos son representados por mltiples objetos visuales variando los niveles de detales (de ah su nombre). La representacin del objeto visual con menor nivel de detalle se usa cuando el espectador est lejos. La representacin con ms nivel de detalle se usa cuando el espectador est muy cerca. El comportamiento LOD cambia automticamente entre las representacin del objeto basndose 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 transformacin en respuesta a movimientos del ratn. Normalmente la transformacin de la vista se cambia por el comportamiento del ratn para cambiar la vista en respuesta a una accin del ratn.

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

Animacin contra Interaccin

Como la distincin entre animacin e interaccin usada en este tutorial est bastante bien, aqu hay un ejemplo para clarificar esta distincin. Si un usuario navega en un programa donde se proporciona un comportamiento, la vista se mover en respuesta a eventos del teclado y/o ratn. El movimiento de la plataforma de la vista es una interaccin porque es el resultado directo de una accin del usuario. Sin embargo, otras cosas podran 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.

.Introduccin a la clases Behavior

La Figura 4-1 muesta especializaciones de la clase Behavior creadas en el API de Java 3D. Tambin son posibles las clases especializadas de Behavior definidas por el usuarios y estn slo limitadas por la imaginacin del programador. Este mdulo del tutorial cubre cada una de las clases de la Figura 4-1. Este captulo cubre las clases sombreadas, el siguiente captulo cubre el resto.

.Behavior Bsico

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

Figura 4-1, rbol de Subclases de Behavior

.Escribir una Clase Behavior

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

Mecnismo de Behaviors

Una clase de comportamiento personalizado implementa los mtodos de inicializacin y processStimulus de la clase abstracta Behavior. Por supuesto, la clase de comportamiento personalizado, tambin tiene al menos un constructor y tambin podra tener otros mtodos.

La mayora de los comportamientos actuarn sobre un objeto del escenario grfico para afectar al comportamiento. El objeto sobre el que acta un comportamiento es referido como el objeto del cambio. Es a travs 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 mayora 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 mtodo de la clase de comportamiento personalizado debe almacenar esta informacin. En cualquier caso, la referencia se hace en el momento en que se construye el escenario grfico, que es el primer clculo de comportamiento.

El mtodo de inicializacin se invoca cuando el escenario grfico que contiene la clase de comportamiento se vuelve vivo. Este mtodo de iniciacin es responsable de seleccionar el evento de disparo inicial para el comportamiento y seleccionar la condicin inicial de las variables de estado del comportamiento. El disparo se especifica como un objeto WakeupCondition, o una combinacin de objetos WakeupCondition.

El mtodo processStimulus se invoca cuando ocurre el evento de disparo especificado para el comportamiento. Este mtodo es responsable de responder al evento. Como se pueden codificar muchos eventos en un slo objeto WakeupCondition (por ejemplo, varias acciones de teclado podran estr codificados en un WakeupOnAWTEvent), esto incluye la descodificacin del evento. El mtodo processStimulus responde al estmulo, 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 condicin de disparo
    actuar de acuerdo a la condicin de disparo
    resetar el disparo si es apropiado

La receta anterior muestra los pasos bsicos para crear una clase de comportamiento personalizada. Los comportamientos complejos podran requerir ms programacin que la descrita en la receta. El uso de un objeto Behavior es otro problema y se discute en una seccin 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 pulsacin 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 ms que los tres ingredientes esenciales que se listarn en la receta: un constructor, el mtodo initialization() y el mtodo processStimulus. El constructor almacenar la referencia al objeto TransformGroup. El mtodo initialization() selecciona el disparo inicial a WakeOnAWTEvent, y el ngulo de rotacin a cero. Como se mencion antes, el estmulo para un comportamiento se especifica como un objeto WakeupCondition.

Cmo slo hay una posible condicin de disparo, el mtodo processStimulus no la descodifica. Es posible posteriormente descodificar el evento de pulsacin de tecla para determinar qu tecla, o combinacin de teclas, se puls.

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

El Fragmento de Cdigo 4-1 presenta la clase SimpleBehavior (SimpleBehaviorApp.java) que es una implementacin de la clase de comportamiento personalizada. Las sentencias import son necesarias para esta clase. java.awt.event es necesaria para la interaccin 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. Tambin son necesarias las sentencias import normales del API Java 3D.

Fragmento de Cdigo 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 slo demuestra la programacin bsica necesaria para este comportamiento sencillo. Se pude mejorar, por ejemplo, se podran seleccionar el ngulo y/o el eje de rotacin por mtodos de la clase. La clase podra adems personalizarse con un mtodo para seleccionar una tecla especfica, o conjunto de teclas, a las que responder.

Otra mejora definitiva de la clase podra prevenir la sobrecarga de la variable del ngulo, en la clase actual, el valor para el ngulo podra crecer sin lmites 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 excepcin en tiempo de ejecucin.

Riesgos de Programacin al Escribir Clases Behavior

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

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

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

Como estos dos mtodos (initialization() y processStimulus()) son llamados por el sistema Java 3D, deben volver para permitir que contine el renderizado. Por ejemplo, si se desea un ejemplo peonza, el ngulo y el TransformGroup necesitan actualizarse peridicamente. Si nuestro comportamiento implementa este comportamiento sin deshilar un thread, no se renderizar nada ms. Tambin, hay una forma mucho mejor para conseguir este tipo de comportamiento.

.Usar una Clase Behavior

Encontrar o escribir la clase behavior apropiada para nuestra aplicacin es el principio para escribir un programa Java 3D interactivo. Esta seccin cubre los problemas de programacin en la adiccin de objetos behavior a los programas.

El primer paso implica el asegurarnos de que el escenario grfico hace provisiones para el behavior. Por ejemplo, para usar la clase SimpleBehavior de la seccin anterior debe haber un TransformGroup en el escenario grfico sobre el objeto a rotar. Muchos comportamientos slo necesitan un nico objeto TransformGroup; sin embargo, los requerimientos de un escenario grfico para una comportamiento dependen de la aplicacin y del propio comportamiento y podran ser ms complejos.

Habiendo establecido el soporte para un comportamiento, se debe aadir un ejemplar de la clase al escenario grfico. Sin ser una parte de un escenario grfico vivo, no hay forma de poder inicializar un comportamiento. De hecho, un objeto behavior que no es parte de un escenario grfico se convertir en basura y ser eliminado en la prxima recoleccin.

El ltimo paso para aadir comportamiento es proporcionar unos lmites para el comportamiento. Para mejorar la eficiencia, Java 3D usa los lmites para realizar el recorte de ejecucin. El comportamiento slo est activo cuando sus lmites interseccionan un volumen de activacin de la ViewPlatform. Solo los comportamientos activos son elegibles para recibir estmulos. De esta forma, los estmulos pueden ser ignorados por algunos comportamientos. El programador tiene control sobre el recorte de ejecucin a travs de la seleccin de los lmites del comportamiento.

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

  1. preparar el escenario grfico (aadiendo un TransformGroup u otros objetos necesarios)
  2. insertar el objeto behavior en el escenario grfico, referenciando el objeto del cambio
  3. especificar los lmites (o SchedulingBoundingLeaf)
  4. seleccionar la capacidades de escritura (y lectura) del objeto fuente (segn sea apropiado)

El Fragmento de Cdigo 4-2 es un extracto del programa de ejemplo SimpleBehaviorApp.java y es la continuacin del Fragmento de Cdigo 4-1

Fragmento de Cdigo 4-2, El mtodo 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 cdigo para completar el programa de los fragmentos de cdigo 4-1 y 4-2. El programa completo est en: SimpleBehaviorApp.java. La aplicacin completa renderiza un objeto ColorCube en una escena esttica hasta que se pulsa una tecla. En respuesta a la pulsacin de la tecla, el ColorCube rota 0,1 radianes (unos 6). La Figura 4-4 muestra el diagrama del escenario grfico para la rama de contenido grfico de esta aplicacin.

Figura 4-4, Diagrama del Escenario Grfico de la Rama de Contenido Grfico de SimpleBehaviorApp.java.

El diagrama anterior muestra claramente la relacin 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 porcin de una escena grfica que sea hija de un objeto TransformGroup.

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

Riesgos de Programacin al usar Objetos Behavior

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

  • no especificar (correctamente) los lmites, y
  • no aadir un behavior al escenario grfico.

La interseccin de los lmites de un behavior con el volumen de activacin de una vista determina si el evento Java 3D considera el disparo del estmulo para el behavior. Java 3D no avisar si no ponemos los lmites -- el comportamiento nunca se disparar. Tambin debemos mantener los lmites de cada objeto behavior tan pequeos como sea posible para una mejora global del rendimiento.

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

Dnde Debera ir un Objeto Behavior en un Escenario Grfico?

Los comportamientos pueden situarse en cualquier lugar del escenario grfico. Los problemas para esta localizacin son: 1) el efecto de los lmites, y 2) el mantenimiento del cdigo.

El objeto bounds referenciado por un objeto behavior est sujeto al sistema local de coordenadas creado en SimpleBehaviorApp, el objeto SimpleBehavior y ColorCube no estn sujetos al mismo sistema local de coordenadas. En la aplicacin de ejemplo esto no crea un problema. El objeto TransformGroup del ejemplo slo rota el ColorCube para que los lmites del objeto myRotationBehavior siempre encierren el objeto ColorCube permitiendo la interaccin con el ColorCube cuando es visible.

Sin embargo, si el objeto TransformGroup se usara para trasladar el objeto ColorCube, sera posible moverlo fuera de la vista. Como el objeto bounds permanece con el objeto behavior en la escena, el usuario podra continuar moviendo el objeto. Mientras que el volumen de activacin de una vista interesecciona los lmites 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 activacin no intersecciona con lmites del comportamiento, incluso para incluir el objeto visual, el comportamiento est inactivo. Por eso el objeto visual con el que queremos interactuar podra estar a nuestra vista pero inactivo. La mayora de los usuarios consideran esto un problema (incluso si es intencional).

Hay dos soluciones a este problema. Una es cambiar el escenario grfico para mantener los lmites del comportamiento con el objeto visual. Esto se consigue fcilmente como se demuestra en la Figura 4-5. La solucin alternativa usa un objeto BoundingLeaf para los lmites.

Figura 4-5, Una alternativa a la situacin del escenario grfico para el objeto Behavior en SimpleBehaviorApp.

Recomendaciones de Diseo para la Clase Behavior

El mecanismo de escritura de un comportamiento personalizado es sencillo. Sin embargo, deberamos 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 trmino para la creaccin de objetos innecesarios en Java. La quema de memoria excesiva causar la recoleccin de basura. Las pausas ocasionales en el renderizado son tpicas de la quema de memoria ya que durante la recoleccin de basura, el renderizado se parar.

Los mtodos de la clase Behavior frecuentemente son responsables de crear problemas de quema de memoria. Por ejemplo, en el Fragmento de Cdigo 4-1 el processStimulus usa un 'new' en la invocacin de wakeupOn (lnea 24). Esto causa que se cree un nuevo objeto cada vez que se invoca a este mtodo. El objeto se convierte en basura cada vez que se dispara el comportamiento.

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

.API de la Clase Behavior

Esta seccin 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. Adems, hay muchas clases behavior existentes en los paquetes de utilidad de Java 3D. Como una extensin de la clase Leaf, los ejemplares que extienden Behavior pueden ser hijos de un group en un escenario grfico.

Figura 4-6, rbol de Clases de Behavior

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

El mtodo wakeupOn() se usa en los mtodos initialize() y processStimulus() para seleccionar el disparo para el comportamiento. El parmetro de este mtodo es un objeto WakeupCondition. En secciones posteriores veremos WakeupCondition, y las clases relacionadas.

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

El mtodo setEnable() proporciona la forma de desactivar un comportamiento incluso si los lmites estn activos. El valor por defecto es true (es decir, el objeto comportamiento est activado).

Un objeto behavior est activo slo cuando sus lmites intereseccionan con el volumen de activacin de un View. Como es posible tener varias vistas en un universo virtual, un comportamiento puede hacerse activo por ms de una vista.

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

Sumario de Mtodos 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 estmulo para este comportamiento.

void setEnable(boolean state)

Activa o desactiva este comportamiento.

void setSchedulingBoundingLeaf(BoundingLeaf region)

Selecciona la regin de lmites del comportamiento con los lmites del leaf especificado.

void setSchedulingBounds(Bounds region)

Selecciona la regin de lmites del comportamiento con los lmites especificados.

void wakeupOn(WakeupCondition criteria)

Define este criterio de disparo del comportamiento.

API ViewPlatform

Los Comportamientos estn activos (dispuestos para ser disparados) slo cuando sus lmites (o BoundingLeaf) intersecciona con el volumen de activacin de una ViewPlatform.

Lista Parcial de Mtodos de la Clase ViewPlatform

Estos mtodos de la clase ViewPlatform obtienen y seleccionan el radio del volumen de activacin (esfera). El valor por defecto es 62.

float getActivationRadius()

Obtiene el radio de activacin del ViewPlatform.

void setActivationRadius(float activationRadius)

Selecciona el radio de activacin del ViewPlatform que define un volumen de activacin alrededor de la plataforma.

.Condiciones de Disparo: Cmo se Disparan los Comportamientos

Los comportamientos activados se disparan por la ocurrencia de uno o ms 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 composicin de mltiples condiciones de disparo en una nica condicin de disparo. La Figura 4-7 muestra el rbol de clases.

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

Una condicin de disparo para un objeto behavior se puede especificar como un criterio de disparo especfico o como una combinacin de criterios usando clases compuestas. Las siguientes secciones describen WakeupCondition y sus subclases.

.WakeupCondition

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

Sumario de Mtodos de WakeupCondition

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

Enumeration allElements()

Devuelve una enumeracin con todos los objetos WakeupCriterion en esta condicin.

Enumeration triggeredElements()

Devuelve una enumeracin de todos los objetos WakeupCriterion disparados en esta condicin.

.WakeupCriterion

WakeupCriterion es una clase abstracta para todas las clases wakeup. WakeupCriterion slo proporciona un mtodo: hasTriggered. Probablemente no necesitaremos usar este mtodo ya que el mtodo triggeredElements de WakeupCondition realiza esta operacin por nosotros.

Sumario de Mtodos de WakeupCriterion

boolean hasTriggered()

Devuelve true si el criterio dispar el comportamiento.

.Clases WakeupCriterion Especficas

La Tabla 4-2 presenta las 14 clases WakeupCriterion especficas. 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 deteccin de una interseccin del volumen de activacin de un ViewPlatform con la regin lmite del objeto.
WakeupOnAWTEvent cuando ocurre un evento AWT especfico
WakeupOnBehaviorPost cuando un objeto behavior enva un evento especfico
WakeupOnCollisionEntry en la primera deteccin de colisin del objeto especificaco con otro objeto del escenario grfico.
WakeupOnCollisionExit cuando el objeto especifico no colisiona con ningn otro objeto del escenario grfico.
WakeupOnCollisionMovement cuando el objeto especificado se mueve mientras colisiona con otro objeto del escenario grfico
WakeupOnDeactivation cuando el volumen de activacin de un ViewPlatform deja de intereseccionar con los lmites del objeto
WakeupOnElapsedFrames cuando ha pasado un nmero determinado de frames
WakeupOnElapsedTime cuando ha pasado un nmero de segundos determinado
WakeupOnSensorEntry en la primera deteccin de cualquier sensor que intersecciona con los lmites especificados
WakeupOnSensorExit cuando un sensor que interseccionava con los lmites del objeto deja de interseccionar con los lmites especificados
WakeupOnTransformChange cuando cambia la transformacin dentro de un TransformGroup especificado
WakeupOnViewPlatformEntry en la primera deteccin de interseccin del volumen de activacin de un ViewPlatform con los lmites especificados
WakeupOnViewPlatformExit cuando el volumen de activacin de una vista deja de intereseccionar con los lmites especificados

Comentarios Generales sobre WakeupCriterion

Varias clases WakeupCriterion se disparan con la "primera deteccin" de un evento. Lo que significa que el criterio slo se disparar una vez por cada evento. Por ejemplo, un objeto WakeupOnActivation disparar la interseccin del volumen de activacin de un ViewPlatform y la regin de lmites del objeto behavior asociado. Mientras que la interseccin 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 ms no se podr disparar de nuevo el WakeupCondition.

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

WakeupOnActivation

Es posible que una regin de lmites interseccione con el volumen de activacin de un ViewPlatform tan brevemente que no sea detectada. Consecuentemente, no se disparar ninguna condicin de Activation o Deactivation. Bajo estas circunstancias, el comportamiento no se activa nunca.

Sumario de Constructores de WakeupOnActivation

Extiende: WakeupCriterion

Esta clase especifica la condicin de disparo en la primera deteccin de una intereseccin del volumen de activacin de un ViewPlatform con la regin lmite de su objeto. WakeupOnActivation est emparejado con WakeupOnDeactivation que veremos ms adelante.

WakeupOnActivation()

Construye un nuevo criterio WakeupOnActivation.

WakeupOnAWTEvent

Varias de las clases WakeupCriterion tienen constructores y mtodos dependientes del disparo. Por ejemplo, WakeupOnAWTEvent tiene dos constructores y un mtodo. Los constructores permiten la especificacin de eventos AWT usando constantes de clases AWT. El mtodo 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 especfico.

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 mtodos de WakeupOnAWTEvent

AWTEvent[] getAWTEvent()

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

WakeupOnBehaviorPost

La condicin WakeupOnBehaviorPost junto con el mtodo postID de la clase Behavior proporcionan un mecanismo a travs del cual se pueden coordinar los comportamientos. Un objeto Behavior puede postear un valor entero ID particular. Otro comportamiento puede especificar su condicin de disparo, usando un WakeupOnBehaviorPost, cmo enviando un ID particular desde un objeto Behavior especfico. Esto permite la creaccin de objetos Behavior parentales como que uno abra una puerta y otro diferente la cierre. Para esta materia, incluso se pueden formular comportamientos ms complejos usando comportamientos y coordinacin posterior.

Sumario de Constructores de WakeupOnBehaviorPost

Extiende: WakeupCriterion

Esta clase especifica un disparo de un objeto Behavior cuando un comportamiento especfico postea un evento especfico.

WakeupOnBehaviorPost(Behavior behavior, int postId)

Construye un nuevo criterio WakeupOnBehaviorPost.

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

Sumario de Mtodos 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 Cdigo 4-3 y el Fragmento de Cdigo 4-4 muestran un cdigo parcial para un programa de ejemplo que usa posteo de comportamientos para coordinar comportamientos. El ejemplo abre y cierra una puerta. El cdigo incluye una clase: OpenBehavior, y el cdigo 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 condicin es compartida en el mtodo initialization (y el comportamiento opuesto completado).

Fragmento de Cdigo 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 Cdigo 4-4, cdigo 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 respondern en estricta alternancia a los eventos de pulsacin de teclas. El comportamiento OpenBehavior se disparar en respuesta a la primera pulsacin. En su respuesta, seala el comportamiento CloseBehavior y selecciona su condicin de disparo para que sea una seal para este objeto. El objeto CloseBehavior selecciona su condicin de disparo para que sea una pulsacin de tecla en respuesta a la seal desde el objeto OpenBehavior. Puedes encontrar un programa de ejemplo en DoorApp.java.

La siguiente pulsacin de tecla dispara el objeto CloseBehavior. Este objeto ahora realiza la misma funcin que acaba de realizar el objeto OpenBehavior: enva una seal y resetea su propia condicin de disparo. El objeto CloseBehavior cierra la puerta en respuesta a la pulsacin de tecla. De vuelta a las condiciones iniciales, la siguiente pulsacin empezar de nuevo todo el proceso.

WakeupOnCollisionEntry

Java 3D puede detectar la colisin de objetos en el mundo virtual. Hay tres clases WakeupCriterion tiles para procesar la colisin 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 estn en colisin hay un movimiento relativo entre los objetos. Finalmente, un slo WakeupOnCollisionExit se diparar cuando finalice la colisin.

Java 3D slo puede manejar una colisin por cada objeto a la vez. Una vez que se ha detectado una colisin de un objeto, las colisiones con otros objetos no se detectarn hasta que finalice la primera colisin. Tambin puede ocurrir que una colisin sea tan breve que no sea detectada y por lo tanto no se disparar ninguna condicin.

La deteccin de colisiones es ms compleja que esta discusin sobre las condiciones de disparo. Sin embargo este tutorial no cubre la deteccin de colisiones en detalle, para esto puedes referirte a la Especificacin del API Java 3D.

Sumario de Constructores de WakeupOnCollisionEntry

Extiende: WakeupCriterion

Esta clase especifica un disparo en la primera deteccin de colisin de un objeto especificado con otro objeto en el escenario grfico. Tambin 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 lmites geomtircos como una aproximacin al clculo de colisiones.
  • USE_GEOMETRY - Usa geometra en el clculo 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 colisin de un objeto especificado con otro objeto en el escenario grfico. Tambin 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 lmites geomtircos como una aproximacin al clculo de colisiones.
  • USE_GEOMETRY - Usa geometra en el clculo 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 Mtodos de WakeupOnCollisionExit

Bounds getArmingBounds()

Devuelve los lmites del objeto usado en la especificacin de la condicin de colisin.

SceneGraphPath getArmingPath()

Devuelve el path usado en la especificacin de la condicin de colisin.

Bounds getTriggeringBounds()

Devuelve el objeto Bounds que caus la colisin.

SceneGraphPath getTriggeringPath()

Devuelve el path que describe el objeto que caus la colisin.

WakeupOnCollisionMovement

Sumario de Constructores de WakeupOnCollisionMovement

Extiende: WakeupCriterion

Esta clase especifica un disparo cuando el objeto especificado se mueve durante la colisin con otro objeto en el escenario grfico. Tambin 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 lmites geomtircos como una aproximacin al clculo de colisiones.
  • USE_GEOMETRY - Usa geometra en el clculo 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 Mtodos de WakeupOnCollisionMovement

Bounds getArmingBounds()

Devuelve el objeto Bounds usado para especificar la condicin de colisin.

SceneGraphPath getArmingPath()

Devuelve el path usado en la especificacin de la condicin de colisin.

Bounds getTriggeringBounds()

Devuelve el objeto Bounds que caus la colisin.

SceneGraphPath getTriggeringPath()

Devuelve el path que describe el objeto que caus la colisin.

WakeupOnDeactivation

Sumario de Constructores de WakeupOnDeactivation

Extiende: WakeupCriterion

Esta clase especifica un disparo para la primera deteccin de que el volumen de activacin deja de interseccionar con la regin de lmites de este objeto. Tambin puedes ver WakeupOnActivation.

WakeupOnDeactivation()

Construye un nuevo criterio WakeupOnDeactivation.

WakeupOnElapsedFrames

El objeto WakeupOnElapsedFrames se usa para disparar un objeto activo despus de que haya pasado un nmero 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 nmero especificado de frames.

WakeupOnElapsedFrames(int frameCount)

Construye un nuevo criterio WakeupOnElapsedFrames.

Sumario de Mtodos 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 despus de que hayan pasado un nmero de milisegundos especificado.

WakeupOnElapsedTime(long milliseconds)

Construye un nuevo criterio WakeupOnElapsedTime.

Sumario de Mtodos de WakeupOnElapsedTime

long getElapsedFrameTime()

Devuelve el valor de tiempo que se utiliz en la construccin de este objeto.

WakeupOnSensorEntry

En Java 3D, cualquier dispositivo de entrada distinto del teclado o el ratn 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 interseccin del punto caliente de un sensor con una regin puede detectarse con las clases WakeupOnSensorEntry y WakeupOnSensorExit.

Es posible que un sensor entre y salga de una regin armada tan rpidamente que ninguna de las condiciones se dispare.

Sumario de Constructores de WakeupOnSensorEntry

Extiende: WakeupCriterion

Esta clase especifica un disparo en la primera deteccin de la interseccin de cualquier sensor con los lmites especificados.

WakeupOnSensorEntry(Bounds region)

Construye un nuevo criterio WakeupOnEntry.

Sumario de Mtodos de WakeupOnSensorEntry

Bounds getBounds()

Devuelve la especificacin de lmites de este objeto.

WakeupOnSensorExit

Sumario de Constructores de WakeupOnSensorExit

Extiende: WakeupCriterion

Esta clase especifica un disparo en la primera deteccin de que un sensor que previamente intereseccionaba con los lmites deja de intereseccionar con los lmites especificados. Tambin puedes ver WakeupOnSensorEntry.

WakeupOnSensorExit(Bounds region)

Construye un nuevo criterio WakeupOnExit.

Sumario de Mtodos de WakeupOnSensorExit

Bounds getBounds()

Devuelve la especificacin de lmites de este objeto.

WakeupOnTransformChange

El criterio WakeupOnTransformChange es til para detectar cambios en la posicin o la orientacin de objetos visuales en el escenario grfico. Este criterio ofrece un alternativa a usar el mtodo 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 transformacin dentro de un TransformGroup especificado.

WakeupOnTransformChange(TransformGroup node)

Construye un nuevo criterio WakeupOnTransformChange.

Sumario de Mtodos de WakeupOnTransformChange

TransformGroup getTransformGroup()

Devuelve el nodo TransformGroup usado en la creaccin de este WakeupCriterion

WakeupOnViewPlatformEntry

La deteccin de la interseccin del ViewPlatform con una regin especificada se hace posible con las clases del criterio de WakeupOnViewPlatfomEntry y de WakeupOnViewPlatformExit.

Es posible que el lmite especificado interseccione con un volumen de la activacin 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 interseccin del ViewPlatform con los lmites especificados.

WakeupOnViewPlatformEntry(Bounds region)

Construye un nuevo criterio WakeupOnEntry.

Sumario de Mtodos de WakeupOnViewPlatformEntry

Bounds getBounds()

Devuelve la especificacin de lmites de este objeto.

WakeupOnViewPlatformExit

Sumario de Constructores de WakeupOnViewPlatformExit

Extiende: WakeupCriterion

Esta Class especifica un disparo en la primera deteccin de un Viewplatform que deja de interseccionar con el lmite especificado. Tambin puedes ver WakeupOnViewPlatformEntry.

WakeupOnViewPlatformExit(Bounds region)

Construye un nuevo criterio WakeupOnExit.

Sumario de Mtodos de WakeupOnViewPlatformExit

Bounds getBounds()

Devuelve la especificacin de lmites de este objeto

.WakeupCondition Composition

Varios objetos WakeupCriteron pueden componer un solo WakeupCondition usando las cuatro clases presentadas en esta seccin. Las primeras dos clases permiten la composicin de un WakeupCondition desde una coleccin de objetos WakeupCriterion que son lgicamente ANDed u ORed juntos, respectivamente. El tercero y siguientes permiten la composicin de ejemplares de las dos primeras clases en objeto WakeupCondition ms complejos.

WakeupAnd

Sumario de Constructores de WakeupAnd

Extiende: WakeupCondition

Esta clase especifica cualquier nmero de criterios de disparo que son (AND) juntos de forma lgica.

WakeupAnd(WakeupCriterion[] conditions)

Construye una nueva condicin WakeupAnd.

WakeupOr

Sumario de Consctructores de WakeupOr

Extiende: WakeupCondition

Esta clase especifica cualquiere nmero de criterios de disparo que son (OR) juntos de forma lgica.

WakeupAnd(WakeupCriterion[] conditions)

Construye una nueva condicin WakeupOr.

WakeupAndOfOrs

Sumario de Consctructores de WakeupAndOfOrs

Extiende: WakeupCondition

Esta clase especifica cualquier nmero de criterios de disparo WakeupOr que son (AND) juntos de forma lgica.

WakeupAndOfOrs(WakeupOr[] conditions)

Construye una nueva condicin WakeupAndOfOrs.

WakeupOrOfAnds

Sumario de Consctructores de WakeupOrOfAnds

Extiende: WakeupCondition

Esta clase especifica cualquier nmero de criterios de disparo WakeupAnd que son (OR) juntos de forma lgica.

WakeupOrsOfAnds(WakeupAnd[] conditions)

Construye una nueva condicin WakeupOrOfAnds.

.Clases de Comportamientos tiles para la Navegacin por Teclado

Hasta este momento, el espectador ha estado en una localizacin fija con una orientacin fija. El poder mover el espectador es una capacidad importante en muchas aplicaciones de los grficos 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 grfica bsica para un universo virtual de Java 3D. En esta figura, se considera la plataforma de la visin transform. Si se cambia la transformacin, el efecto es mover, o reorientar, o ambas, al espectador. De esto, podemos ver que el diseo bsico de la navegacin del teclado es simple: hacemos que un objeto behavior cambie la transformacin de la vista de la plataforma en respuesta a los movimientos dominantes.

Este diseo simple es exactamente el modo de trabajo de las clases utilitarias del teclado de Java 3D. Por supuesto podramos construir nuestro propio comportamiento de navegacin del teclado. El resto de esta seccin explica cmo utilizar las clases de la navegacin del teclado de Java 3D.

Figura 4-8, la Rama Grfica Bsica mostrando la Transformacin de la Vista de la Plataforma

Cmo Navegar en un SimpleUniverse

Podra 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 combinacin de mtodos para extraer el objeto ViewPlatformTransform. Por lo tanto, podemos tener nuestro SimpleUniverse y navegar en l tambin!

Especficamente, la siguiente lnea de cdigo extrae el ViewPlatformTransform de un objeto de SimpleUniverse, su.

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

.Programa de Ejemplo de KeyNavigatorBehavior

Es fcil utilizar la clase de utilidad KeyNavigatorBehavior en un programa de Java 3D. Esta seccin 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 idnticos 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 transformacin
  2. aadir el objeto KeyNavigatorBehavior al escenario grfico
  3. proporcionar unos lmites (o BoundingLeaf) para el objeto KeyNavigatorBehavior

Como cualquier problema de programacin, hay una variedad de maneras de implementar los pasos de esta receta. Un acercamiento es incorporar estos pasos en el mtodo de createSceneGraph. El Fragmento de Cdigo 4-5 muestra los pasos de la receta segn la implementacin para el programa del ejemplo de KeyNavigatorApp.java.

Fragmento de Cdigo 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 ejecucin del paso 1 de la receta en el mtodo de createSceneGraph requiere el acceso al grupo de transformacin de ViewPlatform. Esta implementacin pasa el objeto SimpleUniverse (lnea 34 del Fragmento de Cdigo 4-6) al mtodo createSceneGraph que lo hace disponible para tener acceso a la transformacin de ViewPlatform (la lnea 12 del Fragmento de Cdigo 4-5).

Pasar el objeto SimpleUniverse al mtodo de createSceneGraph permite acceder a otras caractersticas de la rama grfica de la vista de SimpleUniverse, tales como PlatformGeometry, ViewerAvatar, o de agregar un BoundingLeaf a la rama grfica de la vista.

La lneas 13 a 15 del Fragmento de Cdigo 4-5 proporcionan una posicin inicial para el espectador. En este caso, el espectador se mueve a una posicin 0,3 metros sobre el origen del mundo virtual. Esto es solamente una posicin inicial, y de ninguna manera limita la posicin futura o la orientacin del espectador.

Fragmento de Cdigo 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)

Cmo Crear una Aplicacin Universal de un Comportamiento

Como con cualquier objeto comportamiento, el objeto KeyNavigtorBehavior est solo activo cuando sus lmites interseccionan con el volumen de activacin de un ViewPlatform. Esto puede estar particularmente limitado para un comportamiento de navegacin, donde el comportamiento debe siempre estar activado. El Captulo 3 discute una solucin a este problema usando un BoundingLeaf.

.Clases KeyNavigatorBehavior y KeyNavigator

La utilidad de navegacin del teclado se implementa como dos clases. En el tiempo de ejecucin 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 tpicas de una clase de comportamiento, excepto que llama al objeto KeyNavigator para realizar la funcin 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 aceleracin.

Movimientos de KeyNavigatorBehavior

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

v mover hacia atrs

PgUp rotar arriba translacin hacia arriba
PgDn rotar abajo translacin 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 transformacin de la vista de la plataforma.

KeyNavigatorBehavior(TransformGroup targetTG)

Construye un nuevo comportamiento de navegacin por teclado que opera sobre el grupo de transformacin especificado.

Sumario de Mtodos de KeyNavigatorBehavior

void initialize()

Sobreescribe el mtodo initialize de Behavior para configurar los criterios de disparo.

void processStimulus(java.util.Enumeration criteria)

Sobreescribe el mtodo stimulus de Behavior para manejar el evento.

.Clases de Utilidad para Interactuar con el Ratn

El paquete de comportamientos de ratn (com.sun.j3d.utils.behaviors.mouse) contiene las clases del comportamiento en las cuales el ratn se utiliza como entrada de informacin para la interaccin con los objetos visuales. Incluyendo las clases para traslaciones (movindose en un plano paralelo a la placa de la imagen), enfocando (que mueve hacia atrs y adelante), y los objetos visuales que rotan en respuesta a los movimientos del ratn.

La siguiente tabla resume las tres clases especficas del comportamiento del ratn incluidas en el paquete. Adems de estas tres clases, est la clase abstracta MouseBehavior, y el interface MouseCallback. Esta clase abstracta y el interface se utilizan en la creacin de las clases especficas del comportamiento del ratn y son tiles para crear comportamientos personalizados del ratn.

Sumario de las clases espcificas de MouseBehavior

Clase MouseBehavior Accin en Respuesta a la Accin del Ratn Accin del ratn
MouseRotate rota el objeto visual sin moverlo botn izquierdo pulsado con movimiento del ratn
MouseTranslate translada el objeto visual en un plano paralelo al plato de imagen boton derecho pulsado con movimiento del ratn
MouseZoom translada el objeto visual en un plano orthogonal al plato de imagen botn central pulsado con movimiento del ratn

.Usar las Clases de Comportamiento del Ratn

La clases de comportamientos especficos del ratn son fciles 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 lmites (o BoundingLeaf) para el objeto MouseBehavior
  5. aadir el objeto MouseBehavior al escenario grfico

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. Tambin, los pasos dos y tres se pueden combinar usando un constructor diferente.

El Fragmento de Cdigo 4-7 presenta el mtodo createSceneGraph del programa del ejemplo de MouseRotateApp.java. El escenario grfico incluye el objeto ColorCube. El usuario puede rotar el ColorCube usando el ratn debido a la inclusin de un objeto MouseRotate en el escenario grfico.

Fragmento de Cdigo 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 ratn. De hecho los tres comportamientos se pueden utilizar en la misma aplicacin que funciona en el mismo objeto visual. Puesto que cada uno de los comportamientos del ratn lee el transform fuente antes de escribirlo, slo se necesita un objeto TransformGroup incluso con tres comportamientos de ratn. El programa del ejemplo de MouseRotateApp.java hace apenas eso.

El siguiente ejemplo muestra cmo dos comportamientos del ratn trabajan en un solo mundo virtual. El programa MouseRotate2App.java del ejemplo crea un escenario grfico 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 ratn estn activos, cuando el usuario hace clic y mueve el ratn, ambos ColorCubes rotan.

Si no quisieramos que ambos objetos rotaran, hay dos soluciones: 1) cambiar la posicin del espectador, o cambiar los lmites del comportamiento, de modo que solamente un comportamiento sest activo, o 2) usar un mecanismo de seleccin para aislar el comportamiento.

.Fundamentos del Comportamiento del Ratn

Las clases especficas de comportamiento del ratn (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 ratn. El mtodo SetTransformGroup() es probablemente el nico que utilizarn los usuarios de un ejemplar de MouseBehavior. Los otros mtodos se crearn para los autores de las clases de comportamientos personalizados del ratn.

Sumario de Mtodos de MouseBehavior

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

void initialize()

Inicializa el comportamiento.

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

Maneja eventos del ratn.

void processStimulus(java.util.Enumeration criteria)

Todos los manipuladores de ratn deben implementar este mtodo 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 mtodo transformChanged que ser llamado cuando cambie el transform fuente de la manera especificada. Cada uno de los tres comportamientos especficos del ratn implementa esta clase. Un programador simplemente puede reemplazar el mtodo transformChanged de una de esas clases para especificar un mtodo que se llamar cuando se modifique el transform.

Sumario de Mtodos 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 sern llamadas cada vez que el comportamient actualice el Transform. El tipo es uno de MouseCallback.ROTATE, MouseCallback.TRANSLATE, o MouseCallback.ZOOM.

.Clases Especficas de Comportamientos de Ratn

MouseRotate

Un escenario grfico 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 rotacin de un objeto mediante una pulsacin del botn izquierdo del ratn. 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 Mtodos 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 mtodo que se llama cada vez que se actualiza el transformgroup

void transformChanged(Transform3D transform)

Los usuarios pueden sobreescribir este mtodo que es llamado cada vez que el comportamiento actualiza el transformgroup. La implementacin por defecto no hace nada.

MouseTranslate

Un escenario grfico 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 traslacin (X,Y) de un objeto mediante un movimiento de arrastre del ratn con el botn 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 Mtodos 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 mtodo que se llama cada vez que se actualiza el transformgroup

void transformChanged(Transform3D transform)

Los usuarios pueden sobreescribir este mtodo que es llamado cada vez que el comportamiento actualiza el transformgroup. La implementacin por defecto no hace nada.

MouseZoom

Un escenario grfico 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 traslacin en el eje Z de un objeto mediante un movimiento de arrastre del ratn con el botn central (alt-tecla en el PC con el ratn de dos botones).

MouseZoom()

Crea un comportamiento de zoom con ratn 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 Mtodos de MouseZoom

void setFactor(double factor)

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

void setupCallback(MouseBehaviorCallback callback)

El mtodo que se llama cada vez que se actualiza el transformgroup

void transformChanged(Transform3D transform)

Los usuarios pueden sobreescribir este mtodo que es llamado cada vez que el comportamiento actualiza el transformgroup. La implementacin por defecto no hace nada.

.MouseNavigation

Las tres clases especficas de comportamiento del ratn se pueden utilizar para crear un universo virtual en el cual el ratn se utilice para la navegacin. Cada una de las clases especficas del comportamiento del ratn tiene un constructor que toma un solo parmetro entero para las banderas. Cuando se utiliza MouseBehavior.INVERT_INPUTS como argumento a este constructor, el comportamiento del ratn responde en la direccin opuesta. Este comportamiento inverso es apropiado para cambiar el transform ViewPlatform. Es decir las clases del comportamiento del ratn se pueden utilizar para el control navegacional.

El programa de ejemplo MouseNavigatorApp.java utiliza casos de las tres clases especficas del comportamiento del ratn para la interaccin navegacional. El Fragmento de Cdigo 4-8 muestra el mtodo createSceneGraph de este programa del ejemplo.

El TransformGroup fuente para cada uno de los objetos del comportamiento del ratn es el ViewPlatform transform. El objeto SimpleUniverse es un argumento al mtodo createSceneGraph de modo que se puedan alcanzar los objetos transform de ViewPlatform.

Fragmento de Cdigo 4-8 ,Usar clases de Comportamientos del Ratn para Navegacin 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 ratn se especifican como un BoundingSphere con un radio de 1000 metros. Si el usuario se sale de esta esfera, los objetos comportamiento se desactivarn.

.Picking

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

Picking (eleccin) est implementado por un comportamiento tipicamente disparado por eventos de botones del ratn. En la seleccin de un objeto visual, el usuario sita el puntero del ratn sobre el objeto elegido y pulsa el botn del ratn. El objeto behavior se dispara por la pulsacin de este botn y empieza la operacin de seleccin. Se proyecta un rayo dentro del mundo virtual desde la posicin del puntero del ratn paralela con la proyeccin. Se calcula la interseccin de este rayo con los objetos del mundo virtual. El objeto visual que interseccione ms cerca al plato de la imagen se selecciona para interaccin. La Figura 4-11 muestra un rayo de seleccin proyectado en un mundo virtual.

Figura 4-11,  Proyeccin de un PickRay en el Mundo Virtual

En algunos casos la interaccin no se hace directamente con el objeto seleccionado, sino con un objeto en el camino del escenario grfico hasta el objeto. Por ejemplo, al seleccionar un objeto ColorCube para rotacin, este objeto no se manipula, se manipula el objeto TransformGroup que hay sobre el ColorCube en el path del escenario grfico. Por otro lado, su la operacin de seleccin selecciona un objeto visual para el que se pens un cambio de color, entonces el objeto visual seleccionado es requerido.

La determinacin del objeto para un posterior procesamiento no siempre es sencilla. Si in objeto visual cbico que va a ser rotado est compuesto por seis objetos Shape3D individuales junto con seis objetos TransformGroup, como en el escenario grfico 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 manipulacin del objeto TransformGroup que es hijo del objeto BranchGroup en el escenario grfico. Por esta razn, el resultado de algunas operaciones de seleccin es devolver el path del escenario grfico para su posterior procesamiento.

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

La comprobacin de intersecciones es necesita mucho clculo. Por lo tanto, la seleccin es cara y se vuelve ms cara con la complejidad del escena. El API Java 3D proporciona varias formas para que un programador pueda limitar la cantidad de clculos realizados por la seleccin. Una forma importante es atravs de las capacidades y atributos de los nodos del escenario grfico. Si un nodo es o no elegible se selecciona con el mtodo 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 caracterstica relacionada con la seleccin en la clase Node es la capacidad ENABLE_PICK_REPORTING. Esta capacidad slo se aplica a nodos Group. Cuando se selecciona para un grupo, este objeto group siempre ser incluido en el escenario grfico devuelto por una operacin de seleccin. Los nodos Group no se necesitan para unidades en un escenario grfico que sern excluidas cuando la capacidad no est seleccionada. No tener seleccionado correctamente los nodos del escenario grfico es un fuente comn de frustacciones en el desarrollo de aplicaciones que utilizan operaciones de seleccin.

Lista Parcial de Mtodos 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 comn para construir un escenario grfico Java 3D, especificamente volmenes, y las capacidades de seleccin y colisin.

void setBounds(Bounds bounds)

Selecciona los lmites geomtricos de un nodo.

void setBoundsAutoCompute(boolean autoCompute)

Activa/desactiva el clculo automtico de los lmites geomtricos 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 seleccin. Esta capacidad es slo 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 sern excluidos del SceneGraphPath.

ALLOW_BOUNDS_READ | WRITE
Especifica que este nodo permite leer (escribir) la informacin de sus lmites.

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

Otra forma en la que un programador puede reducir el cculo de seleccin es usar pruebas de intereseccin de lmites en vez de pruebas de intersecciones geomtricas. Varias clases relacionadas con la seleccin (pick) tiene constructores y/o mtodos con un parmetro que se selecciona a uno de: USE_BOUNDS o USE_GEOMETRY. Cuando se selecciona USE_BOUNDS, la seleccin est determinada usando los lmites de los objetos visuales, no la geometra real. La determinacin de una seleccin usando los lmites es significativamente ms sencilla (computacionalmente) para todo excepto para las formas geomtricas sencillas y por lo tanto, resulta en un mejor rendimiento. Por supuesto, la prdida es que la seleccin no es tan precisa cuando se utilizan lmites para su determinacin.

Una tercera tcnica de programacin para reducir el coste de clculo para la seleccin es limitar el mbito de la prueba de seleccin a la porcion relevante del escenario grfico. En cada clase de utilidad de seleccin se selecciona un nodo como el raz para el grfico a testear. Este nodo no es necesariamente el raz de la rama de contenido grfico. Por el contrario, el nodo pasado debera ser el raz de la subrama de contenido que slo contiene objetos elegibles, si es posible. Esta consideracin pordra ser una mayor factor de determinacin en la construccin de un escenario grfico para algunas aplicaciones.

.Usar las Clases de Utilidad de Picking

Hay dos aproximaciones bsicas para usar las caractersticas de seleccin 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 botn del ratn cuando el puntero est sobre el objeto deseado y entonces arrastra el ratn (mientras mantiene pulsado el botn). Cada una de estas clases de picking usa un botn diferente del ratn haciendo posible el uso de objeto para las tres clases de picking en la misma aplicacin simultneamente.

Cmo un objeto comportamiento picking operar sobre cualquier objeto del escenario grfico (con las capacidades apropiadas), slo se necesita proporcionar un objeto picking. Las dos siguientes lneas de cdigo son todo lo que necesitamos incluir en un programa Java 3D para usar las clases de seleccin:

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

El objeto behavior monitorizar cualquier evento de seleccin en el escenario grfico (bajo el nodo raz) y meneja los arrastres y pulsaciones del ratn. El root proporciona la porcin del escenario grfico a chequear para la seleccin, el canvas se situa donde est el ratn, y bounds son los lmites del objeto de comportamiento picking.

Receta para usar las clases de utilidades de picking.

  1. Crear nuestro escenario grfico.
  2. Crear un objeto behavior picking con la especificacin de root, canvas, y bounds.
  3. Aadir el objeto behavior al escenario grfico.
  4. Activar las capacidades apropiadas para los objetos del escenario grfico.

Riesgos de Programacin cuando se usan Objetos Picking

Los Riesgos ms comunes incluyen; olvidarse de incluir el objeto behavior en el escenario grfico, y no seleccionar los lmites apropiados del objeto.

Otro problema comn es no seleccionar las capacidades apropiadas para los objetos del escenario grfico. Hay otros dos problemas menores, que deberamos chequear si nuestra aplicacin no funciona. Uno es no seleccionar apropiadamente el raz del escenario grfico. Otro problema potencial es no seleccionar apropiadamente el canvas. Ninguno de estos errores de programacin generarn un aviso o mensaje de error.

Programa de Ejemplo MousePickApp

El Fragmento de Cdigo 4-9 muestra el mtodo createSceneGraph de la aplicacin MousePickApp.java. Este programa usa un objeto PickRotate para proporcionar interaccin.

Observa que como la construccin del objeto picking requiere un objeto Canvas3D, el mtodo createSceneGraph difiere de versiones anteriores por la inclusin del parmetro canvas. Por supuesto, tambin cambia la correspondiente invocacin a createSceneGraph.

Fragmento de Cdigo 4-9, Mtodo createSceneGraph de la aplicacin 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 cdigo es similar al de MouseRotate2App.java, pero es distinto en muchas cosas. Primero, en este programa slo se usa un objeto behavior, mientras que MouseRotate2App usaba dos objetos behavior - uno por cada objeto visual. Aunque el cdigo 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 Corazn de Clases Picking de Java 3D

Hay tres niveles de clases picking en Java 3D. El API corazn de Java 3D proporciona la menor funcionalidad. El paquete de utilidad picking proporciona clases de comportamientos generales, elegibles para personalizacin. El paquete picking tambin proporciona clases picking especficas que pueden usarse directamente en programas Java 3D.

Las clases corazn incluyen PickShape y SceneGraphPath, y mtodos de BranchGroup y Locale. Estas clases proporcionan el mecanismo para especificar una forma usada en la comprobacin de intersecciones con objetos visuales. Esta seccin presenta el API de las clases PickShape y SceneGraphPath, y las clases y mtodos relacionados.

Clases PickShape

Esta clase abstracta no proprociona ni constructores ni mtodos. Proporciona abstraccin para cuatro subclases: PickBounds, PickRay, PickSegment, y PickPoint.

PickShape

Subclases Conocidas: PickBounds, PickRay, PickSegment, PickPoint

Una clase general para describir un forma de seleccin que puede usarse con mtodos de seleccin de BranchGroup y Locale.

PickBounds

Los objetos PickBounds representan un lmite 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 lmite para suministrar a los mtodos de seleccin de BranchGroup y Locale.

PickBounds()

Crea un PickBounds.

PickBounds(Bounds boundsObject)

Crea un PickBounds con los lmites especificados.

Sumario de Mtodos 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 seleccin. 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 mtodos de seleccin de BranchGroup y Locale

PickPoint()

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

PickPoint(Point3d location)

Crea un PickPoint en location.

Sumario de Mtodos de PickPoint

void set(Point3d location)

Selecciona la posicin de este PickPoint. Existe un mtodo get correspondiente.

PickRay

Los objetos PickRay representan un rayo (un punto y una direccin) para seleccin. 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 encapsulacin de un rayo para pasarlo a los mtodos de seleccin en BranchGroup y Locale

PickRay()

Crea un PickRay con origen y direccin de (0, 0, 0).

PickRay(Point3d origin, Vector3d direction)

Crea un rayo desde origin con direccin a direction.

Sumario de Mtodos de PickRay

void set(Point3d origin, Vector3d direction)

Selecciona el rayo que apunte desde origin en direccin direction. Existe el correspondiente mtodo get.

PickSegment

Los objetos PickSegment representan un segmento de lnea (definida por dos puntos) para seleccin. 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 encapsulacin de un segmento pasado a los mtodos de seleccin 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 mtodos de PickSegment

void set(Point3d start, Point3d end)

Selecciona el segmento desde el punto start hasta el punto end. Existe el correspondiente mtodo get.

SceneGraphPath

La clase SceneGraphPath se usa en la mayora de las aplicaciones de seleccin. Esto es porque normalmente la seleccin implica encontrar un camino de escenario grfico en el que se encuentra un objeto para permite la manipulacin del objeto o de un objeto TransformGroup en el path.

Un objeto SceneGraphPath representa el camino del escenario grfico hacia el objeto elegido permitiendo la manipulacin del objeto o de un objeto TransformGroup en el camino del objeto.

Introduccin a SceneGraphPath

Un objeto SceneGraphPath representa el camino desde un Locale hasta un nodo temrinal en el escenario grfico. Este camino consiste en un Locale, un nodo terminal, y un array de nodos internos que estn en el path desde el Locale hasta el nodo terminal. El nodo terminal podra ser un nodo Leaf o un nodo Group. Un SceneGraphPath vlido debe identificar nicamente un ejemplar de un nodo terminal. Para nodos que no estn bajo un SharedGroup, el SceneGraphPath mnimo consiste en el Locale y el propio nodo terminal. Para nodos que estn bajo un SharedGroup, el SceneGraphPath mnimo 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 podra contener otros nodos interiores que estn en el camino. Un SceneGraphPath se verifica contra errores cuando se enva como argumento a otros mtodos de Java 3D.

En el array de nodos internos, el nodo en el ndice 0 es el nodo ms 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 ms 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 mtodos de seleccin o colisin de Java 3D, tambin contiene el valor del objeto transform LocalToVworld del nodo terminal que era en efecto en el momento en que ocurri la colisin o la seleccin. Obherva que ENABLE_PICK_REPORTING y ENABLE_COLLISION_REPORTING estn desactivados por defecto. Esto significa que los mtodos de seleccin y colisin devolvern el SceneGraphPath mnimo por defecto.

SceneGraphPath()

Construye un objeto SceneGraphPath con parmetros 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 Mtodos 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 transformacin son iguales.

Transform3D getTransform()

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

int hashCode()

Devuelve un nmero '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; algn objeto podra incluir un subconjunto diferente de nodos internos; slo los nodos links internos, Locale, y el propio nodo son comparados.

int nodeCount()

Recupera el nmero 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 representacin string de este objeto; el string contiene los nombres de las clases de todos los nodos en el SceneGraphPath, el mtodo toString() de cualquier usuario asociado, tambin imprime el transform si no es nulo.

Mtodos de Seleccin de BranchGroup y Local

En los siguientes bloques de referencia estn los mtodos de las clases BranchGroup y Local para chequeo de interseccin con objetos PickShape. Este es el nivel de clculo de seleccin ms bajo proporcionado por el API Java 3D.

Mtodos de seleccin 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 ms cercano al origen de PickShape, con los elementos siguientes alejndose 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 ms 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 especficos. Las clases generales son tiles para crear nuevos comportamientos de seleccin, entre las que se incluyen PickMouseBehavior, PickObject, y PickCallback. Las clases especficas de comportamiento del ratn, presentadas en la siguiente seccin, son subclases de PickMouseBehavior.

Clase PickMouseBehavior

Esta es la clase base para los comportamientos de seleccin especficos proporcionados en el paquete. Tambin es til para extender clases de comportamientos de seleccin personalizados.

Sumario de Mtodos de PickMouseBehavior

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

Extiende: Behavior

Clase base que permite a los programadores aadir seleccin y manipulacin del ratn en un escenario grfico (puedes ver PickDragBehavior para un ejemplo de cmo extender esta clase base).

void initialize()

Este mtodo debera ser sobreescrito para proporcionar estado inicial y la condicin de disparo inicial.

void processStimulus(java.util.Enumeration criteria)

Este mtodo debera sobreescribirse para proporcionar el comportamiento en respuesta a una condicin de disparo.

void updateScene(int xpos, int ypos)

Las subclases deberan implementar esta funcin update.

Clase PickObject

La clase PickObject proporciona mtodos para determinar qu objeto fu seleccionado por una operacin de seleccin del usuario. Una amplia variedad de mtodos resulta de las distitnas formas posibles de aplicaciones de seleccin. Es til crear clases de seleccin personalizadas.

Sumario de Constructores de PickObject

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

Extiende: java.lang.Object

Contiene mtodos para ayudar en la seleccin. 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 Mtodos de PickObject

PickObject tiene numerosos mtodos para el clculo de intersecciones de un pickRay con objeto del escenario grfico. Algunos de los mtodos slo difieren en un parmetro. Por ejemplo el segundo mtodo pickAll (no listado) existe con el firma de mtodo: 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 mtodos con parmetros de bandera. Estos mtodos son idnticos a los incluidos en esta lista con la diferencia del parmetro bandera. Estos mtodos son: pickAll, pickSorted, pickAny, y pickClosest.

PickShape generatePickRay(int xpos, int ypos)

Crea un PickRay que empieza en la posicin del espectador y apunta dentro de la escena en direccin 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 posicin del espectador y apunta dentro de la escena en direccin (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 posicin del espectador y apunta a la direccin 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 posicin del espectador y apunta a la direccin (xpos, ypos) en el espacio de la ventana.

SceneGraphPath pickClosest(int xpos, int ypos)

Devuelve una referencia al tem que est ms cercano al espectador y es elegible bajo el BranchGroup (especificado en el constructor de PickObject) que interesecciona con el rayo que empieza en la posicin del espectador y apunta a la direccin (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 lgica de uno o ms: 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 mtodo anterior. El parmetro occurrence indica qu objeto devolver.

Interface PickingCallback

El interface PickingCallback proporciona un marco de trabajo para extender una clase de seleccin existente. En particular cada una de las clases especficas implementa este interface permitiendo al programador proporcionar un mtodo que sea llamado cuando la operacin de seleccin tenga lugar.

Sumario de Mtodos 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 seleccin. Los valores de tipos vlidos son: ROTATE, TRANSLATE, ZOOM o NO_PICK (el usuario hace una seleccin pero no hay nada seleccionado realmente).

Clase Intersect

La clase Intersect proporciona varios mtodos para comprobar la interseccin de un objeto PickShape (clase corazn) y geometras primitivas. Esta clases es til para la creaccin de clases picking personalizadas.

Sumario de Constructores de Intersect

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

Extiende: java.lang.Object

Contiene mtodos estticos para ayudar a las comprobaciones de interseccin entre varias clases PickShape y geometras primitivas (como quad, triangle, line y point).

Intersect()

Crea un objeto intersect.

Lista Parcial de Mtodos de Intersect

Esta clase tiene vaios mtodos de interseccin, algunos de los cuales slo se diferencian por un tipo de parmetro. Por ejemplo el mtodo: boolean pointAndPoint(PickPoint point, Point3f pnt) se diferencia del segundo mtodo listado aqu en el tipo del parmetro pnt. La mayora de los mtodos listado aqu con un parmetro del tipo Point3d tienen un mtodo correspondiente con un parmetro 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 lnea.

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 lnea.

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 cuadriltero interseccionan.

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

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

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

Devuelve true si la lna intersecciona con el segmento; la distanta desde el inicio del segmento a la interseccin se almacena dist[0]. coordinates[index] y coordinates[index+1] definen la lnea.

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 interseccin 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 interseccin se almacena en dist[0].

.Clases de Comportamientos Picking Especficas

Incluidas en el paquete com.sun.j3d.utils.behaviors.picking hay clases de comportamientos especficas: PickRotateBehavior, PickTranslateBehavior, y PickZoomBehavior. Estas clases permiten al usuario interactuar con un objeto seleccionado con el ratn. Los comportamientos individuales responden a los diferentes botones del ratn (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 interaccin siguiendo la receta anterior. Como todas estas clases implementan el interface PickingCallback, la operacin de eleccin pueden mejorarse con una llamada a un mtodo definido por el usuario.

PickRotateBehavior

Esta clase permite al usuario seleccionar y rotar interactivamente un objeto visual. El usuario usa el botn izquierdo del ratn para seleccionar y rotar. Se puede usar un ejemplar de PickRotateBehavior en conjuncin con otras clases de seleccin especficas.

Sumario de Constructores de PickRotateBehavior

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

Extiende: PickMouseBehavior

Implementa: PickingCallback

Un comportamiento de ratn que permite al usuario seleccionar y rotar objetos de un escenario grfico; expndible a travs de retro-llamada.

PickRotateBehavior(BranchGroup root, Canvas3D canvas, Bounds bounds)

Crea un comportamiento que espera eventos del ratn en el escenario grfico.

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

Crea un comportamiento que espera eventos del ratn en el escenario grfico. El parmetro 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 geomtricos del escenario grfico estn disponibles para su seleccin y deben tener activado su ALLOW_INTERSECT.

Sumario de Mtodos 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 geomtricos del escenario grfico estn disponibles para su seleccin 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)

Mtodo de retrollamda desde MouseRotate. Se usa cuando al seleccin 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 botn derecho del ratn para seleccionar y trasladar. Se puede usar un ejemplar de PickTranslateBehavior en conjuncin con otras clases de seleccin especficas.

Sumario de Constructores de PickTranslateBehavior

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

Extiende: PickMouseBehavior

Implementa: PickingCallback

Un comportamiento de ratn que permite al usuario seleccionar y trasladar objetos de un escenario grfico; expndible a travs de retro-llamada.

PickTranslateBehavior(BranchGroup root, Canvas3D canvas, Bounds bounds)

Crea un comportamiento que espera eventos del ratn para el escenario grfico

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

Crea un comportamiento que espera eventos del ratn en el escenario grfico. El parmetro 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 geomtricos del escenario grfico estn disponibles para su seleccin y deben tener activado su ALLOW_INTERSECT.

Sumario de Mtodos 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)

Mtodo de retrollamada desde MouseTranslate. Se usa cuando la seleccin 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 botn central del ratn para seleccionar y hacer zoom. Se puede usar un ejemplar de PickZoomBehavior en conjuncin con otras clases de seleccin especficas.

Sumario de Constructores de PickZoomBehavior

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

Extiende: PickMouseBehavior

Implementa: PickingCallback

Un comportamiento de ratn que permite al usuario seleccionar y hacer zoom a objetos de un escenario grfico; expndible a travs de retro-llamada.

PickZoomBehavior(BranchGroup root, Canvas3D canvas, Bounds bounds)

Crea un comportamiento que espera eventos del ratn para el escenario grfico.

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

Crea un comportamiento que espera eventos del ratn en el escenario grfico. El parmetro 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 geomtricos del escenario grfico estn disponibles para su seleccin y deben tener activado su ALLOW_INTERSECT.

Sumario de Mtodos 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 seleccin 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

HAY 1 COMENTARIOS
  • Anónimo dijo:

    Seria bueno poder descargar este fabuloso tutorial

Conéctate o Regístrate para dejar tu comentario.