6.7.12  Modificadores de patrones

Los modificadores de patrones son sentencias o parámetros que modifican la manera en que se evalúa un patrón, o indican qué hacer con un patrón. La sintaxis completa es la siguiente:

MODIFICADOR_DE_PATRÓN:
    MODIFICADOR_DE_MAPA | MODIFCADOR_DE_AGATE | MODIFICADOR_FICHERO_DE_DENSIDAD |
    MODIFICADOR_DE_QUILTED | MODIFICADOR_DE_BRICK | MODIFICADOR_DE_SLOPE |
    noise_generator NÚMERO | turbulence <CANTIDAD> |
    octaves CONTADOR | omega CANTIDAD | lambda CANTIDAD |
    warp { [ITEMS_DE_WARP...] } | TRANSFORMACION

MODIFICADOR_DE_MAPA:
    frequency CANTIDAD | phase CANTIDAD | ramp_wave | triangle_wave |
    sine_wave | scallop_wave | cubic_wave | poly_wave [EXPONENTE]

MODIFCADOR_DE_AGATE:
    agate_turb VALOR

MODIFICADOR_DE_BRICK:
    brick_size TAMAÑO | mortar TAMAÑO

MODIFICADOR_FICHERO_DE_DENSIDAD:
    interpolate TIPO

MODIFICADOR_DE_SLOPE:
	<ALTITUD> 
	<Lo_slope,Hi_slope>
	<Lo_alt,Hi_alt>

MODIFICADOR_DE_QUILTED:
    control0 VALOR | control1 VALOR

MODIFICADOR_DE_PIGMENTO:
    PATTERN_MODIFIER | COLOR_LIST | PIGMENT_LIST |
    color_map { CUERPO_DEL_MAPA_DE_COLOR } | colour_map { CUERPO_DEL_MAPA_DE_COLOR } |
    pigment_map{ CUERPO_DEL_MAPA_DE_PIGMENTO } | quick_color COLOR |
    quick_colour COLOR

MODIFICADOR_DE_NORMAL:
    MODIFICADOR_DE_PATRÓN | LISTA_DE_NORMALES |
    normal_map { CUERPO_DE_MAPA_DE_NORMAL } | slope_map{ CUERPO_DEL_MAPA_DE_INCLINACION } |
    bump_size CANTIDAD

MODIFICADOR_DE_PATRÓN_DE_TEXTURA:
    MODIFICADOR_DE_PATRÓN | LISTA_DE_TEXTURAS |
    texture_map{ CUERPO_DEL_MAPA_DE_TEXTURA }

MODIFICADOR_DE_DENSIDAD:
    MODIFICADOR_DE_PATRÓN | LISTA_DE_DENSIDADES | LISTA_DE_COLORES |
    color_map { CUERPO_DEL_MAPA_DE_COLOR } | colour_map { CUERPO_DEL_MAPA_DE_COLOR } |
    density_map { CUERPO_DEL_MAPA_DE_DENSIDAD }

Los valores por defecto de los modificadores de patrón son los siguientes:

dist_exp        : 0
falloff         : 2.0
frequency       : 1.0
lambda          : 2.0
major_radius    : 1
map_type        : 0
noise_generator : 2
octaves         : 6
omega           : 0.5  
orientation     : <0,0,1>
phase           : 0.0
poly_wave       : 1.0
strength        : 1.0
turbulence      : <0,0,0>

Los modificadores PIGMENT_LIST, quick_color, y pigment_map sólo son aplicables a pigmentos. Mira la sección "Pigmento" para más detalles sobre estos modificadores específicos para pigmentos.

Los modificadores COLOR_LIST y color_map sólo se aplican a pigmentos y densidades. Mira las secciones "Pigmento" y "Densidad" para conocer más detalles acerca de estos modificadores.

Los modificadores NORMAL_LIST, bump_size, slope_map y normal_map sólo son aplicables a los normales. Mira la sección "Normal" para conocer más detalles acerca de estos modificadores específicos de la normal.

Los modificadores TEXTURE_LIST y texture_map sólo son aplicables en texturas con patrón. Véase la sección "Mapas de Texturas" para conocer más detalles.

Los modificadores DENSITY_LIST y density_map sólo pueden usarse con sentencias media{density{..}}. Véase la sección "Densitdad" para conocer más detalles.

El modificador agate_turb sólo puede usarse con el patrón agate. Mira la sección "Agate" para conocer más detalles.

Los modificadores brick_size y mortar sólo pueden usarse con el patrón brick. Mira la sección "Brick" para conocer más detalles.

Los modificadores control0 y control1 sólo pueden usarse con el patrón quilted. Mira la sección "Quilted" para conocer más detalles.

El modificador interpolate sólo puede usarse con el patrón density_file. Véase la sección "Archivo de Densidad" para conocer más detalles.

Los modificadores de patrones de propósito general detallados en las siguientes secciones, pueden usarse con patrones de pigmentos, normales, texturas o densidades.

6.7.12.1  Transformaciones de patrones

Los modificadores de patrón más comunes son los modificadores de transformación translate, rotate, scale, transform, y matrix. Para conocer más detalles sobre estos comandos, véase la sección "Transformaciones".

