3.12.1  La Variable Clock: La clave de todo

POV-Ray se apoya automáticamente en una variable en coma flotante identificada como clock (todo en letra minúscula). Esta es la llave que permite automatizar la construcción de los archivos de imágenes. En la línea de comandos, la variable clock se pone usando el símbolo +k. Por ejemplo, +k3.4 de la línea de comandos fijaría el valor de clock en 3.4. Lo mismo se podría lograr desde el fichero INI usando Clock=3.4 dentro del archivo INI.

Si no fijamos ningún valor de clock, y el bucle de la animación no se usa (como será descrito un poco más tarde), la variable clock está aún ahí - el valor por defecto de clock es 0.0, así es posible establecer algún código a POV con la intención de animarlo,  y trazar la imagen tal cual generamos en alguna etapa de nuestro proyecto una imagen de un objeto o mundo.

Un ejemplo simple del uso de esta ventaja lo podríamos tener en un objeto que se mueve a velocidad constante, digamos, a lo largo del eje X. Colocaríamos la siguiente expresión

  translate <clock, 0, 0>
en la declaración de nuestro objeto, y entonces tenemos el bucle de la animación asignando progresivamente valores más altos a clock. Esto está bien, siempre y cuando un solo elemento o característica de nuestra escena esté cambiando, pero ¿qué ocurriría cuando deseemos controlar múltiples cambios en alguna escena simultáneamente?

El secreto es usar valores normalizados de clock, y crear otras variables proporcionales a clock en la escena. Esto es, cuando nosotros establecemos nuestro clock (lo estamos consiguiendo, paciencia) lo tenemos variando de 0.0 a 1.0, y lo usaremos como un multiplicador para otros valores. De esta forma, los otros valores pueden ser cualquiera que nosotros necesitemos, y el clock podría ser el mismo valor de 0 a 1 para cada aplicación. Veámoslo con un ejemplo simple (relativamente):

  #include "colors.inc"
  camera {
    location <0, 3, -6>
    look_at <0, 0, 0>
  }
  light_source { <20, 20, -20> color White }
  plane {
    y, 0
    pigment { checker color White color Black }
  }
  sphere {
    <0, 0, 0> , 1
    pigment {
      gradient x
      color_map {
        [0.0 Blue  ]
        [0.5 Blue  ]
        [0.5 White ]
        [1.0 White ]
      }
      scale .25
    }
    rotate <0, 0, -clock*360>
    translate <-pi, 1, 0>
    translate <2*pi*clock, 0, 0>
  }

Dado que la secuencia de imágenes está funcionando con el clock aumentando progresivamente de 0.0 a 1.0,  el código de antes generará una bola rayada la cual rotará desde la izquierda a la derecha atravesando la pantalla. Tenemos dos objetivos aquí:

1. Trasladar la bola del punto A al punto B, y,

2. Rotar la bola  en la justa medida para que su movimiento lineal sugiera que está rodando -no deslizándose - hacia su posición final.

Tomando el segundo objetivo en primer lugar, comenzaremos con la esfera en el origen, puesto que en cualquier otro lugar la rotación causaría que orbitase alrededor del origen en vez de rotar. A lo largo de la animación la bola girará 360 grados completos. Por consiguiente, usaremos la fórmula 360*clock para determinar la rotación en cada fotograma. Dado que el clock varía de 0 a 1, la rotación de la esfera variará de 0 hasta 360 grados.

Usamos la primera translación para poner la esfera en su punto de inicio. Recuerda que  no podíamos colocar la bola aquí ya que entonces la tendríamos orbitando alrededor del origen, así que antes de afrontar nuestro otro objetivo (la traslación), tendremos que compensar colocando la esfera donde tendría que haber estado al principio. Después de eso, retrasladaremos la esfera con el clock relativo a la distancia, originando el desplazamiento relativo al punto de inicio. Hemos elegido la fórmula de  2*pi* r*clock (el ancho de la circunferencia de la esfera mide el tiempo del actual valor del clock) así parecerá moverse una distancia igual a la circunferencia de la esfera al mismo tiempo que rota 360 grados completos. De esta manera tenemos sincronizada la rotación de la esfera a su traslación, consiguiendo que parezca que ruede suavemente a lo largo del plano.

Además, se nos permite coordinar múltiples aspectos de cambios más limpiamente en el tiempo, matemáticamente hablando, la otra buena razón para usar valores normalizados de clock es que no importará si nosotros estamos haciendo diez imágenes de un GIF animado o trescientas imágenes de un AVI. Los valores del clock son proporcionales al número de imágenes, así el mismo código POV trabajará sin tener en cuenta cuánto dura la secuencia de imágenes. Nuestra pelota rodante se desplazará la misma distancia sin importar cuántas imágenes tenga nuestra animación final.