Sei sulla pagina 1di 24

1

VRML 2.0 con Java CAPÍTULO 23

Nodos como Clases Java


2

VRML 2.0 con Java CAPÍTULO 23

Contenido CAPÍTULO 23

• Objetivos básicos
• Código de diseño
• Escritura de las clases
• Uso de la Biblioteca
• ¿Qué hace falta?
• Ampliación de la Biblioteca de la cubierta interior de scripts

Objetivos básicos

Al crear una biblioteca de alto nivel como éste, que se basa en una API de nivel
3

VRML 2.0 con Java CAPÍTULO 23

inferior, la elección debe hacerse abstracción de cuánto debería ser utilizado.


En el caso de VRML, es un buen punto de interrupción en el nodo de nivel.
Nodos son discretos, modelable entidades con un conjunto bien definido de
reglas que se puede construir sin demasiados problemas en los API.

Después de haber decidido en la creación de un conjunto de nodos, que


necesitaba para decidir sobre la forma de reproducir fielmente su
comportamiento. Me decidí a hacer las clases actúan como "la cosa real." Por
ejemplo, si hay un campo, tiene que especificar en la creación de tiempo,
eventIn y sólo puede establecer los valores y eventOuts sólo puede leerlos.
Una de las grandes concesiones que hizo a este plan era incluir métodos para
leer los valores de los campos de atrás de nuevo. Hice esta decisión para que
yo pudiera usar la biblioteca con el editor que usted vio en el capítulo 12.
Después de haber impreso todos los valores es también una práctica de ayuda
para depurar sus aplicaciones.

Uno de los objetivos que se vio obligado a mí durante el desarrollo para poder
hacer mi trabajo de clases de Java, incluso sin un navegador. Es decir, que
podría funcionar por completo, pero simplemente no transmitir los valores a
través de la VRML navegador. Me enteré de la manera más dura sobre algunos
errores en archivos DLL de RPC de Microsoft (después de pasar una semana y
media de trabajo de lo que estaba mal!), Que significó el applet con el
Netscape no encontrar el navegador de VRML en absoluto. Al final, este
resultado fue una buena cosa, porque, como se verá más adelante en el
capítulo, que hizo el código más fácilmente extensible.

¡PRECAUCIÓN!: Existen fallos conocidos con Windows 95 y NT 4.0 Service


Pack 1. Notas sobre la manera de superar estos problemas se incluyen en el CD
y también se puede encontrar en el sitio web de Netscape:
http://help.netscape.com/kb/client/961024-6.html.

El último de los objetivos básicos de esta biblioteca es tratar de hacer que el


código lo más simple posible. Mi filosofía de programación es escribir una vez y
utilizar muchas veces. Si hay secciones de código común que existe, entonces,
que se mudó a un método privado. Aparte de tener que escribir menos código,
sino que también significa que si hay un fallo, sólo tendrá que fijar una línea de
código en lugar de dos o más.
Código de diseño

En su nivel más básico, la estructura de VRML nodo consta de tres partes: la


agrupación de nodos, los nodos hijos, y el resto. Para hacer las cosas un poco
más complejo, que agrupa a los nodos también pueden ser niños nodos. Por lo
que este nos deja con dos clases generales de nodos: los niños y otros.

La definición de lo que es un nodo hijo y lo que no se encuentra en las


especificaciones de VRML en la sección Conceptos. Subdivisiones más
especializados se basan en las agrupaciones previstas por el pliego de VRML
2.0 (y se introdujeron para que en el primer capítulo de este libro).
Jerarquía de paquetes
4

VRML 2.0 con Java CAPÍTULO 23

Todo lo que necesitas para estos nodos VRML debe existir en un solo paquete.
Este paquete se llama vlc.vrml.external.geometry. El vlc está para mi empresa,
vrml por razones obvias, ya que el exterior de la aplicación original, funciona
sólo para la interfaz externa y, por último, la geometría porque tengo otras EAI
basada en paquetes y, además de que no desea obtener este paquete
confundirse con cualquiera de los nombres de las clases VRML por llamarlo
nodo.

Para mostrar otra de las razones para crear el paquete exterior, más tarde en
el capítulo I le mostrará cómo se convirtió el código para ser utilizado con su
editor interno. Puesto que los dos no se pueden mezclar, ya que comparten el
mismo método y los nombres de clase, teníamos que usar paquetes Java para
separar la funcionalidad.
Nombres convencionales

El nombre de cada una de las clases Java es idéntico al nombre de nodo de


VRML. Así que si quieres crear un cubo, puede utilizar la caja de clase, que se
añade a la geometría de un campo de clase de forma.

Una serie de clases adicionales se utilizan como clases abstractas para los
diversos niveles de clasificación en la jerarquía. Estos suelen ser nombrados
por función. Por ejemplo, todas las texturas son una subclase de la clase
abstracta de textura, aunque la lista de nodos de VRML no contienen una pura
textura nodo.
VrmlObject: El núcleo de clase

En el corazón de cada nodo de una serie de propiedades comunes, cada uno de