Estos modificadores pueden situarse dentro de pigmentos, normales, texturas y densidades, para cambiar la posición, tamaño y orientación de los patrones.

Las transformaciones se realizan en el orden en que las hayas especificado. Sin embargo, en general, el orden de las transformaciones no afecta a otros modificadores como la turbulencia o el mapa de colores. Por ejemplo, da lo mismo escalar un patrón antes o después de la turbulencia. La turbulencia siempre se calcula primero, y luego se aplica el escalado sin importar si se especifica primero. Sin embargo, el orden de las transformaciones sí es importante en el caso de las sentencias warp (combamientos). Véase la sección correspondiente para conocer más detalles.

6.7.12.2  Frecuencia y fase

Los modificadores frequency y phase actúan como una especie de modificadores de escalado y traslación para los mapas de transición (mapas de color, normal, etc...), y sólo tienen sentido cuando se usa alguno de estos mapas, como color_map, pigment_map, normal_map, slope_map, density_map, y texture_map. En esta subsección se utiliza un mapa de colores como ejemplo, pero los mismos principios pueden aplicarse a cualquier otro tipo de mapa.

El modificador frequency establece el número de veces que un mapa de color se repite en un ciclo del patrón. Por ejemplo, el patrón gradient usa los valores del mapa de colores desde 0 a 1, sobre un área que va desde x=0 a x=1. Añadiendo el modificador frequency 2.0, el mapa de color se repite dos veces en el mismo rango. El mismo efecto podría conseguirse escalando el patrón a la mitad con scale 0.5*x, así que en el patrón de gradiente este modificador no es muy útil.

Sin embargo, el patrón radial dobla el mapa de color alrededor del eje +y en una revolución. Si quisieras que el mapa apareciera dos veces, tendrías que crear un mapa duplicado, o añadir el modificador frequency 2.0 para que aparezca dos veces en una sola revolución. Por ejemplo, prueba lo siguiente:

  pigment {
    radial
    color_map{[0.5 color Red][0.5 color White]}
    frequency 6
  }

El resultado consiste en seis repeticiones de dos tiras radiales, una blanca y otra roja, regularmente distribuidas alrededor del objeto.

El valor de coma flotante que sigue a frequency puede ser cualquier valor. Los valores mayores de 1.0 hacen que el mapa se repita, mientras que los valores entre 0.0 y 1.0 provocan que sólo aprezca parte del mapa. Los valores negativos simplemente utilizan un mapa invertido.

El valor de phase traslada la posición de las entradas del mapa, haciendo que éste empieze y acabe en valores diferentes a 0 y 1. En el ejemplo anterior, si renderizas fotogramas sucesivos incrementando phase (0.0, 0.1, 0.2, etc...), crearás una animación en la que las bandas radiales rotan alrededor del objeto. El mismo efecto puede conseguirse en este caso rotando el pigmento radial, pero hay otras situaciones en las cuales phase resulta muy útil.

Por ejemplo, imagina que tienes un bonito gradiente, o un patrón de madera, y quieres ajustarlo ligeramente sin tener que reordenar las entradas del mapa. Un pequeño ajuste de la fase puede ayudarte, manteniendo la misma escala.

También puedes probar a crear una animación modificando la fase de un pigmento con el patrón mandel como ejemplo de efecto de rotación de la paleta.

Los nuevos valores del mapa se calculan según la siguiente fórmula:

Nuevo_Valor = fmod ( Valor_Previo * Frecuencia + Fase, 1.0 ).

Los modificadores frequency y phase no tienen efecto en los patrones de bloque checker, brick, y hexagon, ni tampoco en los mapas image_map, bump_map o material_map. Tampoco valen para sentencias de normal si se usan los patrones bumps, dents, quilted o wrinkles, ya que éstos no pueden usar mapas de tipo normal_map ni slope_map.

Sin embargo, pueden usarse con los patrones ripples y waves, aunque éstos no usen normal_map o slope_map. Cuando se usa con ripples o waves, el modificador frequency ajusta el espacio entre ondas/olas, mientras que phase puede usarse para hacer que éstas se muevan en relación a su centro.

6.7.12.3  Formas de onda

POV-Ray te permite aplicar varias formas de onda a la función del patrón, antes de aplicarlo sobre un mapa de transición. Los mapas de transición son color_map, pigment_map, normal_map, slope_map, density_map, y texture_map.

La mayoría de los patrones con mapas de transición usan las entradas del mapa en orden, desde 0.0 hasta 1.0. El efecto de la forma de onda puede apreciarse más claramente cuando se usan como patrones de normal sin especificar un mapa. Los patrones como gradient u onion generan un realce con forma de rampa. Ésta es la forma de onda ramp_wave, que es la forma por defecto en la mayoría de los patrones. Sin embargo, los patrones wood y marble usan un mapa que va de 0.0 a 1.0 y luego de vuelta desde 1.0 a 0.0. El resultado es una forma de onda que sube hasta un pico para caer de nuevo siguiendo una forma de dientes de sierra, llamada triangle_wave. En versiones anteriores de POV-Ray no se podía alterar la forma de onda, aunque se podía simular la forma de onda triangular con una rampa duplicada en orden inverso.

