|
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.
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:
Ahora tenemos que convertir esto en una forma polinómica:
Necesitaremos un polinomio de 2º grado para representarlo.
2) Un ejemplo más elaborado:
Tomemos la función:
Convirtiendo esto a su forma polinómica obtenemos:
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:
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:
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.
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á:
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 } }
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á:
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> }
3) Y finalmente el torus:
El polinomio era:
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:
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 } }
|