9.1.2  Cosas que no funcionan como se esperaba

9.1.2.1  ¿Utilizar varios objetos transparentes los hace negros?

"Cuando dispongo varios objetos transparentes uno enfrente de otro o dentro de otro, POV-Ray calcula unos pocos de ellos, pero el resto aparece completamente negro, no importa los valores de transparencia les haya dado."

Respuesta breve: Pruebe incrementando el valor de max_trace_level en el bloque global_settings(el valor por definición es 5).

Respuesta larga:

El trazado de rayos -Raytracing- tiene una característica particular: Puede calcular la reflexión y la refracción. Cada vez que un rayo alcanza la superficie de un objeto, el programa averigua si la superficie es reflectiva y/o refractiva. Si es asi, lanza otro rayo a partir de este punto en la dirección apropiada.

Ahora, imagine que tenemos una esfera de vidrio. El vidrio refleja y refracta, por eso cuando el rayo alcanza a la esfera, se calculan dos rayos adicionales, uno fuera de la esfera (para la reflexión) y otro por dentro (para la refracción). Ahora el rayo interior tocará a la esfera otra vez, para que dos nuevos rayos sean calculados de nuevo, y así una y otra vez...

Se observa fácilmente que debe haber un número máximo de reflexiones/refracciones calculadas, porque de otra manera POV-Ray estaría calculando solo ese pixel por siempre.

Este número puede determinarse con la opción max_trace_level en el bloque global_settings. El valor por definición es 5, que es suficiente para la mayoría de las escenas. Algunas veces no lo es (especialmente cuando hay bastantes objetos semi-transparentes uno encima de otro) y entonces debe incrementarlo.

Pruebe algo como esto:

global_settings
{
max_trace_level 10
}

9.1.2.2  Estoy obteniendo bandas de color en mi imagen.

"Cuando hago una imagen con POV-Ray, parece que use solamente unos pocos colores puesto que obtengo bandas de color o círculos concéntricos de color o lo que sea, donde no debiera. ¿Cómo puedo hacer que POV-Ray use más colores? "

POV-Ray siempre genera imágenes en color verdadero (true color), esto es, con 16777216 colores, 256 tonos de rojo, 256 tonos de verde y 256 tonos de azul (esto puede cambiar si la salida es en PNG o en TGA blanco y negro -B/W- pero esto es irrelevante en esta respuesta).

Por eso, POV-Ray no es el culpable, ya que siempre utiliza la máxima resolución de color disponible para el formato de salida de la imagen.

Este problema sucede a menudo cuando se utilizan ventanas de 16-bit de color (sólo 65536 colores, el llamado modo hicolor ) y al abrir una imagen creada por POV-Ray en un programa que no hace mezcla de color (dither) de la imagen. La imagen sigue siendo de color verdadero, pero el programa es incapaz de mostrar todos los colores, y solo muestra 65536 de ellos ("dithering" es un método que "simula" más colores mezclando pixeles de dos colores adyacentes para emular los colores que se producen entre ellos).

Por eso el problema no está en POV-Ray, sino en su programa visualizador de imágenes. Aun si POV-Ray muestra una imagen pobre durante la renderización, es porque usted tiene una resolución de muy pocos colores. La imagen creada poseerá un rango de color completo.

9.1.2.3  La rotación se comporta de manera muy extraña.

"Cuando roto un objeto, éste desaparece de la imagen o se mueve de manera muy extraña. ¿Por qué? "

Necesita comprender cómo funciona la rotación en POV-Ray.

Los objetos se rotan siempre alrededor de los ejes. Cuando usted rota, por ejemplo, <20,0,0>, eso significa que está rotando 20 grados alrededor del eje de las X (contra el sentido de las agujas del reloj). Esto es independiende de la ubicación del objeto: Siempre rota alrededor de los ejes (¿Cuál es el centro del objeto? ¿Cómo lo ha posicionado?). Esto implica que si el objeto no está centrado en el eje, orbitará alrededor de este eje como la Luna orbita la Tierra (mostrando siempre el mismo lado hacia el planeta Tierra).