En esta versión, puedes cambiar la forma de onda por defecto de cualquier patrón. Por ejemplo:

  pigment { wood color_map { MyMap } ramp_wave }

Otras formas de onda disponibles son sine_wave, scallop_wave, cubic_wave y poly_wave. La mayoría son principalmente útiles para actuar como una especie de mapa de inclinación predefindo para las normales. La forma de onda sine_wave convierte el zig-zag de la rampa en una onda sinusoidal con transiciones suaves. La forma de onda scallop_wave usa el valor absoluto de la onda sinusoidal, lo que da a la normal un aspecto acanalado. La forma de onda cubic_wave describe una curva cúbica desde 0.0 a 1.0, con inclinación 0 tanto al incio como al final. La forma de onda poly_wave sigue una funcion exponencial y puede llevar un parámetro opcional de coma flotante que especifica el exponente. Por ejemplo poly_wave 2 empieza a ascender lentamente y decae rápidamente al final, mientras que poly_wave 0.5 asciende rápidamente para luego decaer suavemente al final. Si no se especifica el valor de coma flotante, éste tomará el valor 1.0 por defecto, que produce una función lineal idéntica a la forma ramp_wave.

Aunque cualquiera de estas formas de onda puede usarse con pigmentos, normales, texturas o densidades, el efecto que causan no es tan acusado en pigmentos, texturas o densidades como lo es con las normales.

Los modificadores de la forma de onda no tienen efecto en patrones de bloque como checker, brick, object y hexagon, ni tampoco en los mapas image_map, bump_map o material_map. Finalmente, tampoco afectan a los patrones de normal bumps, dents, quilted, ripples, waves, o wrinkles, ya que estos patrones no pueden usar normal_map ni slope_map.

6.7.12.4  Generadores de ruido

POV-Ray implementa tres generadores de ruido, que pueden seleccionarse usando la sentencia noise_generator para cambiar la apariencia de los patrones basado en ruido, como bozo o granite.

El valor por defecto es noise_generator 2

Nota: El generador de ruido puede también establecerse de manera general en la sentencia global_settings

6.7.12.5  Turbulencia

El modificador de patrón turbulence todavía se soporta por razones de compatibilidad, pero es recomendable utilizar en las nuevas escenas la nueva sentencia warp {turbulence}, que no tiene las limitaciones de transformación de la turbulencia clásica (se aplica siempre primero, antes de cualquier transformación, sin importar el orden especificado). Para una explicación detallada, véase "Turbulencia clásica y turbulencia de combamiento (warp)".

La turbulencia clásica se comporta de forma diferente en los patrones agate, marble, spiral1, spiral2 y wood.

6.7.12.6  Combamientos (warps)

La sentencia warp es un modificador de patrón similar a la turbulencia. La turbulencia consiste en desplazar, mediante una serie de pasos aleatorios, el punto de evaluación del patrón. En contraste, los combamientos desplazan el punto de una manera geométrica bien definida, no aleatoria. Ademas, el combamiento salva algunas limitacions de la turbulencia tradicional con las transformaciones, dando al usuario mucho más control sobre el orden en que se aplican sobre el patrón las transmformaciones y los modificadores del combamiento.

Actualmente hay siete tipos de combamientos, aunque la sintaxis se ha diseñado pensado en una futura expansion. El combamiento de turbulencia provee una manera alternativa de especificar la turbulencia. Los otros tipos modifican los patrones en distintas formas, siempre geométricas.

La sintaxis de la sentencia warp es la siguiente:

WARP:
    warp { WARP_ITEM }
WARP_ITEM:
    repeat <Direccion> [REPEAT_ITEMS...] |
    black_hole <Emplazamiento>, Radius [BLACK_HOLE_ITEMS...] | 
    turbulence <Cantidad> [TURB_ITEMS...]
    cylindrical  [ orientacion VECTOR | dist_exp FLOAT ]
    spherical  [ orientacion VECTOR | dist_exp FLOAT ]
    toroidal  [ orientacion VECTOR | dist_exp FLOAT |
                radio_mayor FLOAT ]
    planar [ VECTOR , FLOAT ]
REPEAT_ITEMS:
	    offset <Cantidad> | 
    flip <Eje>
BLACK_HOLE_ITEMS:
    strength Fuerza | falloff Cantidad | inverse |
    repeat <Repeticion> | turbulence <Cantidad>
TURB_ITEMS:
    octaves Contador | omega Cantidad | lambda Cantidad

Puedes usar tantas sentencias de combamiento por patrón como desees. El orden de la sentencia en relación a otros modificadores como color_map o turbulence no es importante. Sin embargo, sí lo es respecto a las otras sentencias de combamiento y las transformaciones, ya que siempre se evalúan en el orden en que se hayan especificado. Por ejemplo, si trasladas y luego aplicas el combamiento, los resultados serán distintos que si primero aplicas el combamiento y después la traslación.

6.7.12.6.1  Combamiento de "agujero negro"

El combamiento black_hole se llama así debido a su similitud con los agujeros negros. Tal y como sucede con un agujero negro real, no puedes verlo. Sólo se puede detectar su presencia por los efectos que causa en lo que le rodea.

