Let's Twist Again...

Billboards

Sólo un par de cosas más antes de meternos con las cosas buenas de la animación, y la primera es el nodo Billboard. Realmente es un nodo Transform que rota automáticamente para estar de cara al usuario. No es necesario decir lo útil que resulta para carteles de texto, sprites, y un montón más de cosas. Echemos un ojo al nodo mismo para ver qué tenemos para jugar.

Billboard {
   eventIn        MFNode      addChildren
   eventIn        MFNode      removeChildren
   exposedField   SFVec3f     axisOfRotation    0 1 0
   exposedField   MFNode      children          []
   field          SFVec3f     bboxCenter        0 0 0
   field          SFVec3f     bboxSize          -1 -1 -1
}

Como todos los nodos de agrupación, posee los eventos addChildren, removeChildren, bboxCenter y bboxSize, todos los cuales cubriremos más adelante. Tiene además un campo children, que contiene los objetos que quieres en tu billboard. De modo que si quieres un cubo que muestre siempre la misma cara al ususario, colócalo en este campo. Esto nos deja sólo el campo axisOfRotation. Este es el eje sobre el que va a rotar el nodo. El valor por defecto es 0 1 0, que es el eje Y. Esto es lo que normalmente querrías para que el usuario pueda ver el billboard. Pero si tienes un objeto con un ángulo dado, o lo que sea, puedes querer un ángulo diferente. El caso especial para el billboard es el 0 0 0. Normalmente, este no es un eje válido, pero en este caso le dice al nodo que puede rotar sobre CUALQUIER eje. Normalmente, cuando el nodo gira alrededor de un ángulo, si te apartas de él dejarás de verlo claramente. Si tienes un eje de 0 0 0, apuntará al usuario, no importa donde esté.

Bueno, eso fue todo para el nodo Billboard, muy cortito, pero nos ha dado algo divertido con lo que jugar. Echa un ojo a este ejemplo y su código para una demostración. Todos los árboles son Billboard que giran respecto a su eje Y, de modo que simpre mirarán al usuario.

Más Transforms

Hemos cubierto el nodo Transform hace años y años, pero hay más cosas que podemos hacer con él. La última vez, cubrimos rotaciones, traslaciones y escalas. El nodo Transform al completo es más complejo que todo eso. La definición completa se muestra aquí:

Transform {
   eventIn        MFNode      addChildren
   eventIn        MFNode      removeChildren
   exposedField   SFVec3f     center            0 0 0
   exposedField   MFNode      children          []
   exposedField   SFRotation  rotation          0 0 1 0
   exposedField   SFVec3f     scale             1 1 1
   exposedField   SFRotation  scaleOrientation  0 0 1 0
   exposedField   SFVec3f     translation       0 0 0 
   field          SFVec3f     bboxCenter        0 0 0
   field          SFVec3f     bboxSize          -1 -1 -1
}

Como puedes ver este nodo de agrupamiento tiene además los eventos addChildren, removeChildren, bboxCenter y bboxSize. los cubriremos posteriormente con los capítulos de optimización y scripting. De momento los dejaremos aparte para concentrarnos en los otros campos. Ya hemos visto rotation, scale, translation y children Hay un par de ellos más que controlan cómo se aplican las rotaciones y las escalas. Los campos center y scaleOrientation transforman el sistema de coordenadas local del nodo mientras las otras transformaciones se aplican.

El campo center afecta a las transformaciones de rotación y escala. Define el origen local de la transformación. Así que si defines un centro de 5 0 0, las rotaciones y escalas serán relativas a este punto. El objeto rotará alrededor de ese punto, lo que es equivalente a trasladar el objeto por el inverso de ese centro, rotarlo, y volver a trasladarlo de vuelta. Esto afecta también a escalas, de modo que si escals algo, pero mueves el origen de las escala, afectará todas las coordenadas del objeto relativas al center en vez de al origen local del objeto.

el campo scaleOrientation tiene también efecto en la escala, sólo que esta vez es una rotación lo que se aplica en vez de una traslación. Esto te permitirá escalar en las direcciones que mejor te parezca. Con scale, sólo puedes escalar sobre los ejes, lo cual es algo limitado. Usando scaleOrientation puedes rotar las sirecciones de escala para un objeto. Tiene el mismo efecto que aplicar la rotación inversa, escalar, y rotar el objeto de vuelta. Esencialmente, rota los ejes de la escala con el campo scaleOrientation.

Echa un ojo a este ejemplo y a su código. En la izquierda, tenemos una rotación sobre un punto arbitrario. El punto rojo marca el centro, sobre el cual ha sido rotada la caja verde. Las cajas púrpuras han sido escaladas. El centro es una caja normal, sin escalar. La caja de abajo ha sido escalada con un valor de 2 en la dirección X. La de arriba también, pero con un scaleOrientation de 0 0 1 0.78. Esto la hace rotar sobre el eje X 45 grados en el sentido contrario a las agujas del reloj, dándole una extraña apariencia.

Hacer el Índio

Esto fue todo para las cosas que se mantienen quietecitas. Ahora, en la tercera parte, echaremos un ojo a la animación y a material por el estilo. ¡Sujétate!