los cuales puede tener un nombre asociado DEF con él. Tenemos que seguir la
pista de la representación del navegador del nodo, y una indicación de su tipo
que son útiles, también. Además, cada nodo debe estar basado en torno a
algunos puntos en común clase base para que podamos pasar con relativa
facilidad en torno a si es necesario. Para este trabajo he creado la clase
abstracta VrmlObject. Porque necesitamos para almacenar variables, haremos
uso de clases abstractas en vez de interfaces. VrmlObject se define en el
Listado de 23.1.
5

VRML 2.0 con Java CAPÍTULO 23


6

VRML 2.0 con Java CAPÍTULO 23

23.1 La lista VrmlObject clase base para el Nodo JVerge las clases

/ / JVerge VRML 2.0 nodo biblioteca de clases


/ / Copyright 1996 Justin Sofá
/ /
/ / Capítulo 23: Late Night VRML 2.0 y Java
/ /
/ / Base de definición de objetos VRML
/ / Hay tres principales tipos de información. El nombre es el DEF
/ / Nombre asociado con este objeto. El Nodo es la información
/ / CreateVrmlFromString de regresar de la llamada. Y el tipo es el
/ / Tipo de producto representaba como un entero de la VrmlTypes.java.

vlc.vrml.external.geometry paquete;

java.io.PrintStream de importación;
vrml.external.Node de importación;

público VrmlObject clase abstracta implementa Cloneable