Por ejemplo, imagina los anillos concéntricos de una madera. Usando la turbulencia normal de POV-Ray y otros modificadores de texturas, puedes obtener un bonito patrón con apariencia aleatoria. Pero esta aleatoriedad es regular, o sea, ¡el patrón es regularmente aleatorio! Añadiendo un combamiento de agujero negro puedes crear turbulencia localizada en uno o múltiples emplazamientos.

Un agujero negro puede causar dos tipos de efectos: "absorción" de la de textura alrededor del agujero, o "repulsión" de ésta hacia el exterior del mismo. En el último caso, cuando se aplica a un patrón de madera, parecería como si fuera el corte de una rama. En este texto usamos el ejemplo de la madera porque es el más indicado para la explicación de los agujeros negros, pero éstos pueden usarse con cualquier textura o patrón.

El efecto por defecto del agujero negro sobre la textura o patrón es de "absorción" (la fuerza es exponencial, usando una función de cuadrado inverso), pero puede cambiarse a "repulsión" mediante el modificador inverse.

Los agujeros negros pueden usarse en cualquier sentencia donde pueda usarse el combamiento. Su sintaxis es la siguiente:

BLACK_HOLE_WARP:
    warp
    {
        black_hole <Emplazamiento>, Radio
        [BLACK_HOLE_ITEMS...]
    }
BLACK_HOLE_ITEMS:
    strength Fuerza | falloff Cantidad | inverse | type Tipo | 
    repeat <Repeticion> | turbulence <Cantidad>

La sintaxis mínima requiere la palabra clave black_hole seguida de un vector de Emplazamiento, una coma y el valor de coma flotante del Radio. El agujero negro afecta a todos los puntos que están dentro de la región esférica definida por el radio alrededor del emplazamiento. Opcionalmente, pueden especificarse a continuación cualquier número de palabras clave para controlar cómo se distorsiona la textura.

La palabra clave falloff, más un valor de coma flotante, se usan para especificar la potencia de decrecimiento del efecto del agujero negro. El valor por defecto es 2. La fuerza del agujero negro en un punto dado, antes de aplicar el modificador strength, se calcula de la siguiente forma:

Primero, convierte la distancia desde el punto hasta el centro a un valor proporcional (entre 0 y 1) a la distancia hasta el borde del agujero negro. Para un punto en el borde del agujero obtendrás 0.0, mientras que un punto en el centro obtendrás 1.0, y un punto a mitad de camino te dará 0.5. Mentalmente puedes considerarlo como un factor de cercanía. Un factor de cercanía de 1.0 indica el valor más próximo al centro, mientras que un factor de cercanía 0.0 indica el valor más lejano pero todavía perteneciente al agujero negro.

Llamemos c a este valor. Ahora habría que elevar c a la potencia especificada por falloff. Por defecto ésta es 2, así que tendríamos c² o "c al cuadrado". El valor resultante es la fuerza del agujero negro en ese punto, y se usará, despues de aplicar el factor de escalado strength, para determinar cuánto hay que perturbar la posición del punto en el espacio. Por ejemplo, si c es 0.5, la fuerza es 0.5², que es 0.25. Si c es 0.25, la fuerza será 0.125. Pero si c es exactamente 1.0, la fuerza es también 1.0. Recuerda que tal como decrece el valor de c, el punto se aleja del centro del agujero negro. Con la potencia por defecto de 2, puedes observar que la potencia decrece exponencialmente siguiendo la ley del cuadrado inverso. Hablando en castellano, significa que la fuerza es mucho más intensa en el centro que hacia los bordes.

Incrementando falloff puedes aumentar la potencia de decaimiento. Un valor grande hará que los puntos cercanos al perímetro se vean sólo ligeramente afectados, mientras que en los puntos cercanos al centro el efecto será muy pronunciado. Un valor de 1.0 produce un efecto lineal: un punto a mitad de camino hacia el centro del agujero se verá afectado por una fuerza de 0.5. Un valor de falloff menor de 1.0 pero mayor que 0, hará que la fuerza se incremente hacia los bordes, en lugar de decrecer. Esto puede tener algunos usos, pero es más un efecto colateral. Recuerda que el efecto de un agujero negro no se aplica más allá del perímetro, así que habrá un fuerte contraste entre los bordes y el exterior, creando una forma esférica. Un valor de falloff 0 provoca que la fuerza sea 1.0 para todos los puntos dentro del agujero negro, ya que cualquier número mayor que cero elevado a 0 es igual a 1.

La palabra clave strength puede ir acompañada de un valor de coma flotante para controlar la cantidad de perturbación que provoca el agujero negro. Básicamente, la fuerza del agujero negro (tal como determinábamos anteriormente), se multiplica por el valor de strength, que por defecto es 1.0. Si lo cambias a 0.5, por ejemplo, todos los puntos dentro del agujero negro se perturbarán sólo un 50% de lo normal. Si lo incrementas a 2.0, se perturbarán el doble.

En el ejemplo anterior hay que hacer una salvedad: el movimiento de un punto se trunca a un máximo de la distancia original desde el centro. Para un punto que está a 0.75 unidades del centro, el movimiento no puede exceder de un máximo de 0.75 unidades, independientemente del valor de strength. El resultado de este truncamiento es un área de exclusión cerca del centro del agujero negro, donde todos los puntos cuya fuerza final excede, o es igual a 1.0, se perturban dentro de una distancia fija.

