3.6.4  Objeto Polinomio (Poly)

El Objeto Polinomio (Poly) (y sus versiones "de atajo": cubic, quartic y quadric) de POV-Ray es una de las primitivas más complejas y matemáticas del programa. Uno podría pensar que casi no se utiliza y que está más o menos obsoleta, pero tenemos que recordar que por ejemplo la primitiva torus sólo es un atajo para su equivalente quartic, el cual es simplemente un atajo para el objeto poly equivalente. Los polinomios, de todas formas, raramente son utilizados en las escenas debido al hecho de que son muy difíciles de definir y está lejos de ser trivial el obtener la forma deseada sólo con una ecuación polinómica. Es utilizado mayoritariamente por los usuarios con mayor orientación matemática de POV-Ray.

Este tutorial explica el proceso de construcción de un objeto polinómico en POV-Ray.

Nota: POV-Ray 3.5 incluye el nuevo objeto isosuperficie que hace que el objeto polinómico sea más o menos obsoleto. La isosuperficie es más versátil (podéis especificar cualquier función matemática, no sólo polinómicas), más fácil de utilizar. Podéis escribir la función como es, sin necesidad de poner valores en una matriz gigante. Las isosuperficies habitualmente se dibujan considerablemente más rápido que sus equivalentes polinómicos.

De todas formas, a los más matemáticamente orientados todavía les gustan los polinomios porque las isosuperficies son calculadas por aproximación al valor correcto, mientras que el polinomio es calculado de una forma matemáticamente exacta. Habitualmente las isosuperficies son suficientemente buenas para la mayoría de las aplicaciones.

Nota: Sólo un polinomio al 7º grado como máximo puede ser representado con el objeto polinomio. Si debe representarse un polinomio de grado más alto u otra función no polinómica, es necesario utilizar el objeto isosuperficie.

3.6.4.1  Creando la función polinómica

El primer paso es crear la función polinómica que va a representarse. Necesitareis algún conocimiento matemático (nivel de escuela superior) para esto.

1) Comencemos con un ejemplo fácil: una esfera.

La función de la esfera es:

función de la esfera
Función de la esfera

Ahora tenemos que convertir esto en una forma polinómica:

esfera polinómica
Esfera polinómica

Necesitaremos un polinomio de 2º grado para representarlo.

2) Un ejemplo más elaborado:

Tomemos la función:

función
Función

Convirtiendo esto a su forma polinómica obtenemos:

polinómico
Polinomio

Aunque la potencia más alta es 4, necesitaremos un polinomio de 5º orden para representar esta función, porque no podemos representar y4z con un polinomio de 4º orden).

3) Y como hemos hablado sobre el torus, tomémoslo como ejemplo.

Un torus puede ser representado con la función:

función torus
Función torus

donde r1 es el radio mayor y r2 es el radio menor.

Esto es más difícil de convertir a una forma polinómica, pero finalmente lo conseguimos:

torus polinómico
Torus polinómico

Un polinomio de 4º orden es suficiente para representarlo.

Nota: no todas las funciones pueden ser representadas en una forma polinómica. Sólo las funciones que utilizan adición (y sustracción), multiplicación (y división) y potencias (incluyendo potencias racionales, por ejemplo, la raíz cuadrada) pueden ser representadas. También, la primitiva polinomio sólo soporta polinomios hasta el 7º grado como máximo.

Convertir una función a una forma polinómica puede ser una trabajo muy laborioso para determinadas funciones. Algunos programas matemáticos son de mucha ayuda en esta materia.

3.6.4.2  Escribiendo la matriz polinómica

Ahora que tenemos la función en una forma polinómica, tenemos que escribirla en la sintaxis de POV-Ray. La sintaxis se especifica en los capítulos "Poly, Cubic y Quartic" y "Quadric" de la sección del Lenguaje Descriptivo de la Escena (SDL). También hay una tabla en este capítulo que se utilizará para hacer la matriz polinómica. Es más fácil si imprimes esta tabla a papel.

Nota: También es posible hacer un pequeño programa con tu lenguaje de programación favorito que imprima la matriz polinomio desde la función polinómica, pero el hacer este programa depende de ti.

1) Empecemos con lo fácil, p.ej. la esfera.

Ya que la esfera puede representarse con un polinomio de 2º grado, miramos a la fila titulada "2nd" en la tabla. Vemos que tiene 10 apartados, .ej., necesitamos una matriz de un tamaño de 10. Cada ítem de la matriz será el factor del término listado en la tabla.

El polinomio será:

esfera polinómica
Esfera polinómica

Escribiendo el polinomio de esta forma, obtenemos:

#declare Radius=1;
poly
{ 2,
  <1,0,0,0,1,
   0,0,1,0,-Radius*Radius>
}

Colocamos cada grupo de factores (separados con líneas en la tabla) en sus correspondientes líneas.

Vemos en la tabla que el primer apartado es el factor para x2, que es 1 en la función. El siguiente ítem es xy. Como no está en la función, su factor es 0. Como el siguiente ítem, que es xz. Y así todos. El último ítem es el apartado escalado, que en este caso es -r2.

Si creamos una escena funcional y la dibujamos, obtenemos:

camera { location y*4-z*5 look_at 0 angle 35 }
light_source { <100,200,-50> 1 }
background { rgb <0,.25,.5> }

#declare Radius=1;
poly
{ 2,
  <1,0,0,0,1,
   0,0,1,0,-Radius*Radius>
  pigment { rgb <1,.7,.3> } finish { specular .5 }
}
esfera polinómica
Esfera polinómica

Nota: hay un atajo para los polinomios de 2º grado: la primitiva quadric. Utilizando la versión de atajo, siempre que sea posible, podemos obtener dibujados más rápidos. Podemos escribir el código de la esfera descrito más arriba de la siguiente manera:

quadric
{ <1,1,1>, <0,0,0>, <0,0,0>, -Radius*Radius
  pigment { rgb <1,.7,.3> } finish { specular .5 }
}

2) Ahora intentemos la segunda. Lo haremos de forma similar, pero esta vez necesitaremos mirar a la fila titulada "5th" en la tabla.

El polinomio será:

polinomio de 5º orden
Polinomio de 5º orden

Escribiendo la primitiva polinomio obtenemos:

poly
{ 5,
  <0,0,0,0,0,
   0,0,0,0,0,
   0,0,0,0,0,
   0,0,0,1,0,
   0,0,0,0,0,
   -2,0,0,0,0,
   0,0,0,0,0,
   0,1,0,0,0,
   0,0,0,0,0,
   0,0,0,0,0,
   0,0,0,0,0,0>
}

Con la escena apropiada obtenemos:

camera { location <8,20,-10>*.7 look_at x*.01 angle 35 }
light_source { <100,200,20> 1 }
background { rgb <0,.25,.5> }

poly
{ 5,
  <0,0,0,0,0,
   0,0,0,0,0,
   0,0,0,0,0,
   0,0,0,1,0,
   0,0,0,0,0,
   -2,0,0,0,0,
   0,0,0,0,0,
   0,1,0,0,0,
   0,0,0,0,0,
   0,0,0,0,0,
   0,0,0,0,0,0>
  clipped_by { box { <-4,-4,-1><4,4,1> } }
  bounded_by { clipped_by }
  pigment { rgb <1,.7,.3> } finish { specular .5 }
  rotate <0,90,-90>
}
ejemplo de polinomio de 5º orden
Ejemplo de polinomio de 5º orden

3) Y finalmente el torus:

El polinomio era:

torus polinómico
torus polinómico

Y obtenemos la primitiva correcta de 4º grado:

camera { location y*4-z*5 look_at 0 angle 35 }
light_source { <100,200,-50> 1 }
background { rgb <0,.25,.5> }

#declare r1=1;
#declare r2=.5;
poly
{ 4,
  <1,0,0,0,2,
   0,0,2,0,-2*(r1*r1+r2*r2),
   0,0,0,0,0,
   0,0,0,0,0,
   1,0,0,2,0,
   2*(r1*r1-r2*r2),0,0,0,0,
   1,0,-2*(r1*r1+r2*r2),0,pow(r1,4)+pow(r2,4)-2*r1*r1*r2*r2>
  pigment { rgb <1,.7,.3> } finish { specular .5 }
}

Cuando lo dibujamos, tenemos:

torus polinómico
Torus polinómico

Hay un atajo para los polinomios de 4º orden: la primitiva quartic. Podemos escribir el torus así:

quartic
{ <1,0,0,0,2,
   0,0,2,0,-2*(r1*r1+r2*r2),
   0,0,0,0,0,
   0,0,0,0,0,
   1,0,0,2,0,
   2*(r1*r1-r2*r2),0,0,0,0,
   1,0,-2*(r1*r1+r2*r2),0,pow(r1,4)+pow(r2,4)-2*r1*r1*r2*r2>
  pigment { rgb <1,.7,.3> } finish { specular .5 }
}