(
protegidas have_browser boolean = false;
protegidas int type = -1;

public String nombre = null;


público Nodo nodo = null;

/ / Llamada justo antes de un nodo se debe suprimir de su padre. Un


/ / Versión en blanco es para los nodos que no tienen que hacer
/ / Nada
public void limpiar ()
(
)

resumen público WriteToFile vacío (PrintStream fp, int guión);

public String toString ()


(
return (nombre);
)

int get_nodeType público ()


(
return (tipo);
)
7

VRML 2.0 con Java CAPÍTULO 23

Un número de métodos se definen en la clase abstracta VrmlObject. Estos


proporcionar o definir algunas funciones comunes, como la recuperación del
tipo de objeto, la escritura de los datos, o la limpieza de datos interno.

El método abstracto para la escritura de datos a un archivo se define como

public void resumen WriteToFile (PrintStream fp, int guión);

Es posible que se le preguntaba por qué me fui con un PrintStream en lugar de


anular la norma método toString (). La flexibilidad es la razón principal. Con un
PrintStream, me puede enviar la salida a lo que me gusta. Esta podría ser una
norma de cuerda (a través de un ByteArrayOutputStream), un archivo, o
incluso una fuente de streaming, como directamente a un enchufe. Si he usado
sólo una cadena y, a continuación, escrito a los otros dispositivos sería más
complejo de manejar.

VrmlObject también implementa Cloneable. Esto es sólo la manera rápida y


fácil de asegurarse de que podemos copiar los casos de los nodos con relativa
facilidad.
La construcción de capas para hacer aplicar las clases de sintaxis

La forma más fácil de asegurarse de que los nodos de un árbol es


sintácticamente correcta para su aplicación en el programador en tiempo de
compilación. Para ello, una serie de subclases progresivamente más restrictivas
se construyen.

Cada una de estas subclases aplica, ya sea un elemento de la sintaxis de VRML


o un conjunto común de propiedades. En la capa inferior, tenemos la distinción
de los niños frente a nonchild nodos. Nonchild nodos directamente subclase
Vrml-Objeto, mientras que los nodos secundarios ChildrenNode tienen una
clase abstracta.

ChildrenNode a continuación, hay una serie de clases que representan las


diversas agrupaciones que se definen en la especificación de VRML. Va a
encontrar clases de GroupingNode, Geometría, sensor, BindableNode,
interpolador, y SpecialGroup. La agrupación no se hizo para la aparición y
clasificaciones comunes, ya que la funcionalidad no presentar ninguna de las
distintas común entre sus nodos VRML agrupación. En lugar de ello, he
recurrido a una funcionalidad de base. Por lo tanto, usted encontrará que la
forma de nodo y ligeras clase abstracta directamente subclase ChildrenNode.

Cada uno de estos grupos se explica con más detalle más adelante en el
8

VRML 2.0 con Java CAPÍTULO 23

capítulo. La clase de diseño básico se da en la Figura 23.1.

Figura 23.1 La presentación de los JVerge clases


Escritura de las clases

En esta sección voy a detalle cómo iba escrito sobre una de las clases. Después
de mostrar la estrategia básica, iré a explicar algunos de los problemas
encontrados durante el diseño y la ejecución de determinados nodos.
A partir de Apagado: El Punto de vista de clase

El Punto de vista de clase es un buen lugar para empezar, ya que representa


casi todas las características que encontrará en las diversas clases. Ha
eventIns, eventOuts, campos, y exposedFields-en otras palabras, todo.

NOTA: Cuando comencé este proyecto, que comenzó con la Forma nodo. Se
forma el punto lógico donde empezar, ya que pude ver los resultados que
aparecen en la pantalla, a diferencia de la mayoría de los otros nodos. Por lo
tanto, tengo todo el beneficio de la retrospectiva lanzada en derecho desde el
principio.

¿Qué navegador?

En el capítulo anterior he dicho que me vi obligado a funcionar sin una


conexión con el navegador de VRML para un rato. Esto se manifiesta en unos
pocos lugares en el código de los constructores y, a continuación, en la fijación
de valores de campo.

Para cada nodo, existen dos constructores. Se tiene el usuario del navegador
proporcionado por referencia de objetos, y el otro usa el método estático
getBrowser de la EAI. Hasta la beta 3 de CosmoPlayer, VRML no apoyó la
getBrowser método estático, por lo que la antigua JavaScript / LiveConnect
interfaz tenía que ser utilizada para hacerse con el navegador. En este caso, es
necesario pasar a manejar alrededor de este único lugar de tratar de obtener
cada vez que crea un nodo. También sería un poco más rápido, ya que existe
un sistema de consulta menos. Antes de continuar, Listado 23,2 contiene la
fuente a Viewpoint.java.

Anterior Índice Siguiente

Listado de 23,2 Fuente de Viewpoint.java, el punto de vista de clase


9

VRML 2.0 con Java CAPÍTULO 23

/ / JVerge VRML 2.0 nodo biblioteca


/ / Copyright 1996 Justin Sofá
/ /
/ / Capítulo 23: Late Night VRML 2.0 y Java
/ /
/ / Punto de vista de clase

vlc.vrml.external.geometry paquete;

importación java.io. *;
importación vrml.external .*;
importación vrml.external.field .*;

Punto de vista de clase pública se extiende BindableNode


(
EventInSFFloat _set_fieldOfView privado;
EventInSFBool _set_jump privado;
EventInSFRotation _set_orientation privado;
EventInSFVec3f _set_position privado;

EventOutSFTime _get_bindTime_changed privado;

flotador privado _fieldOfView = 0.785398f;


privado _jump boolean = true;
flotador privado [] _orientation = (0, 0, 1, 0);
flotador privado [] _position = (0, 0, 0);
Cadena _description privado = null;

de opinión pública ()
(
B = Browser.getBrowser navegador ();

if (b == null)
retorno;

= nodo b.createVrmlFromString ( "Punto de Vista {}")[ 0];

createFields ();
)

de opinión pública (navegador b)


(
if (b == null)
retorno;
10

VRML 2.0 con Java CAPÍTULO 23

= nodo b.createVrmlFromString ( "Punto de Vista {}")[ 0];

createFields ();
)
de opinión pública (String descripción)
(
Vrml_string cadena;

B = Browser.getBrowser navegador ();

if (b == null)
retorno;

_description = descripción;

vrml_string = "(Punto de vista";

si (descripción! = null)
vrml_string + = "descripción" + descripción;

vrml_string + = ")";

= nodo b.createVrmlFromString (vrml_string) [0];

createFields ();
)

de opinión pública (b navegador, cadenas de descripción)


(
Vrml_string cadena;

if (b == null)
retorno;

_description = descripción;

vrml_string = "(Punto de vista";

si (descripción! = null)
vrml_string + = "descripción" + descripción;

vrml_string + = ")";
11

VRML 2.0 con Java CAPÍTULO 23

= nodo b.createVrmlFromString (vrml_string) [0];

createFields ();
)

private void createFields ()


(
_set_bind = (EventInSFBool) node.getEventIn ( "set_bind");
_set_fieldOfView =
(EventInSFFloat) node.getEventIn ( "fieldOfView");
_set_jump = (EventInSFBool) node.getEventIn ( "saltar");
_set_orientation =
(EventInSFRotation) node.getEventIn ( "orientación");
_set_position = (EventInSFVec3f) node.getEventIn ( "posición");

_get_bindTime_changed =
(EventOutSFTime) node.getEventOut ( "bindTime_changed");
_get_isBound = (EventOutSFBool) node.getEventOut ( "isBound");

have_browser = true;

type = vlc.vrml.VrmlTypes.Viewpoint;
)

public void WriteToFile (PrintStream fp, int guión)


(
int i;
StringBuffer buffer = new StringBuffer ();

for (i = 0; i <guión; i + +)
buffer.append ( "");

if (nombre! = null)
fp.print ( "DEF" + nombre + "");

fp.println (buffer.toString () + "Punto de Vista (");

if (_fieldOfView! = 0.785398f)
fp.println (buffer.toString () +
"FieldOfView" + _fieldOfView);

if (! _jump)
fp.println (buffer.toString () + "salto FALSE");
12

VRML 2.0 con Java CAPÍTULO 23

if ((_orientation [0]! = 0) | | (_orientation [1]! = 0) | |


(_orientation [2]! = 1) | | (_orientation [3]! = 0))
fp.println (buffer.toString () + "orientación" +
_orientation [0] + "" +
_orientation [1] + "" +
_orientation [2] + "" +
_orientation [3]);

if ((_position [0]! = 0) | |
(_position [1]! = 0) | |
(_position [2]! = 1))
fp.println (buffer.toString () + "la posición" +
_position [0] + "" +
_position [1] + "" +
_position [2]);
if (_description! = null)
fp.println (buffer.toString () + "descripción"
+ _description);

fp.println (buffer.toString () + "}");


)

public void set_fieldOfView (float fov)


(
_fieldOfView = fov;
if (have_browser)
_set_fieldOfView.setValue (fov);
)

flotador get_fieldOfView público ()


(
return (_fieldOfView);
)

public void set_jump (boolean on)


(
_jump = sobre;
if (have_browser)
_set_jump.setValue (en);
)

boolean get_jump público ()


(
return (_jump);
13

VRML 2.0 con Java CAPÍTULO 23

public void set_orientation (float [] orientación)


(
_orientation = orientación;
if (have_browser)
_set_orientation.setValue (orientación);
)

público flotar [] get_orientation ()


(
return (_orientation);
)

public void set_position (float [] posición)


(
_position = posición;
if (have_browser)
_set_position.setValue (posición);
)

público flotar [] get_position ()


(
return (_position);
)

doble get_bindTime_changed público ()


(
return (_get_bindTime_changed.getValue ());
)
)

Para hacer frente a la falta de un navegador, los controles se construyen en


tanto constructores de un puntero nulo. En primer lugar, el constructor de
conjuntos interno navegador no valores concretos, entonces los controles de
los puntero nulo. Si es nulo, el constructor de las salidas sin la adopción de
nuevas medidas. Si no es así, entonces se procede a crear el nodo con una
llamada a createVrmlFromString.

La única vez que el navegador de objetos que se necesita es cuando creamos


un nuevo nodo con createVrmlFromString. No es necesario más, por lo que no
mantenga una referencia interna al objeto.
Cadena de VRML para Java
14

VRML 2.0 con Java CAPÍTULO 23

Un par de puntos acerca de la creación. En primer lugar, observa que la


convocatoria se adjunta por [0]. Esto se debe a que la creación de llamada
devuelve un array de nodos. Dado que estamos creando un solo nodo de nivel
superior (en este caso, el Punto de vista), podemos asignar a la variable
directamente nodo (nodo es una variable de miembro heredado de Vrml-
Object). El otro punto se refiere a la creación del nodo. Te darás cuenta de que
tengo cuatro constructores. Dos de ellos son sólo la creación de VRML nodo por
defecto, mientras que los otros dos tener una cadena como argumento, lo que
corresponde a la descripción de la materia Punto de vista.

¿Por qué no he incluido en los otros campos más grandes de este constructor?
La razón básica es la simplicidad. VRML Si nos proporciona el mecanismo para
fijar un valor del campo después de crear el nodo y, a continuación, haremos
uso de ella. Quería reducir al mínimo la cantidad de código y el número de
parámetros para el constructor. Sólo los campos que corresponden a un campo
tipo de acceso será pasado al constructor. Esta parte es fundamental, por una
vez el nodo se crea, no puede asignar nuevos valores para este campo. Los
valores deben ser asignados en la creación de tiempo, y es que cuando
pedimos el constructor.

Configuración de campo

Una vez hemos creado el nodo, podemos ir sobre la recuperación de la


eventIns y eventOuts de ella. Esta es una tarea relativamente fácil, con la
participación de una llamada a cualquiera de getEventIn o getEventOut con el
nombre de campo adecuada VRML como argumento y que la asignación a una
variable interna a fin de que podamos llamar en una fecha posterior.

¡PRECAUCIÓN!: Hay un pequeño problema que me han hecho caso omiso de


aquí. Estoy suponiendo que la llamada a createVrmlFromString siempre trabajo.
Obviamente no habrá errores de sintaxis, pero el navegador puede quedar sin
recursos, lo que podría causar un problema. Más tarde, encarnaciones de la
biblioteca será más sólida en este sentido.

Volver a las convenciones de nomenclatura. Para todos el acceso a los campos


de VRML, el nombre es _get_ <fieldname> o _set_ <fieldname>, según
proceda, para el campo. Algunos de los campos de VRML también se nombran
set_ <field>. En este caso he quedado con ese nombre, porque set_set_
<fieldname> parecía engorroso y una pérdida. Cuando estoy de
mantenimiento interno de la pista de los valores, el nombre es sólo uno antes
de subrayar el nombre del campo. El conjunto problema anterior no es un
problema aquí, porque cualquier VRML campo que comienza con "set_" es un
eventIn, por lo general de otro campo en ese nodo, por lo que no es necesario
15

VRML 2.0 con Java CAPÍTULO 23

realizar un seguimiento de su valor.

En la mayoría de las clases, la recuperación de los valores de los campos se


hace en un método privado llamado createFields. Recuerde que he dicho antes
quiero escribir una vez, utiliza a menudo? Aquí está un ejemplo. En la mayoría
de los nodos, tengo al menos dos constructores, todos ellos referencias a la
creación de sus campos. Un único método que se encarga de este detalle
disminuye la cantidad de mecanografía y de depuración que tengo que hacer.

A veces cuando tengo sólo un campo para obtener, esto podría parecer como
un desperdicio, con lo que todos los gastos adicionales que el método de
llamada. Sin embargo, con la tecnología de compilador agresivo en estos días,
el compilador en línea que por lo general el método directamente en el
constructor, que la eliminación de gastos generales. En aras de la simplicidad y
coherencia, incluso si sólo tenemos un campo para obtener, siempre habrá una
llamada a este método.
Limpieza general

Usted también notará otros dos en la asignación de variables createFields


método. La primera es establecer un pabellón interior de decir que tenemos
realmente un navegador para hablar. Como podrán ver en breve, esto es muy
importante.

El otro establece una asignación de poco más de seguridad para la paz de la


mente. Tipo contiene el valor que representa este nodo. Cuando se le pasa de
todo el crudo VrmlObject en una clase, por lo general es mucho más fácil poner
a prueba el valor del tipo de lo que es trabajar en qué tipo de nodo es
mediante el uso de Java instanceof comparación en la clase derivada. Aunque
no estoy en el uso de este generador de VRML en el capítulo 12, que está ahí
para su uso en cualquier momento.
Acceso a la VRML Campos

Después de crear un nuevo nodo, tenemos que ser capaces de establecer las
propiedades. Tenemos que escribir algunos métodos para establecer y
recuperar los valores del campo. Se trata de un asunto relativamente sencillo,
normalmente con sólo dos partes: el establecimiento de la clase interna de la
representación, el navegador y la información del cambio.

Copia el valor en el ámbito interno es una tarea sencilla en esta primera


versión. Esto puede ser peligroso, sin embargo. En los campos que consisten
en conjuntos de valores, la persona que llama puede establecer algunos
valores, a pasar el nodo y, a continuación, la reutilización de la misma gama y
escribir en los nuevos valores. Con sólo copiar el conjunto de referencia, este
nuevo contenido se muestran ahora en el nodo de impresión (WriteToFile ()),
16

VRML 2.0 con Java CAPÍTULO 23

pero no reflejan lo que aparece en el navegador de VRML. Para hacer más


sólido este comportamiento, las versiones posteriores de la biblioteca se copia
el array utilizando System.arraycopy () a la variable interna.

En la sección anterior, he mencionado brevemente que había una bandera que


sirve para indicar si tenemos un navegador de VRML o no. Recuerde que en el
constructor de la marca de verificación de la nula referencia de navegador? Si
no hay navegador, entonces no habría recuperado los campos, ya sea. Si
tratamos de llamar a un método de un campo nulo, que daría lugar a una
generación de Java NullPointerException. Por lo tanto, antes de llegar tan lejos,
acabamos de comprobar la bandera para ver que tenemos una conexión de
navegador en el primer lugar. Si lo hacemos, entonces podemos pasar a través
de los nuevos valores para el nodo con el método apropiado SetValue.

¡PRECAUCIÓN!: Hay un interesante fallo en el Netscape aplicación de la


Máquina virtual de Java para Navigator 3.x. Si intenta acceder a una variable o
método de referencia de un objeto que es nulo, es salir de ese método en
silencio sin que se genere una excepción o incluso informar al usuario. Un
número de veces que me llevan a esta creer errores existen en otras partes del
sistema, como la aplicación en CosmoPlayer. Este es un desagradable error que
esperamos que se establezca en la próxima versión de Navigator, que se
incluirá en el paquete de Netscape Communicator. Este tipo de errores debe
ser generar una NullPointerException pero no lo son.

Limpieza de

Al final del día, tenemos que asegurarnos de que todo está ordenado. Para
asegurarse de ello, cualquier clase interna que crea copias de tales arreglos y
se han definido el método de limpieza para que la clase (en lugar de basarse
en el valor predeterminado de un vacío VrmlObject).

Soy un paranoico, C / C + + programador en mi trabajo diario, y mi código Java


tiende a reflejar este hecho. En todos los métodos de limpieza, me aseguro de
que cualquier arreglos que tengo que se establecen referencias a nula y que
todos los niños tienen sus nodos llamados métodos de limpieza antes de que
su referencia a nulo. A pesar de Java no se ocupan de muchos de estos
problemas con la recolección de basura automático, me gusta para estar
seguros.

Temprano en el diseño del sistema, yo no podía trabajar por qué el código no


se limpiaron cuando se utiliza el método de finalizar. Luego tuve todo me
explicó. El simple razonamiento es que, en nombre de la ejecución, Java no
necesariamente eliminar realmente los objetos de la memoria si no es
necesario. El recolector de basura se marca como objetos listos para su
17

VRML 2.0 con Java CAPÍTULO 23

supresión, pero no eliminarlas (por lo tanto, llamar al método de finalizar) hasta


que tiene que absolutamente. Por esta razón, comenzaron a utilizar un método
explícito que se llama cuando quiere asegurarse de que todo se borra. Puede
llamarme paranoico. ...

A tratar a los niños Nodos

El Punto de vista de clase le faltaba sólo una cosa: No contiene ningún niño
nodos. Este es un aspecto importante que debe ser cubierto. Los niños
presentan un aspecto interesante a tratar.

En una serie de nodos, que sólo puede tener un determinado tipo de nodo de
VRML que el niño para un determinado campo. Hasta ahora hemos podido
evitar las capas de las clases abstractas y sólo subclassed VrmlObject
(haciendo caso omiso de cualquier argumento sobre la aplicación de la
funcionalidad común en una clase base). Uno de los objetivos de diseño fue
para garantizar la correcta sintaxis de VRML en el nivel de programador. Para
aplicar esto, permitir que sólo un nodo en particular la clase que se pasa al
método establecido.
Añadir un nodo

Como ejemplo, ver la forma nodo. Tiene dos SFNode exposedFields, uno para la
geometría y un aspecto de un nodo. En este último caso, esto es fácil de tratar,
ya que podemos especificar que el argumento de set_appearance ser un
aspecto de clase. No hay problema. Pero ¿qué ocurre con la geometría? No hay
nada en común entre cualquiera de los nodos de la geometría.

Resolver este problema es muy simple, también. (¿No hay una gran cantidad
de soluciones simples, en este capítulo) podemos crear una clase abstracta
llamada vacío Geometría que VrmlObject subclases. Todos los nodos de la
geometría puede esta subclase, y el método set_geometry VRML puede hacer
valer nuestras reglas sintácticas mediante la solicitud de que sólo las clases
basadas en la geometría se pueden pasar a él.
Eliminar un nodo

Una vez que haya decidido eliminar un nodo, tendrá que hacer lo contrario con
el proceso mencionado. Para eliminar un nodo, usted puede pasar un nulo para
el método apropiado en la clase de VRML.

Si el método detecta un puntero nulo de ser enviado a ella, llamará al método


adecuado de limpieza de la antigua nodo y, a continuación, comprobar si el
navegador está disponible en VRML. Si esto es así, entonces el método de los
controles de un nulo y si encuentra una, pasa a través de una nula SetValue el
método del campo. Si el nodo es válida en el pasado, se llama SetValue con el
nuevo nodo del nodo variable de instancia.

Debido a algunos problemas en las primeras versiones de la biblioteca y los


errores en CosmoPlayer, la supresión de múltiples nodos en el método de
18

VRML 2.0 con Java CAPÍTULO 23

limpieza de circuito a través de cada nodo y enviar a una persona para cada
evento removeChildren nodo hijo, en vez de limitarse a llamar set_children
(null). Es probable encontrar un par de cosas como esta todo el código.
Otras estrategias Nodo

Varios de los nodos de VRML siempre más interesantes retos a superar, aparte
de los descritos anteriormente. En esta sección, voy a describir brevemente
estos problemas y cómo se sobrepuso a ellos.
Nodos de audio

De audio es un problema difícil de resolver. Por un lado, el sonido, ya sea nodo


puede tener un AudioClip o un MovieTexture de la fuente sobre el terreno. El
problema de la AudioClip fue fácil, pero ¿qué pasa con el MovieTexture?

MovieTexture puede proporcionar la fuente de audio a una escena si usted está


usando los sistemas MPEG-1 (véanse los capítulos 10 y 11 para obtener más
información sobre cómo utilizar estos nodos). Al mismo tiempo, un
MovieTexture es fundamentalmente una textura. ¿Qué hacer? Usted no puede
crear el MovieTexture sobre la base de múltiples clases abstractas, ya que
simplemente no funcionaría (Java no admite herencia múltiple de clases), y
también cosas que hasta la jerarquía de los demás nodos de la textura.

En lugar de ello, he tenido que utilizar una interfaz para lograr los mismos
resultados. La textura se extiende ahora MovieTexture y aplica AudioNode. Sin
embargo, esta solución también da lugar a otras trampas.

Si estamos pasando de una interfaz, ¿cómo podemos obtener de la correcta


nodo de referencia, ya que la interfaz no se define esto? Si así fuera, el nodo de
referencia sería necesario para ser una variable, que no se puede cambiar en
tiempo que la creación de una clase abstracta debe. Podríamos pasar una
VrmlObject a través del método, pero que elimine nuestra capacidad para
hacer cumplir el tipo de control en tiempo de compilación.

La solución más fácil es aún pedir la interfaz y, a continuación, utilizar


instanceof para comprobar si el nodo que se aprobó en MovieTexture o es un
AudioClip. La interfaz es entonces emitidos para el tipo apropiado, y el método
se llama SetValue apropiadamente. El código para hacer esto se muestra a
continuación:

public void set_source (AudioNode fuente)


(
_source = (VrmlObject) la fuente;
if (_source! = null)
_source.cleanup ();

if (have_browser)
(
if (fuente! = null)
_set_source.setValue (_source.node);
algo más
19

VRML 2.0 con Java CAPÍTULO 23

_set_source.setValue (null);
)
)

La única hipótesis aquí es que un nodo que implementa AudioNode también


subclases VrmlObject. Esto no es ningún problema, ya que los únicos dos
nodos jurídico ya hacer esto. Podría ser un poco más paranoico e iniciar la
comprobación de los tipos de nodo, pero eso es un poco de trabajo extra para
no ganar mucho, especialmente si usted quiere crear su propio nodo de audio
especialista.
Colisiones

Colisión nodos proporcionan un desafío diferente a la de los nodos de audio, en


particular en el ámbito de proxy. Proxy tiene un campo de tipo de acceso, lo
que significa que una vez que haya creado el nodo, no tendrá acceso a ella.
Este es un pequeño problema. La única manera de especificar un niño por una
cadena, y la forma en nuestro sistema de nodo se crea, todo lo que creamos
distintos objetos: una clase por nodo. ¿Cómo especificar un niño, y aún así
tener acceso a ella a fin de que podamos cambiar los valores de proxy sobre la
marcha?

La solución viene en la forma de las-a menudo olvidado DEF / USO


construcciones. Sin embargo, debemos ofrecer un ámbito limitado de lo que
potencialmente podrían estar disponibles. La especificación de VRML 2.0 dice
que el representante de campo podría contener cualquier nodo secundario.
Potencialmente, esto podría significar un punto de vista que podría definirse
como el representante de la colisión! En cambio, ofrecen una elección: o hay
un nodo para el Grupo de poder, o no hay poder.

¿Por qué debería ofrecer sólo un nodo de Grupo? Para añadir y eliminar nodos
dinámicamente a partir de la representación, es necesario que usted tenga
algún tipo de agrupación nodo. El Grupo de nodo es el más ligero, y si es
necesario para mover el poder de transformación con un sobre, usted siempre
puede añadir a la transformación del Grupo.

Tras esta decisión, el resto es fácil, ¿verdad? Digamos que crear el nodo con la
siguiente llamada:

Nodo [] = n browser.createVrmlFromString ( "Collision (proxy Grupo ())");

Ahora, ¿cómo podemos obtener el acceso al Grupo de nodo? No podemos


llamar getNode sobre la escena, porque no hay DEF en la cadena. Incluso si
20

VRML 2.0 con Java CAPÍTULO 23

hubiera, el nombre de alcance cuestión (incluidos en los capítulos 1, 5, y 6)


significa que todavía no tienen acceso al nodo. Ahora considere el texto
siguiente:

Nodo [] = n browser.createVrmlFromString ( "Collision ("


"Proxy DEF G Grupo ()"
")"
"USO G");

¿Qué es esto "USO G" cosa sobre? En términos sencillos, es la creación de un


nodo de nivel superior que hace referencia a un Grupo nodo. Conceptual
equivalente sería el siguiente archivo VRML:

# VRML V2.0 utf8


Collision (
# El primer grupo de nodo
Grupo proxy ()
)
# Segundo grupo de nodo
(Grupo)

Pero en nuestro caso anterior, los dos grupos son en realidad la misma cosa.
Añadir un nodo al segundo grupo de medios que aparece automáticamente en
la primera, por lo tanto, como la definición de la geometría del proxy. La razón
de tener la USO en el nivel superior es para que podamos recuperarlo de la
serie de nodos que son devueltas de crear la llamada.

Con este truco, ahora podemos añadir y eliminar dinámicamente geometría


que actuará como representante de nuestro colisiones-y hemos hecho, sin
limitar el programador. La única concesión a las reglas en el método normal es
que hemos añadido un método para permitir al usuario obtener el identificador
para el grupo que es el proxy.
Uso de la Biblioteca

He cubierto la mayor parte de la biblioteca cuestiones en las secciones


anteriores, por lo que voy a ir sobre ellos de nuevo ligeramente. Vamos a
suponer que usted ya tiene la clase Java escrito que va a utilizar estos nodos.

1. En la parte superior del archivo, tendrá que importar la biblioteca con

importación vlc.vrml.external.geometry .*;

2. Luego de crear una instancia del nodo que desee. Si usted tiene un pre-
existente de objetos del navegador, que pasa al constructor. Si usted tiene
21

VRML 2.0 con Java CAPÍTULO 23

algunos de los valores de campo tipo de acceso que se establezcan, llame a la


constructora.
3. Actualizar cualquiera de los otros campos que desea que se observa en el
gráfico de la escena con los set_ <fieldname> método.
4. Si necesita volver a leer los acontecimientos desde un eventOut, puede
llamar a la get_ <eventOutname>.

La construcción de una escena gráfica es tan simple como agregar nodos como
hijos de otros nodos. Para un buen ejemplo de ello, echar un vistazo a el editor
que se presenta en el capítulo 12. La mayoría de las estructuras de datos
internas se basan en esta biblioteca.
¿Qué hace falta?

Lo creas o no, todavía hay un poco de trabajo de desarrollo que queda por
hacer en este paquete. He señalado algunos de los agujeros como he ido a lo
largo. El tema principal de estas mejoras es la mejora de la robustez del
sistema en general.

Un buen nivel de seguridad ha sido forzada a través de la estructura de clases,


por lo demás es lo que queda por hacer? ¿Qué sucede si usted pasa a través
de una serie de flotadores SFVec3f para un campo que tiene sólo dos valores
en el mismo, en lugar de tres? El SetValue método de lanzar una excepción.
Estoy haciendo nada para capturar este tipo de errores. Por el momento,
supongo que todos los datos que tengo es la correcta. Más el manejo de
errores y las excepciones son necesarias.

PROTO y EXTERNPROTO falta de la aplicación. Tengo en mente un diseño para


la EXTERNPROTO, pero no he llegado a ninguna conclusión firme sobre la mejor
manera de aplicar el tratamiento de un PROTO. En el momento de leer esto,
debería tener todo planeado, por lo que no se olvide de visitar la página de
JVerge (http://www.vlc.com.au/JVerge/) para las actualizaciones más recientes.

La falta de utilidad es otro problema. A pesar de que la biblioteca funcionará


sin un navegador de VRML, todavía se da por supuesto que usted puede
encontrar la jerarquía vrml.external en su CLASSPATH. Este es un importante
obstáculo para hacer esta biblioteca más genérico. Una versión reducida de la
biblioteca sería bueno para versiones independientes, y una versión que corre
con Script también sería útil. Afortunadamente, esta modificación se cubrirán
en breve.

La ampliación de la Biblioteca de la cubierta interior de scripts

Después de haber creado un conjunto de nodos que eliminan la necesidad de


22

VRML 2.0 con Java CAPÍTULO 23

tratar directamente con el EAI y en su lugar creó VRML, ¿no sería bueno para
ofrecer el mismo nivel de abstracción para la interfaz de secuencias de
comandos como así? Con un poco de trabajo, se puede. He aquí cómo hacerlo.

El primer paso que debemos tomar es la creación de un nuevo paquete. Este


será llamado

vlc.vrml.internal.geometry

Lleve una copia de todas las clases desde el exterior de código y copiarlo en
otro directorio que contiene el nuevo paquete.

Ahora, el cortar y pegar de comenzar el trabajo. Las siguientes modificaciones


se hicieron:

• El paquete de nombre fue cambiado a vlc.vrml.internal.geometry.


• La importación se modificaron las líneas de

importación vrml.external .*;


importación vrml.external.field .*;

para

importación vrml .*;


importación vrml.field .*;
vrml.node.Node de importación;

• quité los constructores que utilizan el método estático getBrowser, ya que


no está disponible para los scripts.
• Todos los campos eventIn fueron modificadas para eliminar las palabras
EventIn del tipo (esto cambia si a partir de la EAI basada en las variables a las
secuencias de comandos), a fin de EventInMFNode convirtió MFNode, por
ejemplo.
EventOut campos se han cambiado, por ejemplo, EventOutMFNode convirtió
ConstMFNode.
• Cualquier campo que era un MF / SFNode base ha de tener la nula
emitidos para un tipo adecuado para evitar el compilador conseguir
confundirse con métodos ambigua.
• MF Otros campos que podrían ser consultados había modificado el método
interno. La interfaz de scripting MF dispone de todos los campos por la
devolución de valores de referencia en el getValue método. El siguiente
ejemplo de código viene de la versión externa e interna de la clase
ColorInterpolator, respectivamente:
23

VRML 2.0 con Java CAPÍTULO 23

público flotar [] get_value_changed ()


(
return (_get_value_changed.getValue ());
)
se convirtió en
público flotar [] get_value_changed ()
(
flotado [] val = null;
_get_value_changed.getValue (val);
return (val);
)

• Cuando las llamadas se hicieron createVrmlFromString, estos tenían que


ser modificado ligeramente. El método createVrmlFromString arroja un
InvalidVRMLSyntaxException, que debe ser abordado. No hago nada con
cualquier generado una excepción.
• También, crear la llamada devuelve un array de BaseNodes, en lugar de la
normal Nodo. Esto requiere que emitir el valor de retorno del método a un
nodo. El código completo se ve como el siguiente:

intentar
(
nodo = (Nodo) b.createVrmlFromString ( "Caja {}")[ 0];
)
de capturas (InvalidVRMLSyntaxException e)
(
)

Así era él. El cambio es básicamente uno de pura fuerza muscular. No hay
cosas que hay que considerar interrelacionados con las distintas API. Todo lo
que hay que hacer es ir a través de todos los impares de los 60 archivos y
hacer lo mismo, una y otra y otra vez. ...

La gran ventaja que he encontrado con esta modificación es que, debido a un


buen código de diseño a principios de la pieza, sólo había un par de lugares
que tenía que modificar en cada archivo. Todos los códigos de trabajo se
mantuvo en el mismo-los nombres de variable y el método, la limpieza, la
suerte!
Resumen

Hay un montón de recordar que se ha presentado en este capítulo. No sólo


usted tiene que aprender a lidiar con la Interfaz de Aplicación de VRML exterior,
pero también tuvo que tratar con Java y de alguna combinación de los dos
24

VRML 2.0 con Java CAPÍTULO 23

juntos. A lo largo del camino, usted ha tenido que ver cómo he diseñado en el
sistema una gran cantidad de código adicional para manejar los errores no sólo
en el navegador de VRML, pero también la JVM que se utiliza para ejecutar el
código en. Incluso Microsoft logró su cabeza en el camino y la fuerza adicional
de programación en mí.

El código presentado en este capítulo ha sido probado sólo con CosmoPlayer


beta 3 se ejecuta en Netscape Navigator 3.01. Algunos de los primeros
comentarios sugieren Cosmo con Internet Explorer parece funcionar (después
de obtener el asa a la del navegador de VRML, que es otro problema en sí
mismo). El código original fue entregado a la biblioteca la lista de VRML
desarrollo a principios de enero de 1997. Si bien aún temprana en el desarrollo,
que ya ha demostrado ser útil para diversas aplicaciones. Espero que también
se encuentra presente una práctica biblioteca.

Lo que queda para nosotros a cubrir? Hemos pasado por casi todo: VRML,
convertidores, sistemas multiusuario, y mucho más. ¿Qué ha quedado? ¿Cómo
sabes que lo que usted tiene en su código de estructuras de datos en realidad
representa lo que el navegador está mostrando? Siga leyendo para obtener
más.

Potrebbero piacerti anche