Si se especifica la palabra clave inverse se cambia el efecto normal de atracción por el efecto inverso, o de repulsión desde el centro.

La palabra clave repeat, seguida de un vector, te permite simular el efecto de muchos agujeros negros sin tener que declararlos explícitamente, en múltiples emplazamientos. Al usar repeat la escena se divide lógicamente en cubos, el primero de ellos situado en <0,0,0> y los siguientes en la dirección del vector de repetición. Supón que el vector de repetición es <1,5,2>. Entonces el primer cubo irá desde <0,0,0> a < 1,5,2>. La siguiente repetición estará situada en < -1,-5,-2>, <1,5,2>, <2,10,4>, y asi "ad infinitum" en todas las direcciones.

Cuando se usa repeat, el centro del agujero negro no especifica una posición absoluta en la escena, sino un desplazamiento en cada bloque. Sólo es posible usar desplazamientos positivos. Los valores negativos producirán resultados indefinidos.

Supongamos que el centro está en <0.5,1,0.25> y el vector de repetición es <2,2,2>. De esta forma obtendríamos un bloque en <0,0,0>, otro en <2,2,2>, etc. Los centros de los agujeros negros de cada uno de estos bloques serían <0,0,0> + <0.5,1.0,0.25>, o sea <0.5,1.0,0.25>, y < 2,2,2> + <0.5,1.0,0.25>, o sea < 2,5,3.0,2.25>.

Debido a la forma en que las repeticiones se calculan internamente, existe una restricción en los valores que puedes especificar para el vector de repetición. Básicamente, cada agujero negro debe estar totalmente contenido en cada bloque (o cubo), sin partes que invadan los cubos vecinos. Ello significa que, en cada una de las tres dimensiones, el desplazamiento del centro no puede ser menor que el radio, y el valor de repetición para esa dimensión debe de ser >= que el centro más el radio, ya que cualquier otro valor permitiría al agujero negro execederse de los límites. Dicho de otra forma, para cada x, y, z debe cumplirse Radio <= Desplazamiento o Centro <= Repetición - Radio.

Si el vector de repetición, en cualquier dimensión, es demasiado pequeño para cumplir el criterio, será incrementado y se mostrará un mensaje de error. Si el centro es menor que el radio, tambien se moverá, pero no se generará ningun mensaje.

Observa que nada de lo anterior significa que no puedas solapar agujeros negros. Ciertamente que puedes, y de hecho de esta manera se pueden producir los efectos más útiles. La restricción sólo se aplica a los elementos repetidos del mismo agujero negro. Puedes definir un segundo agujero negro que también se repite, y cuyos elementos felizmente solapan al primero, causando las interacciones apropiadas. Es legal que el vector de repetición tenga alguna de las dimensiones con valor 0, significando ello que el agujero negro no se repetirá a lo largo de esa dimensión.

La palabra clave turbulence sólo puede usarse en un agujero negro en conjunción con repeat. Permite introducir un elemento de aleatoriedad en la repetición de los agujeros negros, para causar un efecto de apariencia más natural. Un buen ejemplo sería una serie de nudos en una madera: parecería demasiado artificial si cada nudo estuviera a la misma distancia del anterior.

El vector turbulence es una medida que se añade a cada agujero negro individual en cada fila, después de que cada eje del vector sea multiplicado por una cantidad aleatoria diferente entre 0 y 1. La posición real resultante del centro del agujero negro para una repetición en concreto es aleatoria (pero consistente, de forma que se puede repetir el renderizado con idéntico resultado) dentro de los límites arriba citados. Hay un pequeño inconveniente en el uso de la turbulencia, que es básicamente el mismo que teníamos con el vector de repetición. No puedes especificar un valor que desplace potencialmente el agujero negro fuera de los límites de su propio bloque.

En resumen: para cada una de las tres dimensiones, el desplazamiento del centro debe ser >=radio y el valor de repetición debe ser >= centro + radio + turbulencia. La excepción es que la repetición puede ser 0 para cualquier dimensión, lo que significa no repetir en esa dirección.

Veamos algunos ejemplos:

  warp {
    black_hole <0, 0, 0>, 0.5
  }
  warp {
    black_hole <0.15, 0.125, 0>, 0.5
    falloff 7
    strength 1.0
    repeat <1.25, 1.25, 0>
    turbulence <0.25, 0.25, 0>
    inverse
  }
  warp {
    black_hole <0, 0, 0>, 1.0
    falloff 2
    strength 2
    inverse
  }
6.7.12.6.2  Combamiento de repetición (repeat warp)

El combamiento de tipo repeat hace que una sección del patrón se repita infinitamente. Se recorta una parte del patrón, que se copia adyacentemente. El combamiento tiene muchos usos, pero fue diseñado originalmente para crear texturas de madera chapada. Normalmente, ésta se corta en finas capas que se suelen poner una al lado de la otra sobre algún material de soporte. Así, se pueden observar los anillos de la madera, cortados a distintas profundidades en cada lámina.

La sintaxis del combamiento de repetición es la siguiente:

