|
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).
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"
|