Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Crear un Avatar
Contenido CAPÍTULO 20
• El cuerpo humano
2
El cuerpo humano
grados de libertad.
Vamos a simplificar aún más nuestra tarea por tratar el cuerpo humano como
una simple transformación de la jerarquía, con un nodo de transformación para
cada conjunto. Por ejemplo, el hombro izquierdo, sería un nodo de
transformación, el otro codo izquierdo, y así sucesivamente. Animación de
nuestro avatar, por lo tanto, consisten en modificar los valores de la rotación
de los campos de transformación de los nodos, generalmente mediante el uso
de un nodo OrientationInterpolator.
particular, vamos a dejar de lado los detalles de los pies, los dedos de las
manos, y algunas de las articulaciones del hombro, como la clavícula. Figura
20-1 muestra un diagrama sencillo de nuestro humanoide.
Una vez que hemos construido nuestra transformación jerarquía, hay que
adjuntar a los nodos de forma que a fin de dar a algunos segmentos del cuerpo
representación visible. En lugar de crear un complejo de superficie poligonal
para nuestros humanoide, lo que exigiría que usamos algún tipo de modelado
5
PROTO Segmento [
campo SFVec3f loc 0 0 0
campo SFFloat longitud 0,1
SFVec3f campo desplazamiento 0 0,05 0
campo SFRotation pudrición 0 0 1 0
]
{
Transformar {
traducción se loc
los niños [
Forma {
geometría Esfera 0,05) (radio
apariencia apariencia {
material Material {
diffuseColor 1 0 0
}
}
}
Transformar {
La rotación es la putrefacción
traducción es el desplazamiento
los niños [
Forma {
geometría cilindro (
radio de 0.025
la altura es la longitud
)
6
apariencia apariencia (
material Material (
diffuseColor 0 1 0
)
)
)
]
)
]
)
)
Este PROTO será muy útil cuando tenemos en torno a la creación de los
distintos segmentos corporales. También ayudará a reducir nuestro tamaño de
archivo, ya que no tendrá que repetir la Esfera, Cilindro, de transformación, y
los nodos aspecto una y otra vez.
Uso de la PROTO
Sin embargo, vale la pena echar un vistazo en una pequeña sección del archivo
para ver cómo es creado y cómo nuestro segmento PROTO se utiliza:
los niños [
Segmento (# parte superior del brazo izquierdo
loc 0,4 1,4 0
longitud 0,3
desplazamiento 0 -0,15 0
)
DEF l_elbow transformación (
centro 0,4 1,1 0
los niños [
Segmento (# antebrazo izquierdo
loc 0,4 1,1 0
longitud 0,3
desplazamiento 0 -0,15 0
)
DEF l_wrist transformación (
centro 0,4 0,8 0
los niños [
Segmento (# izquierda
loc 0,4 0,8 0
Longitud 0,15
desplazamiento 0 -0,075 0
)
]
)
]
)
]
)
Desde la Transforms está anidada, los cambios se propagan a una a las otras.
Rotación de la l_elbow conjunto se desplazará no sólo el antebrazo, pero el
conjunto de la muñeca y la mano también. Rotación de la l_shoulder conjunta
se moverá la parte superior del brazo, codo, antebrazo, muñeca y mano.
Los cuatro valores son keyValue especificado como rotaciones alrededor del eje
x. Una rotación de 45 grados es de aproximadamente 0,7854 radianes.
Este archivo se expresa la animación en VRML, pero no puede ser utilizado por
sí mismo, dado que tiene una ruta a una parte específica del cuerpo. Para
hacer uso de esta animación, simplemente añadir a la humanoide archivo, de
la siguiente manera:
en DOS, o
Esta es la razón por la que necesitábamos para elegir los nombres DEF muy
específicos para cada conjunto, tenemos que ser capaces de añadir rutas a
ellos. Si creamos otro humanoide con la misma estructura común, seremos
capaces de usar la misma animación que se muestra arriba a la cabeza guiño,
simplemente porque se utilizó el mismo conjunto de nombres. Podríamos
empezar a construir las bibliotecas independientes de humanoides y
animaciones de fotogramas clave, lo que podría ser mezclado y combinado a
voluntad. Esto nos da una tremenda flexibilidad, ya que cada nueva animación
puede ser utilizado de inmediato por todos los humanoides, y cada nuevo
humanoide puede utilizar inmediatamente todas las animaciones.
Tenga en cuenta que no todas las animaciones pueden ser utilizados sin
problemas en todos los humanoides. En algunos casos (como agacharse o
profunda rodilla se dobla), es necesario conocer la duración de los diversos
sectores a fin de evitar el aumento de los pies hasta el suelo o hundimiento por
debajo de él. Más adelante en este capítulo vamos a discutir cómo hacer frente
a este requisito.
Generación de la Interpolators
Aunque simples animaciones pueden ser creadas por la mano, las cosas se
vuelven muy complejas muy rápidamente cuando se está tratando de
11
El lenguaje nos creación es muy simple. Está orientado a la línea, y cada línea
comenzará con una directiva de algún tipo. Líneas en blanco y las líneas que
comienzan con # se ignoran.
anim nombre
conjunta jointname
No todos los conjuntos en el cuerpo debe tener una directiva común, pero debe
haber una directiva conjunta para cada conjunto que se utiliza en la animación.
El orden de los conjuntos de directivas es importante, desde el primer llamado
conjunto común será el número 0, la segunda será conjunta número 1, y el
tercero será conjunta número 2, y así sucesivamente.
produce en:
marco fracción
La fracción debe estar en el rango de 0.0 a 1.0, y cada cuadro debe tener una
mayor fracción de valor que los marcos que lo preceden.
jointNumber x y z una
5 0 1 0 0,7854
# Arm-agitando animación
animales de prueba
bucle
# Articulaciones
conjunta l_elbow
conjunta l_shoulder
# Marcos
cuadro 0.0
00010
10010
marco de 0,50
0 0 0 1 1,5708
1 0 0 1 1,5708
13
marco de 1,00
00010
10010
Nuestro generador de animación, que nos llame ANIMGEN, será muy simple.
Tendremos una clase para representar un conjunto, una clase para representar
un marco, una clase para representar los valores, y una subclase de la clase a
la que representan los valores de rotación. Esta estructura nos permitirá añadir
más tipos de datos, como los colores y las traducciones y otras cosas, más
adelante.
Las Clases
Conjunto de clases será el más simple. Por ahora, simplemente sigue la pista
del nombre del conjunto:
(Conjunto de clase
String name;
public String getName () (return nombre;)
público mixto (String nam) (name = nam;)
public String toString () (return nombre;)
)
Puede preguntarse por qué necesitamos una clase separada sólo para este.
Bueno, nosotros no la-por ahora. Pero algún día nos lo desea, puede añadir
más información para cada conjunto, momento en el que estaremos
encantados que resumieron las articulaciones en una clase por sí mismos.
clase Marco (
tiempo de flotación;
Valor [] valores;
Marco público (String inputLine, int nvalues) (
tiempo = Float.valueOf (inputLine). floatValue ();
valores = new Valor [nvalues];
)
flotador público getTime () (return tiempo;)
Valor público getValue (int n) (return valores [n];)
public void SetValue (int n, valor val) (valores [n] = val;)
)
El valor de clase es sólo una superclase para sus distintas subclases. La única
subclase en este momento es RotationValue:
Valor clase (
)
La línea principal de nuestra aplicación es que una gran parte del trabajo está
hecho. Vamos a mantener una cadena alrededor del nombre de la animación,
que obtiene el conjunto de animales directiva. También se mantendrá en torno
a un booleano que indique si el bucle de animación o no, que recibe el conjunto
de la directiva de bucle.
importación java.io. *;
importación java.util .*;
loop = true;
else if (line.startsWith ( "conjunto"))
joints.addElement (
Conjunto de nuevo (line.substring (6)));
else if (line.startsWith ( "marco"))
frames.addElement (
currframe = new Frame (
line.substring (6), joints.size ()));
else (
StringTokenizer tokens =
StringTokenizer nuevo (línea);
int jointNumber =
Integer.parseInt (tokens.nextToken ());
currframe.setValue (
jointNumber, nuevos RotationValue (fichas));
)
)
)
catch (IOException e) (System.err.println (e);)
vrmldump (animname, bucle, juntas, marcos);
)
Recuerde que el analizador de longitud cero ignora las líneas de entrada y las
líneas que comienzan con #.
Las líneas que contengan los valores de cada uno de las articulaciones son
analizados usando un StringTokenizer. La primera muestra se toma como el
número de conjuntos, y la tokenizer que contiene el resto de las fichas es
pasado al constructor RotationValue.
System.out.println ( "]");
System.out.println ("}");
System.out.println ( "RUTA" + animname
+ "TS.fraction_changed A rotInter.set_fraction");
System.out.println ( "RUTA rotInter.value_changed A"
J.getName + () + ". Set_rotation");
System.out.println ();
)
)
Para cada conjunto, vamos por todos los fotogramas clave y emiten con un
valor del tiempo y un marco keyvalue correspondiente al valor que para los
conjuntos de serie. En los dos fotogramas clave y la llave de salida, estamos
cuidado para saltar las entradas que son nulas, ya que las correspondientes
juntas no tienen explícita los valores clave para marcos.
Para cada conjunto, también emiten un par de VÍA declaraciones, a fin de tener
la TimeSensor del fraction_changed producción y adjuntarlo a la set_fraction
interpolador de entrada, y un interpolador para tomar la salida de la
fraction_changed y adjuntarlo a la unión del set_rotation entrada.
Correr la aplicación ANIMGEN
keyValue [0 0 1 0 0 0 1 1.5708 0 0 1 0]
)
VÍA testTS.fraction_changed A rotInter.set_fraction
VÍA rotInter.value_changed A l_shoulder.set_rotation
complejas.
Articulaciones
PROTO Articulaciones [
exposedField MFString nombres []
exposedField MFNode articulaciones []
]
(
(Grupo)
)
nuestro humanoide.
Las expresiones faciales