REPEAT_WARP:
    warp { repeat <Direction> [REPEAT_ITEMS...] }
REPEAT_ITEMS:
    offset <Amount> | flip <Axis>

El vector repeat especifica la dirección en la que se repite el patrón y la anchura del área a repetir. Este vector debe estar alineado con alguno de los ejes. Es decir, dos de sus tres componentes deben de ser 0. Por ejemplo:

  pigment {
    wood
    warp { repeat 2*x }
  }

lo que significa que desde x=0 hasta x=2 se obtiene lo que normalmente se obtendría con el patrón, pero desde x=2 hasta x=4 se obtiene otra vez lo mismo, desplazado dos unidades en la dirección del eje x. Para evaluarlo sólo hay que tomar el módulo 2 de la coordenada x. Desafortunadamente, el resultado son duplicados exactos, lo cual no es muy realista. El vector opcional offset permite trasladar el patrón cada vez que se repite. Por ejemplo:

  pigment {
    wood
    warp {repeat x*2  offset z*0.05}
  }

Finalmente, el vector flip provoca que se invierta simétricamente el patrón en repeticiones alternas. La primera copia del patrón en la direccion positiva del eje no se invierte, pero la segunda sí, la tercera no, y así sucesivamente. El vector de simetría es un vector de tres componentes, pero cada componente se trata como un valor booleano que indica si debe o no invertirse simétricamente el patrón en ese eje. Por ejemplo:

  pigment {
    wood
    warp {repeat 2*x  flip <1,1,0>}
  }

hace que el patrón se invierta simétricamente, en repeticiones alternas, sobre los ejes x e y, pero no sobre el eje z. Cualquier valor distinto de 0 habilita la inversión, mientras que el valor 0 significa que no se invertirá el patrón. La magnitud de los valores del vector no se tiene en cuenta.

6.7.12.6.3  Comparación entre turbulencia clásica y de combamiento

El lenguaje de POV-Ray contiene una ambigüedad, que es al mismo tiempo una limitación, en la forma de especificar la turbulencia y las transformaciones de traslación, rotación, escalado, etc... Normalmente, la turbulencia se aplica siempre primero, y despues se efectúan las transformaciones, sin importar si la turbulencia se especificó después. Por ejemplo, este pigmento:

 pigment {
   wood
   scale .5
   turbulence .2
 }

es exactamente el mismo que este otro:

 pigment {
   wood
   turbulence .2
   scale .5
 }

La turbulencia se aplica siempre primero. Con rotaciones y turbulencia en un solo eje se ilustra todavía mejor esta limitación:

  pigment {
    wood
    turbulence 0.5*y
    rotate z*60
  }
                   // a comparar con
  pigment {
   wood
   rotate z*60
   turbulence 0.5*y
  }

El resultado será el mismo, aunque te pueda parecer lo contrario.

No podemos cambiar este comportamiento básico de POV-Ray ahora, ya que muchas escenas antiguas podrían dar diferentes resultados si de repente importa el orden de las transformaciones frente a la turbulencia.

Sin emabrgo, especificando la turbulencia dentro de una sentencia warp, se puede hacer que POV-Ray tenga en cuenta el orden de la turbulencia respecto a las transformaciones, e incluso respecto a otros combamientos. Veamos un ejemplo de turbulencia de combamiento:

  warp { turbulence <0,1,1> octaves 3 lambda 1.5 omega 0.3 }

La parte importante es que el pigmento:

 pigment {
   wood
   translate <1,2,3> rotate x*45 scale 2
   warp { turbulence <0,1,1> octaves 3 lambda 1.5 omega 0.3 }
 }

produce un resultado diferente a este otro...

 pigment {
   wood
   warp { turbulence <0,1,1> octaves 3 lambda 1.5 omega 0.3 }
   translate <1,2,3> rotate x*45 scale 2
 }

Puedes especificar la turbulencia sin usar una sentencia de combamiento, pero entonces no tendrás control sobre el momento en que se evalúa.

Las reglas de evaluación son las siguientes:

  1. Primero se aplica cualquier turbulencia que no esté dentro de una sentencia warp, sin importar dónde aparezca respecto a las transformaciones u otros combamientos.
  2. Después se aplica cada combamiento, traslación, rotación, escalado o matriz, uno después de otro, según el orden especificado por el usuario.
6.7.12.6.4  Turbulencia de combamiento

Dentro de una sentencia warp, se puede usar la palabra reservada turbulence, seguida de un valor de coma flotante o un vector, para distorsionar cualquier pigmento, normal o densidad. Existe un número adicional de parámetros que puede usarse para controlar la turbulencia. La sintasix es la siguiente:

TURBULENCE_ITEM:
    turbulence <Amount> | octaves Count |
    omega Amount | lambda Amount

Los valores típicos para la turbulencia van desde el valor por defecto de 0.0 hasta 1.0 o más, lo cual implicaría mucha turbulencia. Si se especifica un vector, se usarán los valores de los componentes como la cantidad de turbulencia a aplicar en cada eje. Por ejemplo:

  turbulence <1.0, 0.6, 0.1>

provoca mucha turbulencia en la direccion del eje x, bastante en el eje y, y poca en el eje z.

