Professional Documents
Culture Documents
Métodos y narrativas de
Dispositivos de Apoyo
2
Contenido CAPÍTULO 16
• La clase Input6D
• Los métodos nativos
• Definición de los prototipos
• El código de Java para el Nodo de secuencias de comandos
• cuaterniones
• Un archivo de ejemplo
• Problemas de rendimiento y disponibilidad
• Orientación futura
La clase Input6D
3
/ / Valores transformados:
protegidas flotar x, y, z;
protegidas flotar r, u, v;
necesario.
/ / Conjunto de la demanda:
protegidas flotar XScale = 1 septies, yScale = 1 septies, zScale = 1F;
protegidas rScale flotador = 1 septies, uScale = 1 septies, vScale = 1F;
Tenga en cuenta que el setX (), setY (), y otras funciones sólo son pertinentes si
se acumulan las pabellón esté definido. Por ejemplo, si la solicitud se quiere
restablecer las rotaciones a cero, puede utilizar el setR (), Setu (), y setV () los
métodos para hacerlo. Si el dispositivo no está en el modo de acumular
rotaciones, estos métodos tienen poco efecto, porque la próxima vez que lea el
dispositivo de un nuevo conjunto de valores se definirán.
nosotros inmediatamente compensado por el valor del punto central para cada
DOF. Dado que será el punto central de restar los valores de cada muestra, tal
como lo ha leído, estamos seguros de que efectivamente toma la posición de
centrado en el canal es cero, y sus valores mínimo y máximo se ajustará en
consecuencia.
/ / Cambio de centro
rawX -= centerX; rawY -= centerY; rawZ -= centerZ;
rawR -= centerR; rawU -= centerU; rawV -= centerV;
/ / Escala y en condiciones de gama
flotador dx = rawX XScale * / ((rawX <0)?-minX: maxX);
dy = yScale flotar rawY * / ((rawY <0)?-minY: maxY);
flotador dz = zScale * rawZ / ((rawZ <0)?-minZ: maxZ);
dr = rScale flotar rawR * / ((rawR <0)?-minR: maxR);
del flotador = uScale * rawU / ((rawU <0)? minu-: maxU);
dv = vScale flotar rawV * / ((rawV <0)?-minV: maxV);
/ / Acumular
if (accumulateTranslations) (
dx = x + * deltaT / 1000;
y + = dy * deltaT / 1000;
+ z = dz * deltaT / 1000;
)
else (
x = dx;
y = dy;
z = dz;
)
if (accumulateRotations) (
r + = dr * deltaT / 1000;
u + = du * deltaT / 1000;
v + = * deltaT dv / 1000;
)
else (
r = dr;
u = du;
v = dv;
)
10
Nuestra aplicación será diseñado para Windows 95, ya que es, de lejos,
la plataforma más popular. Vamos a estar usando DirectInput, que es
esencialmente un conjunto mejorado de mando de las rutinas en
Windows 95 que admita dispositivos con hasta seis grados de libertad y
múltiples botones. Vamos a guardar nuestro métodos nativos en un
archivo llamado I6DImp.c, que serán compilados y vinculados, como se
muestra más adelante en este capítulo.
# include "Input6D.h"
# include <windows.h>
# include <string.h>
Cuando se llama a este nativo de Java método, que pasa el mango del
objeto Input6D como parámetro. El unhand () macro gira el mango en un
puntero de tipo C, de manera que pueda ser utilizado para acceder a
variables de instancia del objeto. Que macro, y una serie de aspecto
algo extraño tipos de datos, son todos Input6D.h definidas en el archivo
que se genera automáticamente para usted por javah.
El nativePoll () Método
Por último, los botones están en comparación a su valor anterior para ver si
alguno de ellos han cambiado. Si los botones han cambiado, los nuevos valores
se leen, y el pabellón buttonChanged el valor true, que en este caso es 1, ya
están representados por Booleanos C largo tipos de datos en un método nativo.
A primera vista, puede parecer que nos limitamos a nosotros mismos a un solo
tipo de controlador de dispositivo, en este caso DirectInput. Que en realidad no
es el caso.
13
La versión de Windows 95 JDK 1.0.2 está diseñado para trabajar con Microsoft
Visual C + + versión 2.0 o posterior. Las versiones anteriores del compilador de
Microsoft no son compatibles directamente, ni otros tales como compiladores
Watcom. Esto lleva a algunos problemas, pero afortunadamente hay soluciones
para todos ellos.
Primer paso: Compilar el código de Java
javac Input6D.java
javah Input6D
javah-talones Input6D
Siguiente tenemos que compilar el archivo Input6D.c que acaba de crear, así
como el archivo que contiene I6DImp.c nuestros métodos nativos. Usando
Watcom C 10,6 o superior, debería ser sencillo, de empezar por asegurarse de
que el archivo de cabecera de Java son los directorios mencionados en la
variable de entorno INCLUYE:
Luego compilar el código usando la opción "-bd" Watcom opción que indica que
estamos creando un archivo DLL:
wcc386-bd Input6D.c
typedef __int64int64_t;
typedef __int64 uint64_t sin firmar;
Que se convierten en
wcc386-bd I6DImp.c
wlink @ Input6D
16
wlink @ Input6D
Input6D.obj: Input6D.c
wcc386-bd-5-i = f: \ java \ include-i = f: \ java \ include \ win32
Input6D.c
Input6D.h: Input6D.class
javah Input6D
Input6D.c: Input6D.class
javah-talones Input6D
copia + Input6D.c pragma tmp
copia tmp Input6D.c
del tmp
Input6D.class: Input6D.java
javac Input6D.java
javai.lib: \ java \ bin \ javai.dll
wlib javai + \ java \ bin \ javai.dll
limpio:
del *. obj
del *. lib
del *. dll
del *. exe
del Input6D.c
del Input6D.h
del *. clase
del *.$$$$$$
Pragma el archivo sólo contiene las cuatro líneas que tenemos que
añadir a la Input6D.c antes del inicio de la compilación.
La definición de los prototipos
parte, ya que no sabe nada acerca de VRML, la clase es útil para una
variedad de otras aplicaciones, también.
Sin embargo, hay suficiente para los usos Input6D en VRML que tiene
sentido para encapsular la funcionalidad en un prototipo. Nuestro PROTO
hará más fácil para los constructores de todo el mundo simplemente
para utilizar el nodo, sin tener que saber nada acerca de Java.
PROTO Input6DOF [
SFInt32 campo puerto 0
campo SFBool accumulateTranslations FALSE
campo SFBool accumulateRotations FALSE
SFVec3f translationScale campo 1 1 1
campo SFVec3f rotationScale 3,14159 3,14159 3,14159
SFBool campo habilitado TRUE
eventIn SFBool set_enabled
eventIn SFBool set_accumulateTranslations
eventIn SFBool set_accumulateRotations
eventIn SFBool nivel
eventIn SFBool casa
eventIn SFTime pollTime
eventOut SFString descripción
eventOut SFVec3f posición
eventOut SFRotation orientación
eventOut SFInt32 botones
eventOut SFInt32 whichButton
eventOut SFBool button1
eventOut SFBool button2
eventOut SFBool Button3
eventOut SFBool button4
eventOut SFBool button5
eventOut SFBool button6
eventOut SFBool button7
eventOut SFBool button8
]
(
19
Script (
url "Read6DOF.class"
SFInt32 campo puerto es el puerto
campo SFBool accumulateTranslations ES accumulateTranslations
campo SFBool accumulateRotations ES accumulateRotations
campo SFVec3f translationScale ES translationScale
campo SFVec3f rotationScale ES rotationScale
SFBool campo habilitado está habilitado
eventIn SFBool set_enabled ES set_enabled
eventIn SFBool set_accumulateTranslations ES
set_accumulateTranslations
eventIn SFBool set_accumulateRotations ES
set_accumulateRotations
eventIn SFBool nivel es el nivel
eventIn SFBool casa es casa # profunda!
eventIn SFTime pollTime ES pollTime
eventOut SFString descripción descripción
eventOut SFVec3f posición es la posición
eventOut SFRotation orientación orientación
eventOut SFInt32 botones botones ES
eventOut SFInt32 whichButton ES whichButton
eventOut SFBool button1 ES button1
eventOut SFBool button2 ES button2
eventOut SFBool Button3 ES Button3
eventOut SFBool button4 ES button4
eventOut SFBool button5 ES button5
eventOut SFBool button6 ES button6
eventOut SFBool button7 ES button7
eventOut SFBool button8 ES button8
)
)
Hay varios campos que son las mismas que las diversas variables de
instancia de la clase Input6D: puerto, accumluateTranslations, acumular-
Rotaciones, translationScale, y rotationScale. También hay habilitado un
20
Y, por último, hay un eventOut para cada uno de los primeros ocho
botones. Esto permite que los botones específicos para ser enviado a los
21
/ / Establecer la descripción
SFString descripción = (SFString) getEventOut ( "descripción");
description.setValue (device.getDescription ());
Y, por último, hay un eventOut para cada uno de los primeros ocho
botones. Esto permite que los botones específicos para ser enviado a los
distintos nodos. Se pueden utilizar para activar o desactivar las luces, va
comenzar animaciones, y mucho más. Usted puede incluso VÍA
eventOuts botón derecho a la Input6DOF nodo. Por ejemplo, puede VÍA
un botón para el nivel eventIn a fin de que los niveles de apretar el
24
/ / Establecer la descripción
SFString descripción = (SFString) getEventOut ( "descripción");
description.setValue (device.getDescription ());
Cuaterniones
Usted puede recordar que después de leer los tres ángulos de rotación del
dispositivo de entrada, son convertidos a un quaternion y, a continuación, al
eje angular forma:
/ / Quaternion rutinas
que usamos en Read6DOF, tiene los tres ángulos de rotación y las aplica en el
orden de orientación, tono, rollo (es decir, gira alrededor de la x, y, z o ejes). Lo
hace mediante la construcción de cuaterniones y multiplicando cada uno de
ellos juntos. El código se ha estructurado a fin de evitar la multiplicación
cuando no es necesario, que es de nuevo un examen de eficiencia, ya que la
multiplicación de código es bastante complejo e implica un gran número de
múltiplos:
El siguiente archivo VRML te da una idea de los diversos usos de los Input6DOF
nodo. Está destinado a servir como punto de partida para sus proyectos;
descomentar las distintas vías, al final del archivo para ver lo que hacen:
EXTERNPROTO Input6DOF [
SFInt32 campo puerto
SFBool accumulateTranslations campo
SFBool accumulateRotations campo
SFVec3f translationScale campo
SFVec3f rotationScale campo
SFBool campo habilitado
SFBool campo de enclavamiento
eventIn SFBool set_enabled
eventIn SFBool set_accumulateTranslations
eventIn SFBool set_accumulateRotations
eventIn SFBool nivel
eventIn SFBool casa
eventIn SFTime pollTime
eventOut SFString descripción
eventOut SFVec3f posición
eventOut SFRotation orientación
eventOut SFInt32 botones
eventOut SFInt32 whichButton
eventOut SFBool button1
eventOut SFBool button2
eventOut SFBool Button3
eventOut SFBool button4
eventOut SFBool button5
eventOut SFBool button6
eventOut SFBool button7
eventOut SFBool button8
] "Input6DOF.wrl"
DEF NI NavigationInfo ()
DirectionalLight (dirección -1 0 0)
Transformar (DEF TR
niños pequeños
DEF SW Switch (
whichChoice 0
elección [
(Grupo)
32
Forma (
Un aspecto DEF Aspecto (
material Material (diffuseColor 1 0 0)
)
geometría recuadro ()
)
Forma (Un aspecto USO geometría Esfera ())
Forma (Un aspecto USO geometría Cilindro ())
Forma (Un aspecto USO geometría Cono ())
]
)
)
# (DEF SENSOR Input6DOF
# AccumulateRotations TRUE
# RotationScale .314159 .314159 .314159
#)
Hay varias cosas que podríamos hacer para mejorar el rendimiento. Puesto que
está utilizando métodos nativos de todos modos, no se había ningún daño en la
33
El código presentado en este capítulo está diseñado para hacer más fácil para
usted para apoyar DOF 6 dispositivos de entrada en las aplicaciones Java y
mundos VRML.