6.1.9  Identificadores Spline

Las curvas Spline te proporcionan la posibilidad de definir 'trayectorias' en tus escenas. Simplemente especificas una serie de puntos que POV-Ray interpola para crear una curva que los conecta. Cada punto a lo largo de la curva spline posee un valor numérico. El mejor ejemplo de curva spline es la trayectoria de un objeto en movimiento: la curva en sí sería la trayectoria trazada por el objeto, y el parámetro numérico sería el tiempo; tal como avanza el tiempo, el objeto avanza a lo largo de la curva.
En consecuencia, para una referencia temporal dada, puedes usar la curva spline para encontrar la posición del objeto. De hecho, las curvas spline son muy adecuadas para la animación.

La sintaxis es la siguiente:

DECLARACION_DE_SPLINE:
  #declare IDENTIFICADOR =
    spline {
      [IDENTIFICADOR_DE_SPLINE] |
      [TIPO_DE_SPLINE] |
      [Valor_1, <Punto_1>[,]
       Valor_2, <Punto_2>[,]
       ...
       Valor_n, <Punto_n>]
    }

TIPO_DE_SPLINE:
  linear_spline | quadratic_spline | cubic_spline | natural_spline

USO_DEL_SPLINE:
  MySpline(Val) | MySpline(Val, SPLINE_TYPE)

El primer ítem especifica el tipo de interpolación (lineal, cuadrática, cúbica o natural)
En el tipo lineal (linear_spline), los puntos se conectan con líneas rectas.
En el tipo cuadrático (quadratic_spline), los puntos se conectan con una curva suave definida por un polinomio de segundo orden.
En el tipo cúbico (cubic_spline y natural_spline), los puntos se conectan mediante una curva suave definida por un polinomio de tercer orden.
El tipo de interpolacion por defecto es el lineal (linear_spline).

Despues del tipo de interpolacion, viene una serie de valores de coma flotante, cada uno de ellos seguido por un vector de posición, y separados por comas. Valor_1, Valor_2, etc, son los valores del parámetro de la curva spline en cada punto específico. Los puntos no tienen que estar necesariamente ordenados por el valor del parámetro. Si dos puntos tienen el mismo valor de parámetro, el segundo punto reemplazará al primero. Más allá del rango máximo y mínimo de los valores de parámetro, la posición de la spline se fija automáticamente al valor de los extremos.

Nota: Debido a que las splines cúbicas se definen usando los puntos primero y último como tangentes, más que como puntos de la spline, la interpolación sólo es válida entre los puntos segundo y penúltimo. En el resto de los tipos de interpolacion, ésta es válida desde el primero hasta el último punto. Para valores de parámetro fuera del rango válido, POV-Ray devuelve el valor del punto más cercano.

Para usar una curva spline, puedes colocar el identificador de la spline (seguido de un parámetro entre paréntesis), en cualquier sitio donde normalmente pondrías un vector, de manera similar a cuando se usa una macro. Las curvas spline se comportan básicamente como vectores tridimensionales.
Aquí tienes un ejemplo:

camera { location <0,2,-2> look_at 0 }
light_source { <-5,30,-10> 1 }
#declare MiSpline =
  spline {
    cubic_spline
    -.25, <0,0,-1>
    0.00, <1,0,0>
    0.25, <0,0,1>
    0.50, <-1,0,0>
    0.75, <0,0,-1>
    1.00, <1,0,0>
    1.25, <0,0,1>
  }

#declare ctr = 0;
#while (ctr < 1)
  sphere {
    MiSpline(ctr),.25
    pigment { rgb <1-ctr,ctr,0> }
  }
  #declare ctr = ctr + 0.01;
#end

También puedes hacer que POV-Ray evalúe una curva spline como si fuera un tipo diferente de spline, especificando el tipo de interpolación después del valor del punto a interpolar:

sphere{ <2,0,2>, .25 pigment{rgb MiSpline(clock, linear_spline)}}

Las curvas spline son 'inteligentes' cuando se trata de devolver vectores. El vector con más componentes de la spline es el que determina el tamaño del vector devuelto. Ello permite devolver vectores con un tamaño de 2 a 5 componentes.

Además, las funciones de splines toman el tamaño del vector en consideración. Esto es, una función que contenga, por ejemplo, una spline de 5 componentes devolverá también un vector de cinco componentes (o sea, un color).

6.1.9.1  Las Splines y las Macros

Puedes pasar funciones como parámetros a las macros, y la manera de hacerlo se explica mejor con un ejemplo:

  #macro Foo( Bar, Val )
    #declare Y = Bar(Val).y;
  #end

  #declare myspline = spline { 
      1, <4,5> 
      3, <5,5> 
      5, <6,5>
  }

  Foo(myspline, 2)

  #debug str(Y,5,5)
  #debug "\n"