La turbulencia usa una función de ruido aleatorio llamada DNoise. Este tipo de ruido es similar al ruido empleado en el patrón bozo, excepto en que en lugar de devolver un valor simple, devuelve una dirección. Puedes imaginarlo como la dirección en la que el viento sopla en ese punto. Los puntos cercanos entre sí generan valores similares, pero los puntos alejados se distorsionarán de forma diferente y aleatoria.

La turbulencia usa la funcion DNoise para distorsionar el patrón en varios pasos, llamados octaves. Primero se localiza el punto a evaluar, luego se desplaza un poco usando la turbulencia para obtener un punto diferente, y entonces se mira el color del nuevo punto.

Cada paso es típicamente la mitad del anterior. Veamos un ejemplo gráfico:

Trayectoria aleatoria de turbulencia
Trayectoria aleatoria de turbulencia

La magnitud de los pasos se controla con el valor de turbulencia. Hay también 3 parámetros adicionales que controlan cómo se calcula la turbulencia. Éstos son octaves, lambda y omega. Cada uno de ellos es opcional, y deben de ir seguidos de un valor de coma flotante. Ninguno de ellos causará ningun efecto si no hay turbulencia.

6.7.12.6.4.1  Octaves

La palabra reservada octaves puede ir seguida de un valor entero que controla el número de pasos de turbulencia que se calcularán. Los valores legales oscilan desde 1 a 10. El valor por defecto de 6 es un valor bastante alto: no apreciarás mucha diferencia cuando lo incrementes, ya que los siguientes pasos son muy pequeños. Los valores pequeños dan unos resultados más suaves, ondulados, y se calculan más rápido. Los valores muy altos crean una turbulencia más distorsionada, y tardan más en calcularse.

6.7.12.6.4.2  Lambda

El parámetro lambda controla la aleatoriedad del desplazamiento en cada octava en comparacion con la anterior. El valor por defecto de 2.0 implica bastante aleatoriedad. Los valores cercanos a 1.0 harían más recta la trayectoria de la turbulencia en el diagrama anterior. Los valores grandes hacen que turbulencia parezca más "revuelta" en determinadas circunstancias.

6.7.12.6.4.3  Omega

El valor omega controla la longitud de los pasos comparados con el valor previo. Cada paso sucesivo de la turbulencia se multiplica por el valor de omega. El valor por defecto de 0.5 significa que cada octave es 1/2 de la anterior. Los valores altos de omega harán que la 2ª, 3ª, 4ª y sucesivas octavas contribuyan más turbulencia, dando un aspecto más nítido, como arrugado, mientras que los valores bajos dan un aspecto más difuso, que aparece como borroso en algunos lugares.

6.7.12.6.5  Mapeo usando combamientos

Sintaxis:

  CYLINDRICAL_WARP:
    warp { cylindrical [CYLINDRICAL_ITEMS...]}
  CYLINDRICAL_ITEMS:  
    orientation VECTOR | dist_exp FLOAT
  SPHERICAL_WARP:
    warp { spherical [SPHERICAL_ITEMS...]}
  SPHERICAL_ITEMS:  
    orientation VECTOR | dist_exp FLOAT
  TOROIDAL_WARP:
    warp { toroidal [TOROIDAL_ITEMS...]}
  TOROIDAL_ITEMS:  
    orientation VECTOR | dist_exp FLOAT | major_radius FLOAT
  PLANAR_WARP:
    warp { planar [ VECTOR , FLOAT ]}
  

Con los combamientos cilíndrico, esférico y toroidal puedes "envolver" cilindros, esferas, toros y otros objetos con un patrón ajedrezado, de ladrillo, o cualquier otro. En esencia, usan el mismo mapeo que los mapas de imagen.

Sin embargo, al ser un mapeo 3D, hay que hacer concesiones en cuanto a la profundidad. Ésta es controlable a través del modificador dist_exp (exponente de la distancia). Con el valor por defecto de 0, puedes imaginarla como una caja que va desde <0,0> hasta <1,1> (en realidad sería <0,0>, <dist^dist_exp,dist^dist_exp>) estirada hasta el infinito en la dirección del vector de orientación. El combamiento toma sus puntos de esta caja.

Para una esfera, distance es la distancia desde el origen, mientras que para un cilindro es la distancia desde el eje y, y para un toro es la distancia desde el radio mayor (o la distancia es el radio menor, si prefieres verlo así).

Valores por defecto:

orientation <0,0,1>
dist_exp 0
major_radius 1

Ejemplos:

   torus {
     1, 0.5
     pigment {
       hexagon
       scale 0.1
       warp {
         toroidal 
         orientation y 
         dist_exp 1 
         major_radius 1
       }
     }
   }
   sphere {
     0,1
     pigment {
       hexagon
       scale <0.5/pi,0.25/pi,1>*0.1
       warp {
         spherical
         orientation y 
         dist_exp 1 
       }
     }
   }
   cylinder {
     -y, y, 1
     pigment {
       hexagon
       scale <0.5/pi, 1, 1>*0.1
       warp {
         cylindrical 
         orientation y 
         dist_exp 1 
       }
     }
   }