Es una práctica recomendable definir todos los objetos centrados en el origen (ej, su 'centro' se localiza en <0,0,0>). Luego puede rotarlos arbitrariamente. Después de esto puede trasladarlos a su ubicación designada en la escena (porque nunca puede decir si lo rotará otro dia).

Y que pasaría si, después de todo, tuviera definido un objeto muy complicado, cuyo centro no estuviera en el origen, y deseara rotarlo alrededor de su centro? Puede trasladarlo a su origen, rotarlo, y luego devolverlo a su lugar. Suponga que el centro del objeto se localiza en <10,20,-30>; puede rotarlo así:

translate -<10,20,-30>
rotate <rotacion deseada>
translate <10,20,-30>

9.1.2.4  Cuando renderizo una imagen cuadrada, se distorsiona.

"Si le digo a POV-Ray que renderice una imagen cuadrada o que de alguna manera cambie la proporción de tamaño -aspect ratio- la imagen de salida aparece distorsionada. ¿Qué estoy haciendo mal? "

El problema es que la cámara está definida para una relación de tamaño =aspect ratio- de 4/3, mientras que la imagen que está tratando de renderizar tiene una proporción de 1/1 (o la que sea).

Puede cambiar la relación de tamaño con el indicador 'right' en el bloque del código de la cámara. La manera generalizada de determinar la proporción correcta para las dimensiones de su imagen es:

camera
{ right x*ImageWidth/ImageHeight
(otros ajustes de la camara...)
}

Este indicador puede usarse también para cambiar la orientación de POV-Ray (ver la pregunta acerca de Moray y la orientacón de POV-Ray para más detalles).

Nota: Se pudiera pensar "Por qué POV-Ray no determina automáticamente la relación de tamaño de la cámara de acuerdo con la resolución de la imagen?".

Hay algo errado en este pensamiento : Asume que los pixeles son siempre cuadrados (ie. la proporción de los pixeles es 1/1). La lógica de este comportamiento se aclara con un ejemplo:

Suponga que diseña una escena usando el aspecto de proporción o relación de tamaño regular de 4/3, como siempre (como 320x240, 640x480 y asi). Esta imagen está diseñada para lucir bien cuando se vea en un monitor 4/3 (como los de las computadoras personales).

Ahora quiere renderizar esta imagen para la imagen de inicio de Windows. La resolución de la imagen de inicio de Windows es 320x400. Esta resolución no tiene una proporción de 4/3 y los pixeles no son cuadrados (los pixeles tienen una proporción de 1/0.6 en vez de 1/1). Ahora, cuando renderiza su imagen a la resolución de 320x400 con POV-Ray y la muestra en el monitor ajustado a esa resolución (como está definida en el inicio de windows cuando se muestra la imagen de inicio), la proporción será la correcta (y no aparecerá estirada en ninguna dirección).

Si hubiese cambiado la proporción de la cámara a 320/400 (en vez de usar el valor por definición de 4/3) hubiera obtenido no solamente una imagen diferente (mostrando partes de la escena que no aparecen en el original o partes escondidas visibles en el original), sino que hubiera aparecido estirada al mostrarse a la resolución de 320x400 de la pantalla.

Así, la relación de tamaño de la cámara es la proporción o aspecto de la imagen final en la pantalla, vista en su resolución final (que puede no ser la de 4/3). Puesto que la pantalla del monitor tiene una proporción de 4/3, es el valor por definición de la cámara también.

9.1.2.5  ¿ Por qué hay extraños pixeles oscuros o ruido en mi objeto CSG?

Este es el típico 'problema de superficies coincidentes'. Sucede cuando dos superficies están exactamente en el mismo lugar. Por ejemplo:

union
{ box { <-1,0,-1>,<1,-2,1> texture { Texture1 } }
box { <-2,0,-2>,<2,-1,2> texture { Texture2 } }
}

La superficie superior de la primera caja coincide con la superficie superior de la segunda. Cuando un rayo alcanza esta área, POV-Ray debe decidir cuál superficie es la más cercana. No puede, puesto que están exactamente en el mismo lugar. La que escoja depende en realidad de los cálculos del valor flotante, error de rounding , parámetros iniciales, posición de la cámara, etc, y varía de pixel a pixel, generando esos aparentes pixeles "al azar".

