1 VRML 2.0 con Java CAPÍTULO 6
El Liquido “Realidad” API
Contenido CAPÍTULO 6 • • • • •
¿Por qué un API? El líquido Realidad Paquetes Java Las clases de Java VRML Uso de la API Todavía se necesita
2 VRML 2.0 con Java CAPÍTULO 6
¿Por qué un API? En el capítulo anterior sobre la autoría de interfaz externa proporcionó parte de la motivación para una API externa para VRML, de hecho, la realidad era un líquido de última entrada propuesta de una EAI y lo puede todo "oficial" de EAI puede hacer y más. (Tenga en cuenta que el "oficial" de EAI es todavía sólo una propuesta, que todavía no ha sido incorporado en la especificación de VRML.) Aunque el proyecto de EAI tiene el potencial para convertirse en una interfaz a través de plataformas y navegadores de VRML, es una solución ligera. En la práctica, sólo uno o dos navegadores apoyo, que sólo existe en
3 VRML 2.0 con Java CAPÍTULO 6
una plataforma (Windows 95), y existen importantes lagunas en la funcionalidad proporcionada por la aplicación. Realidad líquido, por otro lado, es un bien desarrollado API que existe actualmente para muchas plataformas y ofrece sus propias funciones de representación, de modo independiente se pueden escribir aplicaciones que omiten por completo el navegador. Como un API, la realidad de líquidos puede proporcionar funciones de análisis, renderizado, VRML y escritura compatible con los archivos, así como funciones para la manipulación de la escena gráfica interactiva. Puede aprovechar el AWT de Java para proporcionar los controles que manipulan los elementos de escena (por ejemplo, un cuadro de diálogo para manipular un objeto de la posición y orientación), o puede conectar llamadas a determinados lugares de la escena que se invoca a transversal, o bien sobre una determinada acción. Por supuesto, las posibles ampliaciones de Java, como el paquete de JDBC para acceder a bases de datos relacionales, pueden ser utilizados por un programa escrito con la API de líquidos realidad. Un API puede actuar en toda la escena VRML desde el exterior, evitando así un navegador centrado en vista de la escena. Líquido en la realidad, la aplicación o applet puede controlar cada objeto independiente. Objetos pueden chocar entre sí o pueden poner en práctica el comportamiento de evitación. Esta relación entre los pares de objetos va más allá de lo que es posible dentro de la actual arquitectura de VRML 2.0. Realidad líquido no es sólo una de API, es una colección de varios, que no sólo tiene un API para manipular los nodos de VRML, pero también las API de nivel inferior a 3-D las matemáticas y el renderizado. En la sección siguiente le dará una pequeña muestra de lo que está disponible. No podemos explicar todas las clases de líquidos que tiene la realidad, por lo que nos limitaremos a resumir el contenido de cada paquete, y algunos de los más interesantes las clases en cada uno. También vamos a presentar un ejemplo de cómo utilizar líquidos Realidad.
El líquido Realidad Paquetes Java Realidad líquido clases se agrupan en 11 paquetes separados, tres de las cuales son las secuencias de comandos estándar de Java VRML paquetes; el resto son específicas de la realidad de líquidos. Vamos a examinar estos paquetes uno por uno: Vamos a empezar con el más general de los paquetes, que se basan en la parte superior de la funcionalidad de Java, y
4 VRML 2.0 con Java CAPÍTULO 6
nuestra forma de trabajo a los paquetes que proporcionan el alto nivel de líquidos Realidad API.
Paquetes dnx.util and dnx.awtutil Estas dos clases de paquetes contienen líquido utilizado internamente en la realidad. El líquido Realidad documentación recomienda que ninguna de las clases de estos paquetes ser utilizados directamente por un programador de aplicación, ya que están sujetas a cambios. El dnx.util envasados se compone de clases de utilidad general, tales como estructuras de datos (tablas hash, listas, etc), a través de la intensificación de las enumeraciones de los contenidos de estas estructuras de datos, los observadores y observables (aplicación del "observador" patrón de diseño) , y otras clases de utilidad general.
El paquete dnx.awtutil, por otra parte, contiene gráficos de utilidad clases, incluidos los componentes, tales como AWT ColorPicker, ImageButton, y TransparentCanvas. Otras clases incluyen NumberEntry (un campo de texto que acepta sólo números) y URLEntryPanel (un grupo que contiene un texto que sólo aceptará URL válida). Las clases en dnx.awtutil no dependen de las clases en dnx.util.
Paquete dnx.geom Si estás cansado de escribir varias veces su propio código de 3-D las matemáticas, dnx.geom es un sueño hecho realidad. Contiene todas las clases y métodos que usted necesita para almacenar y manipular dos, tres y cuatro (homogénea) componente de vectores y matrices, y que ofrece una clase para manipular quaternion rotaciones, así como clases, para realizar proyecciones ortográfica y la perspectiva. Clases de dibujo en general se ofrecen para los puntos, líneas y polígonos, y la utilidad de las clases saltando cajas y las dimensiones también están presentes. Geom La clase consiste en su totalidad de los métodos para manipular los objetos en este paquete. Gran parte de la funcionalidad de este paquete está prevista para el próximo Java3D API desarrollada por Sun Microsystems en colaboración con sus asociados para el desarrollo, pero es interesante observar que Java3D no está disponible o incluso públicamente documentado, sin embargo, mientras estos Dimensión X clases se han alrededor de más de un año. Aunque Java3D puede duplicar la funcionalidad del paquete dnx.geom, Java3D no tiene previsto abarcar la funcionalidad proporcionada por los otros dnx paquetes, por lo que la API no son dos competidores directos.
Paquete dnx.ice
5 VRML 2.0 con Java CAPÍTULO 6
Ya mencionamos que la realidad Líquido hacer su propio código, el ICE, que está diseñado para ser portado fácilmente y rápidamente, para proporcionar la capacidad de hacer en todas las plataformas, y que se adapta fácilmente a la utilización de aceleración de gráficos nativos. Para utilizar ICE de Java, sin embargo, necesitamos un conjunto de clases envoltorio que nos permiten acceder a la prestación de bajo nivel de paquetes. El dnx.ice paquete proporciona una interfaz uniforme en CIE, Direct3D, OpenGL, o de otro tipo de paquetes y permite hacer líquidos separados limpiamente a la realidad de su plataforma de código específico de la prestación. Clases disponibles incluyen Graphics3D (una encapsulación del framebuffer con un gran número de métodos para manipular el framebuffer), Modelo (una colección de primitivas de la prestación), de textura, luz, los materiales, la niebla, y otros.
Paquete dnx.lr El paquete dnx.lr VRML es un nodo de escena y la manipulación del paquete gráfico, es el mayor de los envases de líquidos realidad y se considera el núcleo de la realidad de líquidos. Las clases son de escenas clave, que ocupa la escena gráfica, y Nodo, que es la clase padre de todos los nodos de VRML. Métodos definidos en el nodo le permiten encontrar, obtener o establecer los pequeños, los padres, los campos, eventIns, eventOuts y rutas a cualquier nodo. Por lo tanto, para la manipulación de la escena gráfico, nodo es probablemente el más importante de la clase en la API. Otras clases incluyen VRMLPrintStream y VRMLTokenizer, clases para llevar a cabo acciones de selección y las clases para obtener los detalles de una selección (normal, el punto en la superficie, y así sucesivamente, de la recogida de objetos). Muchas otras clases de proporcionar información detallada sobre una escena, la búsqueda de escenas de nodos DEF por nombre o tipo de nodo, y encontrar, añadir, eliminar o insertar los niños. Una transversal de clase le permite recorrer la escena gráfica. Incluso hay clases que te dan en la prestación ganchos transversales de la escena gráfica, así que usted puede personalizar el proceso de renderizado, si lo desea.
Paquete dnx.lr.field El paquete contiene dnx.lr.field clases para cada tipo de campo se define en
6 VRML 2.0 con Java CAPÍTULO 6
la especificación de VRML. Estas clases son en casi de uno a uno la correspondencia con la norma vrml.field paquete, pero dnx.lr.field no contiene ninguno de los Const campos presentes en el paquete vrml.field. Los dos conjuntos de las clases tienen el mismo significado, pero las distintas aplicaciones, por lo que no son intercambiables. Por ejemplo, la clase SFFloat aparece en ambos paquetes, y en ambos paquetes que representa el VRML SFFloat tipo de datos, pero los métodos difieren entre los dos paquetes. En particular, el dnx clases más ricas tienen un conjunto de métodos definidos. SFVec3f la clase, por ejemplo, tiene un normalizar () método para normalizar el vector de una unidad de longitud y equals () método para comparar dos objetos SFVec3f, sino que también tiene otras "ajuste" y "obtener" los métodos de conveniencia. Asimismo, el SFRotation clase puede tener un quaternion como argumento o puede devolver un quaternion, además de la normal eje angular argumentos proporcionados por el vrml.node.SFRotation clase.
Paquete dnx.lr.node Así como el paquete dnx.lr.field definido una clase para cada tipo de campo de VRML, el paquete dnx.lr.node define una clase para cada uno de los nodos de la especificación de VRML. Vrml.node mientras que el paquete contiene sólo dos clases, vrml.node.Node y vrml.node.Script, el dnx.lr.node paquete contiene 64 clases, una para cada uno de los 54 tipos de nodo de VRML más 10 otros líquidos realidad específica utilidad de los nodos. Clases para cada uno de los nodos de VRML son tan útiles, que más adelante en este libro que le llevará a través del desarrollo de un paquete similar para su uso dentro del EAI, que actualmente carece de esas clases. Los 10 nodos añadidos son principalmente de tipo fundición nodos (como DNXBooleanIntConversionNode) que se ocupan de problemas de conversión de tipo en VRML. Uno de estos problemas: En VRML no hay nodos que pueden generar un tipo SFInt32 evento. Ninguno. Sin embargo, existen algunos nodos que puede aceptar SFInt32 tipo de eventos. Sin tipo de fundición nodos, usted tendría que poner en marcha un nodo utilizando comandos de Java o JavaScript y realizar un explícito emitidos dentro de su código. Tipo de colada nodos proporcionan "pegamento" para eludir estos problemas. Todos los líquidos específicos de la realidad son nodos con el prefijo "DNX" y se puede utilizar dentro de su archivos VRML simplemente declarando el nodo como un EXTERNPROTO y apuntando a la realidad la aplicación de líquidos:
7 VRML 2.0 con Java CAPÍTULO 6
EXTERNPROTO DNXBooleanIntConversion [ exposedField SFInt32 trueValue exposedField SFInt32 falseValue eventIn SFBool set_SFBool eventOut SFInt32 SFInt32_changed eventIn SFInt32 set_SFInt32 eventOut SFBool SFBool_changed ] "urn:inet:dnx.com:lrnode:dnx.lr.node.DNXBooleanIntConversionNode"
Nodos en este paquete tienen todos los métodos que permiten al usuario para averiguar qué campos se definen de ese nodo y para obtener los valores de los campos. Esto permite que el usuario de la API para escribir programas que se ocupan de los tipos de nodos que se desconoce en tiempo de compilación una potente característica.
Paquete dnx.lr.app El paquete consiste dnx.lr.app de clases que proporcionan el marco para una aplicación o applet de VRML. Dnx.lr.app el paquete a su vez es utilizado para construir aplicaciones tales como el pleno funcionamiento LRBrowser navegador VRML 2.0 que se incluye como parte de la realidad de líquidos. Las dos clases básicas en este paquete son AppletDocument y ApplicationDocument. A Documento encapsula una escena y los dictámenes de la escena. A Ver muestra algunos subarbol de la escena y los procesos o administra las aportaciones de los usuarios para que subárbol. Un programa de realidad líquido puede leer en una escena, crear un documento para mantener la escena, adjuntar un documento que a View3D, establecer las View3D en un componente AWT de contenedores, y enviar un inicio () mensaje a los documentos. Los televidentes como ExamineViewer, FlyViewer, y WalkViewer manejar el usuario la navegación y la interacción con la escena.
8 VRML 2.0 con Java CAPÍTULO 6
El VRML Java Clases Líquido realidad viene con una completa aplicación de los paquetes estándar de VRML para Java scripts. Son paquetes en su propio nombre y en conformidad con la especificación de VRML 2.0, aunque parece la misma funcionalidad de las clases en el marco del dnx jerarquía. Esta segregación y la duplicación de las clases dentro de la API de líquidos Realidad líquido permite ajustarse a la realidad con VRML 2.0 y para ofrecer mayor funcionalidad y extenderse dentro de su propio API al mismo tiempo. La presencia de las clases Java estándar VRML líquido significa que la realidad puede ser utilizado en la misma forma que lo haría para utilizar cualquier otro conjunto de clases Java-VRML en un nodo de secuencias de comandos a escribir su propio PROTO, por ejemplo. Vamos a examinar brevemente el VRML clases aquí.
Paquete vrml El paquete contiene el vrml vrml.Event, vrml.Browser, vrml.Field, vrml.MField, vrml.ConstField, vrml.ConstMField, y vrml.BaseNode clases.
Paquete vrml.field Vrml.field El paquete contiene una clase para cada tipo de campo se define en la especificación de VRML-cada una de estas clases se extiende sobre el terreno o Mfield. Este paquete contiene también una Constitución clase para cada tipo de campo para mantener los campos que no se puede modificar la Constitución-estas clases ConstField o ampliar ConstMField.
Paquete vrml.node Como señalamos antes, este paquete contiene sólo dos clases: vrml.Node y vrml.Script. Uso de la API Con un API de este grande, no tenemos espacio para entrar en un conjunto mucho más detalle. (Tal vez alguien escribirá un libro sobre él!) Así, en el resto de este capítulo, vamos a caminar a través de sólo un pequeño ejemplo de cómo escribir usando un navegador de VRML Realidad líquido, que se muestra en el Listado 6.1. Este ejemplo es esencialmente el mismo que el ejemplo SimpleViewer.java que viene con la distribución de líquidos
9 VRML 2.0 con Java CAPÍTULO 6
realidad. La mejora de este navegador mínimo sería un gran primer proyecto.
Listado de 6.1 mínima del navegador de VRML escrita Uso de la API de líquido Realidad import import import import import
dnx.lr.*; dnx.lr.app.*; java.awt.*; java.io.IOException; java.net.URL;
public class VRMLBrowser extends Frame { protected ApplicationDocument document; protected View3D view; public VRMLBrowser(String title) { super(title); setLayout(new BorderLayout(5, 5)); Panel p = new Panel(); p.setLayout(new BorderLayout()); p.add("West", new Label("Location: ", Label.LEFT)); p.add("Center", new TextField()); add("North", p); } public boolean action(Event event, Object arg) { if (event.target instanceof TextField) { System.err.println("Loading new URL: " + arg); try { readScene((String) arg); } catch (VRMLSyntaxException e) { System.out.println ("Invalid VRML Syntax in file: " + arg); return false; } catch (IOException e) { System.out.println ("Unable to load: " + e); return false; } return true; } return false; } public boolean handleEvent(Event event) { if (event.id == Event.WINDOW_DESTROY) { System.exit(0); } return super.handleEvent(event); } public Insets insets() {
10 VRML 2.0 con Java CAPÍTULO 6
return new Insets(super.insets().top + 5, super.insets().left + 5, super.insets().bottom + 5, super.insets().right + 5); } public void readScene(String arg) throws VRMLSyntaxException, IOException { URL url = new URL(ApplicationDocument.getCurrentDirectory(), arg); Scene scene = new Scene(new ReadAction(url)); ApplicationDocument doc = new ApplicationDocument(scene); if (view == null) { document = doc; view = new BrowserView3D(document); } else { document.stop(); document = doc; view = new BrowserView3D(document); add("Center", view.getComponent()); validate(); document.start(); } } public static void main(String[] args) { VRMLBrowser frame = new VRMLBrowser("Minimal VRML Browser"); if (args.length != 1) { System.err.println("Usage: java VRMLBrowser "); System.exit(0); } try { frame.readScene(args[0]); } catch (VRMLSyntaxException e) { System.out.println ("Invalid VRML Syntax in file: " + args[0]); return; } catch (IOException e) { System.out.println ("Unable to load: " + e); return; } frame.add("Center", frame.view.getComponent()); frame.resize(440, 340); frame.show(); frame.document.start(); }
}
11 VRML 2.0 con Java CAPÍTULO 6
VRMLBrowser es una subclase de cuadros, ya que estamos haciendo una aplicación independiente. En el constructor, que establecen la interfaz de usuario, creando un campo de texto para que el usuario escriba una dirección URL y la reserva de espacio para la vista 3-D, que creará más tarde. Manejo de eventos se realiza con dos métodos: la acción (), para hacer frente a las URL en el texto escrito, y handleEvent (), para permitir al usuario a cerrar la ventana. El verdadero trabajo se hace en readScene (), en el que crear una escena de un objeto archivo VRML. A continuación, tenemos que crear un nuevo documento para mantener la escena, y crear un View3D que es un punto de vista de los documentos. El componente de la vista se agrega a la VRMLBrowser marco, y start () se llama en el documento para iniciar el procesamiento de líquidos Realidad eventos. Un método main () también se brinda ya que es una aplicación independiente. Observe que no usamos un montón de la API en este ejemplo-que es el punto. Puede código independiente de aplicaciones Java o applets de la misma manera siempre lo haces, entonces la mezcla líquido en unas pocas clases de la realidad para conseguir un navegador totalmente funcional o VRML para crear sus propias animaciones en 3-D o simulaciones sin la participación de todos en VRML. Tenga en cuenta que las clases se utilizan en este ejemplo, proceden de la dnx.lr y dnx.lr.app paquetes. Si íbamos a manipular la geometría (es decir, si esto llegara a ser un editor de VRML, más que un navegador de VRML), habría algunos de los otros paquetes.
Todavía se necesita La realidad de la debilidad líquido se puede resumir en una palabra: la documentación. Si bien una lista de todas las clases y métodos se presenta en forma de documentación javadoc (véase http://www.dimensionx.com/products/lr/docs/javadoc-lr/packages.html), pocos de estos han de acompañamiento descripción, y menos aún los ejemplos de su uso. Hay poca disposición código de ejemplo escritos utilizando la API de líquido realidad, y lo que está disponible, una vez más, tiene escasa documentación. Esto se ve obligada a cambiar en un futuro próximo; Dimensión X reconoce esta debilidad y está trabajando en una amplia documentación. Y no olvides que la realidad de líquidos se encuentra aún en la fase de prueba beta, por lo que no pueden esperar un producto terminado. Otra fuente de problemas es que el ICE, líquidos Realidad 3-D del motor de
12 VRML 2.0 con Java CAPÍTULO 6
renderizado, se invoca a través de los métodos de la interfaz nativa de Java. Esta interfaz no tendrá una especificación oficial hasta el lanzamiento de la versión 1.1 de Java Developer's Kit. Actualmente, Netscape utiliza un poco diferentes métodos de la interfaz nativa de Java, y Microsoft tiene su propia interfaz de métodos nativos, por lo que la realidad líquido tiene algunas dificultades de funcionamiento dentro de estos navegadores. (Una tabla de las incompatibilidades que puede encontrarse en http://www. Dimensionx.com / products / lr / descarga.) Atletismo de la appletviewer, sin embargo, funciona bien. El navegador de la situación debería mejorar con la normalización de la interfaz nativa método en el JDK 1.1. Sin embargo, a pesar de sus dolores de crecimiento, proporciona la funcionalidad de la realidad líquido incomparable por cualquier otro API de desarrollo de VRML. Merece la pena su tiempo para probarlo a cabo, una vez que la forma de usar la API, lo encontrará muy útil y poderosa.