El combamiento plano (planar) se pensó para hacer que un patrón se comporte como un mapa de imagen, de tamaño infinito y que puede ser útil en combinación con otros tipos de mapeo. Por defecto, el pigmento en el plano XY se extrusiona a lo largo del eje Z. El pigmento puede tomarse de otro plano, especificando el vector opcional (normal del plano) y un valor de coma flotante (distancia a lo largo de la normal). El resultado se extrusionará a lo largo del eje Z, como antes.

6.7.12.7  Modificadores de mapas de bits

Un modificador de mapa de bits es aquél que se usa en un image_map, bump_map o material_map para especificar cómo se aplica el mapa de bits 2D sobre la superficie 3D. Algunos de los modificadores de mapa de bits se aplican sólo a ciertos tipos de mapeo, y se tratarán en las secciones apropiadas. Los modificadores detallados en las siguientes secciones son aplicables a todos los tipos de mapeo.

6.7.12.7.1  La opción once (una vez)

Normalmente los mapas de imagen, de normal o de material se repiten infinitamente por cada unidad cuadrada del plano XY, como si fueran azulejos. Añadiendo la palabra reservada once después del nombre de fichero, puedes eliminar las copias extra, excepto la original que va desde (0,0) a (1,1). En los mapas de imagen, las áreas que quedan fuera de la unidad cuadrada se tratan como si fueran totalmente transparentes. En los mapas de bultos esta área exterior es plana, sin modificación de la normal. En los mapas de materiales, el área exterior a la unidad cuadrada se rellena con la textura que figura en primer lugar de la lista de texturas.

Por ejemplo:

  image_map {
    gif "mypic.gif"
    once
  }
6.7.12.7.2  La opción map_type (tipo de mapeo)

Por defecto, la imagen se proyecta en el plano XY, a lo que llamamos mapeo de tipo plano. El tipo de proyección puede cambiarse usando la palabra reservada map_type seguida de un número entero que especifica el tipo de proyección a utilizar para envolver el objeto con la imagen.

El valor map_type 0 da como resultado el mapeo plano por defecto que ya hemos descrito.

Con map_type 1 conseguiremos un mapeo esférico. Se asume que el objeto es una esfera de cualquier tamaño situada en el origen. El eje y actúa como eje de los polos norte/sur del mapeo esférico. Los bordes superior e inferior de la imagen siempre tocan los polos de cualquier esfera situada en el origen, independientemente de su tamaño. El borde izquierdo de la imagen empieza por la parte positiva del eje x, y envuelve la esfera rotando alrededor del eje x en dirección oeste-este. La efera se cubre completamente con una sola copia de la imagen. La opcion once no tiene sentido con este tipo de proyección.

Usando map_type 2 obtendrás una proyección cilíndrica. Se asume un cilindro de cualquier diámetro alineado con el eje y. La imagen se envuelve alrededor del cilindro de la misma forma que en el mapeo esférico, pero la altura de la imagen se fija a 1 unidad, desde y=0 a y=1. Esta banda se repetirá infinitamente hacia arriba y hacia abajo en el eje y, a no ser que se use el modificador once.

Finalmente, el valor map_type 5 usa un mapeo toroidal, con forma de donut. Se asume un toro de radio mayor 1, situado en el origen y alineado con el plano XZ. La imagen se envuelve alrededor del toro de manera similar a los mapeos esférico y cilíndrico. Sin embargo, el borde superior e inferior de la imagen se envuelven también cilíndricamente por arriba y abajo, para encontrarse en la parte interior del anillo del toro.

Los tipos 3 y 4 están todavía en fase de desarrollo.

Nota: observa que la opción map_type puede también aplicarse a las sentencias bump_map y material_map.

Por ejemplo:

  sphere{<0,0,0>,1
    pigment{
      image_map {
        gif "world.gif"
        map_type 1
      }
    }
  }
6.7.12.7.3  La opción interpolate (interpolación)

Añadiendo la palabra reservada interpolate se puede suavizar el aspecto pixelado de un mapa de bits. Cuando POV-Ray comprueba el color de un punto en un mapa de imagen, o la cantidad de desplazamiento en un mapa de bultos, normalmente no comprueba un punto situado justo sobre un píxel, sino que procura tomar un punto enfrentado con píxeles de diferentes colores. La interpolación devuelve un valor medio, y por ello la transición entre píxeles resulta más suave.

Aunque el uso de interpolate es legal en mapas de materiales, el índice de color se interpola antes de escoger la textura. No se interpola el color final, como podrías esperar. En general, la interpolación de mapas de materiales no sirve para nada, pero puede que se arregle en futuras versiones.

Existen actualmente dos tipos de interpolación: interpolate 2 activa la interpolación bilineal, mientras que interpolate 4 activa la interpolación de distancia normalizada. Por ejemplo:

  image_map {
    gif "mypic.gif"
    interpolate 2
  }

Por defecto no se realiza ninguna interpolación. El tipo 4 es ligeramente más rápido, pero el tipo 2 da mejores resultados y por eso suele ser el más usado.

Si la imagen que quieres usar como mapa es pequeña para la resolución de la imagen renderizada, puedes probar a usar la interpolación, en lugar de usar una imagen con mayor resolución. Los resultados pueden ser muy buenos.