La solución al problema pasa por decidir que superficie desea que esté arriba, y trasladar esa superficie sólo un poco, para que sobresalga pasando la superficie no deseada. En el ejemplo anterior, si queremos, por ejemplo, que la segunda caja esté encima, tecleamos algo como:

union
{ box { <-1,0,-1>,<1,-2,1> texture { Texture1 } }
box { <-2,0.001,-2>,<2,-1,2> texture { Texture2 } }
}

Nótese que un problema similar aparece cuando una fuente de luz está exactamente sobre una superficie: POV-Ray no puede calcular exactamente si está dentro o fuera de la superficie, por eso parecen pixeles oscuros (de sombra) en cada superficie que esa luz ilumine.

9.1.2.6  ¿Por qué las texturas de stars.inc no funcionan en mi sky_sphere?

La única cosa que funciona con sky_sphere son los pigmentos. Las texturas y acabados no están permitidos. Sin embargo, no se desanime, porque todavía puede utilizar las texturas de stars.inc con el método siguiente:

Extraiga solamente el pigmento de las texturas declaradas. Por ejemplo:

texture
{ pigment { color_map { [0 rgb ...][.5 rgb ...][1.0 rgb ...] } scale ... }
finish { ... }
}

se convierte en:

pigment { color_map { [0 rgb ...][.5 rgb ...][1.0 rgb ...] } scale ... }

La razón de esto es que sky_sphere no tiene una superficie, no es un objeto real. Es en realidad sólo una versión extendida de la característica del fondo que extrae un color de un pigmento en vez de ser un color plano. A causa de esto, las características de normal y acabado, que dependen de las características del objeto para su cálculo, no pueden usarse. Las texturas de stars.inc estaban destinadas a mapearse sobre una esfera real, y pueden ser utilizadas así:

sphere
{ 0, 1
hollow // para que no interfiera con ningún efecto de media en la escena
texture { SuTexturaCeleste }
scale 100000
}

9.1.2.7  Cuando utilizo filter o transmit con mi imagen .tga image map no pasa nada.

POV-Ray puede aplicar filter o transmit solamente a imágenes con paletas de 8 bit y 256 colores. Puesto que la mayoría de las imágenes .tga, .png, y .bmp son de 24bit y 16 millones de colores, no funcionan con filter o transmit. Si necesita usar filter o transmit con sus mapas de imágenes debe reducir la profundidad de color a un formato que soporte 256 colores, como el formato de imagen .gif.

Revise también la documentación de POV-Ray respecto del uso del canal alfa -alpha channel- de los archivos .png si necesita áreas transparentes específicas.

9.1.2.8  Las isosuperficies no renderizan apropiadamente

"Mi isosuperficie no renderiza apropiadamente; hay aberturas o ruido al azar en areas grandes e incluso toda la isosuperficie simplemente desaparece."

La causa más común para este tipo de fenómeno con las isosuperficies es un valor de max_gradient damasiado bajo. Utilice evaluate para hacer que POV-Ray calcule un max_gradient apropiado para la superficie (recuerde especificar un max_gradient sensible, inclusive al usar evaluate o el resultado puede no ser correcto).

Algunas veces un valor de accuracy demasiado alto también puede causar problemas aún cuando el valor de max_gradient esté bien. Si el probar con lo anterior no parece ayudar, pruebe también disminuyendo accuracy.

Recuerde que especificar un max_gradient que sea demasiado alto para una isosuperficie, aunque dé el resultado correcto, es innecesariamente lento, por eso debe calcular el max_gradient apropiado para cada isosuperficie que haga.

Nótese que hay ciertas funciones patológicas en las que ningún valor de max_gradient o accuracy ayudará. Estas funciones usualmente tienen descontinuidades o propiedades "enfermizas" similares. Con estas sólo le queda encontrar una solución que proporcione el mejor intercambio calidad/velocidad. Las isosuperficies trabajan mejor con funciones que generan superficies suaves.