1 VRML 2.0 con Java CAPÍTULO 4
APIs Y Estándares Adicionales
2 VRML 2.0 con Java CAPÍTULO 4
Contenido CAPÍTULO 4 “El Nodo de secuencias de comandos y Secuencias de comandos de la API “ • • • • • •
El VRML Script de Nodo hablando del navegador Secuencias de comandos de JavaScript Secuencias de comandos de Java Escribir un Java Script ¿Qué idioma debo usar?
El VRML Script de Nodo
3 VRML 2.0 con Java CAPÍTULO 4
Por cada idioma inventado siempre debe haber un patito feo. En este caso, los comandos de nodo es el candidato. Es muy diferente en función de comparación con los otros nodos de VRML. Hay sólo tres campos básicos de usar y usted puede especificar sus propios campos. Diseño de un script toma un poco de pensamiento, porque lo que necesita saber no sólo lo que quieres hacer en el guión, sino también cómo llegar a ella el resto de tu escena. Cuando se desea crear su propio comportamiento, primero debe definir los campos que usted necesita para acceder a la secuencia de comandos de código (de hecho en el archivo VRML), entonces usted necesita para crear el guión propio código. Esto se puede hacer en cualquier lenguaje de scripting, pero en el momento de escribir sólo hay lengua oficial bindings para Java, JavaScript, y un subconjunto de JavaScript conocido como VRMLScript.
Basic Script Nodo Campos Cada nodo de secuencias de comandos que cree tiene tres campos que están siempre presentes. Dos de ellos no se fijan, porque los valores predeterminados son adecuados, pero voy a hacer frente a estos primeros. El primer campo que vemos es mustEvaluate. Este campo booleano controla la cantidad de optimización puede realizar el navegador. Si se establece en TRUE, el navegador se ve obligada a enviar los sucesos a la secuencia de comandos en el momento en que ocurren. Cuando el valor predeterminado es FALSE, el navegador se permite retrasar el envío de insumos para el guión hasta la producción de la secuencia de comandos que se necesita por el navegador. Normalmente sólo se configura en TRUE si usted sabe que habrá algunos efectos, como enviar / leer el tráfico de la red, que el navegador no es consciente de. El segundo campo es directOutput. Cuando está establecido en TRUE, un script puede enviar eventos directamente a otros nodos de la escena. La única manera de que un script puede enviar eventos directamente a otro nodo es si uno de los ámbitos ya la secuencia de comandos es un SFNode o MFNode pasó a él (ya sea un eventIn o como un campo con una asignación con el uso). Asimismo, este te permite hacer otras cosas como hacer dinámica y romper las rutas a otros nodos. Por otra parte, en caso de salida directa se establece en FALSE (el valor por defecto), la única manera de que la secuencia de comandos puede afectar a otros nodos de la escena es a través de la eventOuts y rutas que se han creado en el archivo VRML.
4 VRML 2.0 con Java CAPÍTULO 4
Aparte de estos dos campos, hay un campo que se requiere en cada nodo de secuencia de comandos que cree: la URL del código. El campo url puntos en el archivo o contiene el código "inline" para el uso de esa secuencia de comandos. Por ejemplo, se podría apuntar a un archivo de clases de Java o "inline" para el código JavaScript. El particular formato de URL para cada idioma se trata en cada una de las secciones específicas del idioma más tarde. Nota: Si desea crear dinámicamente y romper rutas en la escena, debe tener el campo directOutputs asignado a true.
VRML no cuenta en la actualidad el mandato que utilice un determinado lenguaje para la creación de guiones. Para solucionar este problema, el campo de URL es un MFString, por lo que puede ofrecer múltiples opciones para las secuencias de comandos. Esto significa no sólo puede proporcionar un número de sitios diferentes para la una sola pieza de código, sino también una serie de alternativas escritas en diferentes idiomas. Simplemente enumerarlos en orden descendente de preferencia.
Añadir Tus Campos Una secuencia de comandos sin ninguna entrada y / o de salida es de poco valor a su mundo. Para proporcionar esta funcionalidad, tiene que declarar su propio conjunto de campos evento. Estos se declaran de la misma manera que las declaraciones utilizadas en el pliego de condiciones y la PROTO nodos-es decir, usted debe declarar el tipo de acceso, tipo de campo, nombre de campo, y el valor cuando sea necesario. Una declaración típica de secuencias de comandos se vería como la siguiente forma general: DEF my_script Script { url "java_class_dir/my_script.class" directOutput TRUE field SFNode other USE my_other_node eventIn SFVec3f set_position eventOut MFFloat output_changed }
Note cómo la url directOutput y los campos son la forma normal de un nodo de VRML, pero el resto de los campos tienen el largo definición. Campos y exposedFields tendrá que tener su valor fijado en la misma forma que lo haría prototipo nodos.
5 VRML 2.0 con Java CAPÍTULO 4
Ejecución de secuencias de comandos Scripts de adherirse a la ejecución como el modelo descrito en el capítulo 2. Básicamente se le garantiza a los acontecimientos en orden de tiempo, y no tiene "tiempo" para recibir y procesar eventos en la secuencia de comandos. Posiblemente la mayoría de lengua encuademaciones proporcionará las funciones de inicialización y cierre también. Iniciar después de todo se llama la parte superior de nivel mundial (en relación con el mundo que está en script) ha cargado, pero antes de los sucesos se han generado en el mundo. Usted puede usar esto para crear la primera salida de un nodo que genera un toro objeto, por ejemplo. Obras de cierre en el otro extremo de la secuencia de comandos de la vida. Se llama después de todos los eventos de secuencia de comandos que se han tramitado y justo antes de la secuencia de comandos se elimina de la escena. En esta función que se espera para limpiar los archivos temporales, conexiones de red, etc
Hablar del navegador A menudo una persona utiliza el navegador para comprobar la información de la escena o para introducir nueva información en él. Para facilitar esta tarea, una interfaz de navegador de genéricos se define, que todos los idiomas son necesarios para aplicar, si así lo desean disponer de una interfaz compatible con VRML. En el próximo capítulo, donde cubren la interfaz externa, de la misma interfaz se ejecuta también. La mayoría de la interfaz es sencillo y se puede leer sobre él en el VRML especificaciones Conceptos-en virtud de la sección Automatización. Voy a explicar sólo algunas de las cosas más difíciles en las próximas secciones. Creación dinámica de VRML Uno de los usos más comunes de la interfaz del navegador es crear nuevas piezas de la escena VRML. Hay dos maneras de hacerlo: Puede cargar en un archivo externo o crear nuevos objetos completamente dentro de la secuencia de comandos.
6 VRML 2.0 con Java CAPÍTULO 4
VRML para crear objetos desde un archivo externo, debe utilizar el createVrmlFromURL llamada. Además de tomar una URL como argumento, esta función también tiene que contener los parámetros de un nodo y un nombre de campo (como una cadena) que debe ser llamada cuando la carga está terminada-una especie de función de llamada. Como usted sabe, no descargar archivos de forma instantánea a través de Internet, de modo que en lugar de bloqueo hasta que el archivo se descarga, el navegador de VRML utiliza el sistema de notificación de devolución de llamada para decirle que cuando se termine con la descarga y la preparación del expediente. El nodo que se pasa como argumento no tiene por qué ser el mismo guión, como la llamada en createVrmlFromURL, pero la mayoría de las veces es. La cadena argumento es el nombre del campo de una MFNode eventIn. Una vez que el VRML ha sido generada, MFNode un caso se genera y se transmite a los designados eventIn. Un truco interesante es que este eventIn no necesita ni siquiera ser otro guión. Se puede pasar directamente a la AddChildren eventIn de un nodo de agrupación. El otro, el método más dinámico de la creación de objetos VRML, manteniéndose en el script de este momento, es generar una cadena y luego pedir el navegador para convertir esa cadena en un objeto que se verá en la escena con el createVrmlFromString llamada. Aunque la presente convocatoria funciona sobre la escena actual, el alcance de los nodos declarados en la cadena se limita a ser el mismo como si se tratase de un archivo "inline". Por ejemplo, usted no puede usar un nodo que ha sido declarado con DEF en el escenario principal. Del mismo modo, si usted desea utilizar un prototipo, entonces usted debe utilizar un completo EXTERNPROTO declaración en la cadena que se pasa a la llamada. Nota: La especificación deja la definición de un archivo cargado incompleta. Un archivo cargado sólo podrá ser de nivel superior archivo en la URL, que no incluyen los archivos de "inline", texturas, sonidos, u otros archivos de "inline".
Para crear un nuevo nodo de una cadena, sólo tiene que construir una cadena que contiene la misma sintaxis que usted deberá escribir en el fichero fuente VRML (menos la cabecera # VRML ...). Puede crear un nuevo cubo con la siguiente línea de código (en el código Java): Nodo = nodo browser.createVrmlFromString ( "Caja {}")[ 0]; La razón para el índice al final de la llamada de método es que creaVrmlFromString devuelve un array de nodos creados. Dado que sólo hemos creado un cuadro de-la-sabemos que el primer elemento contendrá el nodo
7 VRML 2.0 con Java CAPÍTULO 4
que representa la reciente creación del cubo.
Sustitución y añadiendo a la escena actual Una vez que haya creado unos nodos utilizando cualquiera de las llamadas, entonces es necesario agregar a la escena. Si usted tiene un eventOut que está conectada a un nodo de agrupación, entonces usted puede añadir estos nuevos nodos a la escena. Sin embargo, usted puede no querer hacerlo. Por ejemplo, es posible que desee crear una puerta a otro mundo. Al acercarse a la puerta, se activa la secuencia de comandos para iniciar la carga del nuevo mundo. Sin embargo, usted no quiere cargar en el nuevo mundo hasta después de que el usuario ha intensificado a través de la puerta, así que tendrá que sentarse en estos nuevos nodos hasta la hora correcta para cargar. Sustitución del actual mundo con más de VRML Otra opción es sustituir totalmente la escena. ReplaceWorld tiene un MFNode y lo utiliza para reemplazar a todo el mundo con estos nuevos contenidos, incluyendo el script que lo llama. Este es útil para nada? Por supuesto. Usando una combinación de sensores y la secuencia de comandos, con esta convocatoria se puede precargar un mundo y, a continuación, en sustitución de la demanda. Por ejemplo, usted puede hacer su propio nodo de anclaje con un TouchSensor y el guión. El sensor de contacto envía un evento a la secuencia de comandos, que exige uno de los métodos createVrmlFromX y luego un replaceWorld con los resultados de la creación de la palabra.
Cargando Cualquier URL Tal vez desee utilizar el mundo como uno de VRML catálogo en línea, de manera que al hacer clic sobre un objeto se mostrará alguna información en otro marco, o incluso acceder a un modelo más detallado de VRML. LoadURL es
8 VRML 2.0 con Java CAPÍTULO 4
muy útil para esto. A diferencia de los otros y crear o sustituir las llamadas de VRML nodos, éste se hará cargo de cualquier tipo de archivo en la URL. Usted podría utilizar para cargar una página HTML, PDF, o cualquier otra cosa que usted puede transportar más de la petición HTTP normal. El primer argumento es la URL (s) y la segunda es de los parámetros. Lo que puede poner en una lista de parámetros de anclaje, debe ser capaz de poner en esta función de parámetros, tales como un marco como el objetivo. Manejo genérico eventIn Manejar eventIns diferente según el idioma que esté utilizando. Sin embargo, todos los eventIns compartir rasgos comunes. Cada evento tiene una fecha asociada con él. Cada vez que un caso llegue a su script obtendrá dos piezas de información: el valor de este caso y el momento en que se haya producido. Como se verá en la sección de Java, usted no debe esperar el diseño de su código a los eventos que llegan a un cierto orden. Naturalmente, los acontecimientos se llega en la fecha y hora para corregir, pero nada está garantizado con los pedidos de los acontecimientos dentro de un timestamp.
Post-procesamiento de la información Si el código no se basan en tener toda la información a su disposición antes de cualquier tratamiento puede ocurrir, entonces puede utilizar la función eventsProcessed. Esta función está disponible en todos los idiomas y se llama después de todos los eventos han sido procesados para que timestamp. Se llama a lo sumo una vez por hora. Usted puede utilizar la función eventsProcessed (definidos en la clase de secuencias de comandos) para procesar una serie de diferentes insumos y generar una sola salida. Quería decir que para calcular un promedio ponderado de una serie de valores. En el capítulo 2, me explicó que no había manera de obtener información sobre el remitente original del evento a un nodo, especialmente con ventilador en. Una manera de evitar este problema es utilizar eventIns separado y luego procesar la información al final utilizando la función eventsProcessed. Esto significa que sólo tienen un cálculo a la derecha al final de una hora en vez de muchas en respuesta a cada evento próximos pulg El valor resultante se puede transmitir a otros nodos a través de un eventOut.
Secuencias de comandos de JavaScript El primero de los lenguajes de scripting que veremos es JavaScript. Si ya ha aprendido de JavaScript para la página Web funciona, entonces hay muy poco más que usted necesita aprender para VRML scripting.
9 VRML 2.0 con Java CAPÍTULO 4
Puede escribir JavaScript comportamientos, ya sea como línea de código en la URL o como un archivo separado. Línea de código comienza con la URL: javascript: mientras que normalmente los archivos separados con el fin. JS extensión y se basan en el servidor web para devolver el tipo de MIME. application / x-javascript Escritura de comportamientos JavaScript es muy sencillo. Para cada eventIn, se crea una función con el mismo nombre. La función puede tomar hasta dos argumentos: en primer lugar, los datos que se aprobó en el evento y la segunda es la hora para los datos cuando se aprobó. Usted no está obligado a poner en cualquiera de los argumentos. Si usted las usa, sin embargo, que siguen el orden antes mencionado. Por lo tanto, si sólo quería que la fecha y hora para que cuando se produjo el hecho, todavía deberá declarar ambos argumentos. Considere la posibilidad de un conmutador que tiene la entrada de un TouchSensor y cambia el estado de salida cada vez que el sensor está tocado. Nos gustaría escribir el guión de la siguiente manera, como "inline" código: DEF myScript Script { eventIn SFBool isClicked eventOut SFBool output url "javascript: isClicked(val) { if(!isClicked) output = !output; } " }
Lectura de los campos es tan sencillo como usando una variable del mismo nombre (que es sensible a mayúsculas y minúsculas). Escrito a eventOuts es tan fácil simplemente escribir en una variable que es el mismo nombre que el VRML declaración (de nuevo, mayúsculas y minúsculas). En el ejemplo anterior se puede ver lo fácil que es pasar los datos a la salida-eventOut llamado simplemente asignando un valor a la misma. La interfaz del navegador, que se describen en las secciones anteriores, es a través del navegador de objetos. Al igual que el estándar de clase de ventana que permite acceder a la página HTML, el navegador es una clase. Por ejemplo, para crear un cubo para añadir el paisaje, que declaramos lo siguiente fragmento de código: Nota: Vea la diferencia entre esta convocatoria y la anterior versión de Java. Aquí, el navegador de objetos que ya existe, pero para Java es necesario crear una instancia en primer lugar. Consulte la siguiente sección de Java para una mejor explicación
10 VRML 2.0 con Java CAPÍTULO 4
myCube = Browser.createVrmlFromString ( "caja de tamaño 1 1 (1)"); La especificación permite utilizar toda la funcionalidad normal de JavaScript, por ejemplo, la apertura y cierre de ventanas nuevas. Nota: Hay un subconjunto de JavaScript que se conoce como VRMLScript, que sólo utiliza el navegador de base y de la matemáticas de objetos. Algunos navegadores pueden apoyar esta sólo. Si un navegador compatible con JavaScript entonces también manejar VRMLScript.
Secuencias de comandos de Java No debe confundirse con secuencias de comandos de JavaScript, Java scripts es la otra opción para los lenguajes de scripting para su uso con VMRL (en el momento de escribir). Como usted sabe, Java es adecuada para muchas más tareas que JavaScript está. Mediante el uso de Java en lugar de JavaScript, no sólo su comportamiento puede ejecutar con mayor rapidez, pero también tiene la funcionalidad completa de Java, la creación de redes, multiproceso, y la interfaz de usuario de paquetes de herramientas a disposición de you.The mayor diferencia entre escribir comportamientos en Java y JavaScript se eventIn manipulación. El modelo de Java debe ser muy familiar para usted, es casi una copia exacta de la AWT evento. En VRML, hay dos métodos que puede utilizar para eventIns: processEvent y processEvents. La diferencia es que los primeros procesos de un solo evento a la vez, mientras que el segundo se ocupa de múltiples acontecimientos.
Escoger el eventIn Manipulador ¿Por qué necesitamos dos eventos de funciones? Tiene que ver con el modelo de ejecución de VRML que fue cubierto en el Capítulo 2. La razón básica es para que pueda elegir los medios más eficaces para ese mundo. En un mundo muy simple usted puede ser que sólo tienen uno o dos eventIns en sus escrituras. En este caso, tener un sistema para manejar múltiples eventos simultáneos es un despilfarro. Si tiene un gran y complejo sistema de escritura, entonces lo contrario será el caso.
11 VRML 2.0 con Java CAPÍTULO 4
¿Bajo qué circunstancias se obtiene múltiples eventos simultáneos? Este es otro ámbito que la especificación de los escritores han dejado hasta el navegador escritores para decidir. Normalmente, sería de esperar que si hay una colección de eventos de espera para un nodo, el nodo se pasa a todos en un éxito. Hay suficiente en el pliego de clemencia para poner fin a esta suposición. Sólo hay un caso en el que se le garantiza a múltiples acontecimientos a la vez: Cuando haya múltiples rutas entre un par de nodos.
Modelo de Análisis de caso Desde la última liberación de la especificación de VRML 2.0, he ayudado a muchas personas a entender cómo funciona el sistema de eventos. Casi siempre, la confusión se debe a la comprensión de la forma en que, a pesar de todos los acontecimientos pueden ocurrir en una hora, la secuencia de comandos del eventIn métodos pueden ser más de una vez para que timestamp.
Para ilustrar mi punto, considere el ejemplo siguiente: un PositionInterpolator impulsado por un TimeSensor y la conducción de una traducción en uno de transformación. También hay algunos fan-out en el interpolador porque tenemos un guión también de los acontecimientos también. El TimeSensor también envía cycleTime su caso directamente al script. Figura 4.1 muestra gráficamente esta situación.
Figura 4.1 Diferentes caminos para los eventos de un nodo a otro
El TimeSensor incendios fraction_changed un caso en el momento 3, que también pasa a corresponder a la cycleInterval-, por lo tanto, un caso es también cycleTime generado. El script recibe el evento cycleTime durante esta ronda de la ejecución y los procesos de la misma. El interpolador obras el valor de clave que se envíen y se envía el caso value_changed. Esto tiene la misma hora que el eventIn: 3, el mismo tiempo que el original evento se generó. Ahora usted puede ver que el guión ha recibido otro eventIn con el mismo sello de tiempo. Dependiendo de la forma en que el navegador interno ha llevado a
12 VRML 2.0 con Java CAPÍTULO 4
cabo su evento de colas, el script podría terminar con dos eventos en uno o dos eventos generados en diferentes etapas de la ejecución. Ahora si se quita el interpolador de dicho sistema que siempre recibirá los dos eventos al mismo tiempo. La especificación fuerzas escritores del navegador para asegurarse de que tanto los acontecimientos llegar a la escritura, al mismo tiempo, porque esto podría tener algunas repercusiones en la manera en que se ejecutan. (No sé por qué a usted le gusta escribir código, pero que es posible.) Sin embargo, no es posible garantizar múltiples eventos que se recojan junto a la transformación, cuando usted tiene múltiples nodos enviando eventos, como ilustra el ejemplo anterior. Como un ejemplo más, sustituir el interpolador con un script. La salida del guión se basa en una sentencia condicional dentro. Algunas veces se genera la producción, y otras veces no. Como resultado, el guión original ahora es dos veces los acontecimientos y otras veces sólo es una. No hay ninguna manera de un navegador para poder predecir esto, y por lo tanto usted debe hacer las evaluaciones múltiples de la una hora.
VRML diseño de paquetes de Java Ahora que usted entiende los fundamentos, es hora de describir cómo la creación de su guión. Para empezar, tiene que utilizar el derecho de los paquetes. Hay tres paquetes básicos de secuencias de comandos: vrml, vrml.node, y vrml.field. Como el nombre sugiere, estas clases contienen la base, nodo de las definiciones y definiciones de campo, respectivamente. Scripts tienen dos categorías generales de los campos a su disposición. Usted uso constante, los campos de sólo lectura para transmitir información a la secuencia de comandos en forma de un evento. En el script, y también para eventOuts, puede utilizar las versiones más generales, que le permiten hacer lo que desee. Escribir un Java Script Hay una serie de pasos que tendrá que hacer para producir una secuencia de comandos en Java VRML:
13 VRML 2.0 con Java CAPÍTULO 4
En primer lugar, es necesario configurar todas las cosas normales de administración, como CLASSPATHs. Usted es más probable para encontrar el VRML paquetes en C: \ java \ classes \ vrml. A continuación, necesita importar los paquetes apropiados. Los tres paquetes de VRML se necesitarán para casi todos los script. También los otros paquetes (como el establecimiento de redes) que usted necesita. Después de crear su script clase. El nombre de la clase no tiene por qué ser el mismo que el nombre de la DEF VRML Guión nodo. Lo que usted necesita hacer es la subclase de Java Script nodo (todos estos son diferentes guiones que aún confuso?!) Para producir su script personalizado. Llene todo lo que tiene que ir en el método de inicialización. Este suele ser un buen lugar para poner en la inicialización de los distintos campos y eventOuts. Decidir sobre la escritura y el manejo eventIn método. Finalizar fuera llenando cualquier otro método o clases que necesita.
Por supuesto, después de esto tienes que ir por los conductos habituales de compilar y ciclo de prueba. El Java. Archivo de clase puede quedar en el mismo directorio que el código de VRML. A diferencia de la etiqueta en HTML