Capítulo 22
Capítulo 22
Contenido CAPÍTULO 22
En este capítulo vamos a estudiar la manera de USO VRML y Java para crear un
gráfico tridimensional delantera para jugar ajedrez. Aunque la aplicación de un
3
completo programa de ajedrez más allá del alcance de este libro, el código de
este capítulo se puede utilizar fácilmente para proporcionar la interfaz de
usuario para aplicaciones de ajedrez entre los usuarios o entre un usuario y el
ordenador.
Nuestro diseño debe tener dos objetivos básicos: mínimo tamaño de archivo a
fin de garantizar la rápida descarga, y la flexibilidad a fin de que el código
adaptables a auténtico ajedrez aplicaciones. En el curso de la ejecución de este
proyecto, vamos a aprender más acerca de algunas características importantes
de VRML, como instancia, prototipos, el nodo de extrusión, PlaneSensors,
PixelTextures, y el uso de la interfaz externa Autor (EAI).
La solicitud constará de dos partes: una que describe el archivo VRML tablero y
piezas, y un applet de Java para manejar la interacción. Usaremos la
PlaneSensor nodo de VRML para que el jugador agarre de piezas y arrastre en
torno a la placa. Estos movimientos serán procesados por un applet que se
ejecuta en la misma página HTML y se comunica con el mundo VRML a través
del navegador de la Autoría de la interfaz externa.
Nuestro primer paso será crear el VRML de datos de ajedrez para nuestra
aplicación. Se compone de dos partes: la junta directiva y las piezas.
La Junta
Forma (
apariencia apariencia (
4
textura PixelTexture (
imagen 2 2 1 0xFF 0x00 0x00 0xFF
)
)
geometría IndexedFaceSet (
coord Coordinar (
punto [
-0,48 0 -0,48,
-0,48 0 0,48,
0,48 0 0,48,
0,49 0,48 0 -0,48
]
)
texCoord TextureCoordinate (
punto [0 0, 0 4 4 4 4 0]
)
coordIndex [0 1 2 3 -1]
)
)
La junta está diseñada con el origen en el centro, de manera que rota en torno
a examinar el modo en que permite al usuario ver el bordo desde diversos
ángulos. Las coordenadas de las cuatro esquinas de la junta son elegidos para
ser múltiplos de 8, a fin de que el posicionamiento de las piezas más fácil.
La junta se define por los cuatro vértices. Observe que dejamos el pabellón
5
A medida que el diseño de las piezas de nuestra junta, tenemos que mantener
nuestros objetivos de diseño claramente en mente. En particular, queremos
mantener el archivo pequeño.
Además, habrá varias características que todas las piezas de ajedrez compartir.
Por ejemplo, ellos necesitan un nodo de transformación para pasar a su lugar
en la placa, y todos ellos necesitan tener un PlaneSensor que se les otorga
para que el usuario pueda moverse alrededor de ellos, y así sucesivamente.
Usando PROTO
Una técnica que no sólo reduce el tamaño del archivo, sino también hace más
fácil para crear las piezas es utilizar prototipos. Vamos a crear un prototipo de
una pieza de ajedrez genéricos y la creación de instancias de PROTO que para
cada pieza. El PROTO tendrá la pieza de la forma, color y ubicación inicial en el
tablero como parámetros.
6
PROTO pieza [
campo SFNode apariencia NULL
campo SFNode geometría NULL
exposedField SFVec3f initialLocation 0 0 0
eventIn SFVec3f set_location
eventOut SFVec3f location_changed
eventOut SFBool isActive
]
(
Transformar (
rotación 1 0 0 1,5708
traducción es initialLocation
los niños [
DEF transformación (T
Escala 0,03 0,10 0,03
rotación 1 0 0 -1,5708
set_translation ES set_location
translation_changed ES location_changed
Forma niños (
apariencia es la apariencia
geometría es la geometría
)
)
DEF PS isActive PlaneSensor (ES) isActive
]
)
VÍA PS.translation_changed A T.set_translation
)
ubicación de la pieza.
Usted puede preguntarse por qué tenemos dos nodos anidados Transformar a
la posición de la pieza. Sin duda, una es suficiente para colocar la pieza en el
tablero. ¿Y cuáles son las rotaciones para?
Esto explica por qué tenemos dos anidados transforma, pero ¿qué hay de las
dos vueltas? Una vez más, la respuesta reside en la forma en que las obras
PlaneSensor.
El mayor elemento de un típico archivo VRML (sin contar los mapas de texturas
y muestras de sonido, que se almacenan externamente) es la geometría que
está almacenado en un IndexedFaceSet. La próxima formato binario para VRML
abordará este problema mediante el uso de técnicas de compresión
geométrica, pero todavía tiene sentido para reducir nuestra geometría tanto
como sea posible.
A fin de ilustrar cómo funciona esto, veamos el Obispo Blanco. Empezamos por
la definición de una sección circular, compuesto de 16 puntos que yacen en el
plano xz, como se muestra en la Figura 22.3.
Por ejemplo, aquí está la forma en que el obispo de color blanco se crea usando
un nodo de extrusión:
Extrusión (
crossSection [
1 0, 0,92388 -0,382683, 0,707107 -0,70107,
0,38283 -0,92388, 0 -1,
-0,38283 -0,92388, -0,707107 -0,70107,
-0,92388 -0,382683, -1 0,
-0,92388 0,382683, -0,707107 0,70107,
-0,38283 0,92388, 0 1,
0,38283 0,92388, 0,707107 0,70107,
0,92388 0,382683, 1 0
]
columna [
9
Las otras piezas de ajedrez son muy similares a este, a excepción de los
caballeros. Su columna vertebral no es una línea recta, sino que alrededor de
las curvas en una especie de cuestión, que forma.
Usted también notará que todas las piezas se les asignan nombres como
WhiteKnight1 y WhitePawn2. Estos nombres no tienen nada que ver con
instancias, sino que son utilizados para proporcionar una manera para que el
applet para identificar y tener acceso a las piezas. Esto se aclarará más
adelante en este capítulo cuando se inicie la aplicación de nuestro applet de
Java.
Diversos nodos
Punto de vista (
posición 0 1 1
orientación 1 0 0 -0,7854
descripción "Blanco el punto de vista"
)
12
Punto de vista (
posición 0 1 -1
orientación 0 0,9238 0,3827 3,14159
descripción "Negro el punto de vista"
)
Punto de vista (
posición 0 1,5 0
orientación 1 0 0 -1,5708
descripción "vista aérea"
)
El acabado bordo, con todas las piezas en él, se muestra en la Figura 22.5.
Todo el tablero y las 32 piezas son algo más de 10K sin comprimir. Con la
compresión, el tamaño del archivo podría bajar a apenas 3K, que se descarga
en poco más de 1 segundo sobre un simple módem de 28.8 kbps-.
El Applet
El applet se inicia el camino la mayoría de los applets de hacer, con una serie
de declaraciones de importación. Entre ellos se encuentran
vrml.external.Browser, vrml.external.Node, vrml.external.field .*, y
vrml.external.exception .*. Estas declaraciones proporcionan acceso a las
clases de la interfaz externa de autoría. Ellos son generalmente instaladas en
java / clases cuando un navegador que soporte el EAI (como Cosmo Player o
Worldview) está instalado:
/ / La aplicación de Ajedrez
MyThread hilo;
Navegador navegador / / el navegador de VRML
Pieza piezas [] = (
nueva pieza ( "BlackRook1"), las nuevas piezas ( "BlackKnight1"),
14
Este método destaca una interesante y, a menudo pasado por alto los aspectos
de la autoría de interfaz externa, que ha sido una fuente de confusión para los
desarrolladores: El navegador manejar (que en este caso es devuelto por el
getBrowser () el método) no es necesariamente válida para toda la ejecución
del applet. Cuando se reinicia el applet, es necesario obtener una vez más una
referencia en el navegador.
La llamada ignora los hechos reales, ya que se preocupa sólo cuando el usuario
le permite ir de la pieza, cuando no cogerla. A continuación, examina el
UserData para esta llamada, que será una referencia a la pieza que está siendo
trasladado. Le dice a la obra para actualizar su propia idea de su ubicación
actual, y luego se recupera.
A continuación, la llamada tiene las coordenadas xey y convierte a las filas (es
decir, fila y columna) que la pieza está encendido. Esto se hace dividiendo por
la coordenadas X y Z por el tamaño de un cuadrado y añadiendo un offset.
Recuerde que el origen (0 0 0) se encuentra en el cruce de las cuatro plazas en
el centro del tablero.
Por último, la llamada imprime el ajedrez paso a la salida estándar para que el
usuario pueda ver. Ellos necesitan tener la consola de Java visibles para poder
ver esta información.
Pedazo de clase (
String name;
Nodo nodo;
flotado [] = new initialLocation flotar [3];
flotado [] = new currentLocation flotar [3];
Hay una getName () para permitir que el nombre de la pieza a ser recuperado,
y un getLocation () para devolver la ubicación de la pieza en el tablero.
flotado [] getLocation () (
flotado [] = new loc flotar [2];
loc [0] = initialLocation [0] + currentLocation [0];
loc [1] = initialLocation [2] + currentLocation [1];
loc retorno;
)
Una vez que haya una referencia al nodo, el método es la initialLocation y pide
updateLocation () para obtener un valor inicial para la currentLocation.
Ahora que nuestro applet es terminado, el paso final es combinar con el tablero
y las piezas. Hacemos esto por poner juntos en la misma página HTML:
<html>
<head>
<title> Ajedrez </ title>
</ head>
</ html>
El mundo y VRML applet que aquí se presentan son sólo un punto, por
supuesto. El siguiente paso sería añadir una pieza a la PositionInterpolator
PROTO para permitir que las piezas a ser trasladada bajo el control de la
aplicación. El applet que llenar en la primera y última entradas en el campo
keyValue de la interpolador, startTime y el valor de un TimeSensor que sería
dirigida a impulsar el interpolador. El interpolador value_changed del campo se
encaminan hacia el set_translation ámbito de la transformación interna de la
PROTO.
En ese momento, hay varias formas en que el código podría ser utilizado. Por
ejemplo, un completo juego de ajedrez se podrían aplicar en Java y se utilizan
para jugar contra el usuario. Como alternativa, un programa de ajedrez escrito
en C (como gnuchess) podría aplicarse como un conjunto de métodos nativos
que el applet de Java que llamar.