|
"¿Cómo hago una fuente luminosa visible?" o: "Aunque pongo la cámara justo enfrente de mi fuente luminosa, no puedo ver nada. ¿Qué estoy haciendo mal?"
Una fuente luminosa en POV-Ray es solamente un concepto. Cuando se añade una fuente de luz a la escena, en realidad le estás diciendo a POV-Ray "hey, hay luz que viene de este punto". Como su nombre indica, es una fuente de luz, no una luz física (como un foco de luz o un punto brillante como una estrella). POV-Ray no añade nada en el lugar de donde la luz proviene, esto es, no hay nada ahí, sólo espacio vacío. Solamente es una clase de punto matemático que POV-Ray utiliza para realizar los cálculos de las sombras.
Para hacer visible la fuente luminosa, tienes que poner algo allí.
Existe una palabra reservada looks_like en el bloque light_source
que permite adosar fácilmente un objeto a la fuente de luz.
Implícitamente, este objeto no arroja ninguna sombra. Puedes hacer algo
como esto:
light_source
{ <0,0,0> color 1
looks_like
{ sphere
{ <0,0,0>,0.1
color { rgb 1 }
finish { ambient 1 }
}
}
translate <10,20,30>
}
Es una buena idea definir ambas cosas, la fuente de luz y el objeto "looks_like", en el origen, para luego trasladarlos al lugar correcto.
Nótese también el acabado 'finish { ambient 1 }' que hace que
la esfera brille de manera aparente. (véase también la pregunta
siguiente).
También puede lograr fuentes de luz visibles utilizando otras técnicas: Media, lens flare (disponible como un archivo de inclusión externo), glow patch, etc.
"¿Cómo puedo hacer objetos brillantes, que parezcan que estan emitiendo luz? "
Hay un truco sencillo para lograr esto: Ajuste el valor de ambiente del objeto (ambient) a 1 o mayor que 1. Esto hace que POV-Ray añada un valor de iluminación muy brillante, de manera que el color del objeto es tomado tal cual en la práctica, sin oscurecimientos debidos a la sombra o al matizado. Esto resulta en un objeto que parece replandecer incluso si se halla en la obscuridad total (útil para hacer fuentes luminosas visibles, o pequeñas luces como "leds", que no proyectan ninguna luz considerable hacia sus alrededores pero que pueden ser vistos fácilmente en la obscuridad).
Un método más sofisticado consistiría en usar media de emisión (emitting media) dentro del objeto (haciendo el objeto transparente o semi-transparente).
"¿Cómo puedo mover la cámara en una trayectoria circular mientras mira al origen?"
Hay dos maneras de hacer esto: La fácil (y limitada), y la manera más matemática.
La manera fácil:
camera
{ location <0,0,-10>
look_at 0
rotate <0,clock*360,0>
}
Esto pone la cámara a 10 unidades en el eje negativo de Z y luego la rota alrededor del eje de las X mientras mira al origen (hace un círculo de radio igual a 10).
La manera matemática:
camera
{ location <10*sin(2*pi*clock),0,-10*cos(2*pi*clock)>
look_at 0
}
Esto hace exactamente lo mismo que el primer código, pero aqui se puede controlar la trayectoria de la cámara de una manera más precisa. Por ejemplo, puede hacer la trayectoria elíptica en vez de circular cambiando los valores de seno y coseno ( ejm, en vez de 10 y 10 puede usar 10 y 5, que genera una elipse de radio mayor 10 y radio menor 5).
Una manera más fácil de hacer lo anterior consiste en usar la función vrotate(), que maneja el asunto del seno -sin()- y coseno -cos()-, asi como le permite usar rotaciones más complejas.
camera
{ location vrotate(x*10, y*360*clock)
look_at 0
}
Para obtener una elipse con este método, tan sólo necesita multiplicar el resultado de vrotate por un vector, escalando el círculo resultante. Con los dos últimos métodos también puede controlar el vector look_at (si no desea que mire solamente hacia el origen).
También podría hacer transformaciones más complejas combinando
translate(trasladar), scale (escalar), rotate (rotar), y
transformaciones de matriz reemplazando la llamada a vrotate(), con una
llamada a a la función vtransform(), que se halla en el archivo de
inclusión functions.inc
(new in POV-Ray 3.5).
La respuesta a esta pregunta se halla fácilmente en la documentación de POV-Ray, así que citaré sólo la sintaxis:
pigment
{ image_map
{ gif "image.gif"
map_type 1
}
}
(Nótese que a fin de que la imagen sea alineada apropiadamente, el objeto tiene que hallarse en el origen cuando se le aplica el pigmento, o el pigmento debe ser transformado para que se alínee con el objeto. Generalmente es mucho más fácil crear el objeto en el origen, aplicar la textura, y luego moverlo a donde quiera).
Sustituya el indicador gif con el tipo de imagen que
está utilizando (si no es un GIF): tga, iff, ppm, pgm, png o sys.
Un map_type 0 proporciona el valor por definición
planar al mapeado.
Un map_type 1 proporciona un mapeado esférico (mapea la
imagen sobre una esfera).
Con map_type 2 obtiene un mapeado cilíndrico (mapea la
imagen sobre un cilindro).
Finalmente, map_type 5 es un mapeado con la forma de toro
-torus- o rosquilla/donut (mapea la imagen sobre un toro).
Ver la documentación para más detalles.
"¿Cómo puedo general una línea curva -spline- por ejemplo, para una trayectoria de cámara en una animación"
POV-Ray 3.5 tiene una funcionalidad de splines que le permite crear splines. Esto se halla cubierto en la documentación y existen archivos de demostración con ejemplos de su uso. Hay también archivos de inclusión externos para la generación de splines que poseen mayor flexibilidad que las de las splines internas, por ejemplo los macros spline de Chris Colefax (»http://www.geocities.com/ccolefax/spline/index.html).
La versión oficial POV-Ray 3.5 no soporta cálculos de desenfoque por movimiento, pero existen algunas versiones modificadas (patched) que sí lo hacen.
También puede utilizar otras herramientas para hacer esto. Una manera de simular desenfoque por movimiento es calcular una animación pequeña y luego promediar las imágenes. Este promedio de varias imágenes puede hacerse con programas externos, como el programa Targa Averager (»http://iki.fi/warp/PovUtils/average/).
"¿Cómo puedo averiguar el tamaño de un objeto de texto / centrar el texto / justificar el texto?"
Puede usar las funciones min_extent() y
max_extent() (nuevas en POV-Ray 3.5) para obtener las
esquinas de la caja de acotación -bounding box- de cualquier objeto.
Aunque algunas veces este no es el tamaño real del objeto, para objetos
de texto debiera ser bastante exacto, lo suficiente como para alinear
el objeto de texto.
POV-Ray posee soporte interno para true type font -*. ttf- que le permite obtener texto 3D en sus escenas (ver la documentación acerca del objeto 'texto' -'text'- para más detalles).
También hay varias aplicaciones externas que pueden importar "true type fonts" -ttf, y que permiten que el usuario pueda manipular el texto. Uno de estos programas es Elefont.
Esta pregunta a menudo quiere decir "¿Cómo puedo hacer un objeto hueco, como un vaso con agua, jarra, etc?".
Antes de responder esta pregunta, déjeme explicarle algunas cosas acerca de cómo POV-Ray maneja los objetos:
Aunque la documentación de POV-Ray habla acerca de objetos "sólidos" y "huecos", esa no es la manera como realmente trabaja. "Sólido" y "hueco-vacío-" son términos un poco engañosos para describir los objetos. También puede hacer un objeto "hueco-vacío-" con el mismo indicador -hollow-, pero no es tan simple.
En primer lugar, POV-Ray sólo maneja superficies, no objetos sólidos 3D. Cuando se especifica una esfera, es en realidad una superficie esférica. Es solamente una superficie y no está llena con nada. Esto puede verse fácilmente poniendo la cámara dentro de la esfera o haciendo una abertura en un lado de la esfera con el indicador clipped_by (para que pueda verla por dentro).
La gente piensa a menudo que los objetos POV-Ray son sólidos, realmente 3D y con un material sólido que llena todo el objeto, porque realizan una 'difference' CSG a un objeto y parece como si el objeto es en verdad sólido. Lo que la 'difference' CSG hace realmente es cortar una parte del objeto y añadir una nueva superficie en el lugar de la abertura, lo que la cubre completamente, para que no se pueda ver dentro del objeto (esta nueva superficie es realmente la parte del segundo objeto que está "dentro" del primer objeto). De nuevo, si mueve la cámara hasta dentro del objeto, verá que es realmente vacío y que el objeto es sólo una superficie.
Entonces qué es todo esto acerca de "sólidos " y "vacíos " de los que habla la documentación, y para qué se usa el indicador "hollow"?
Aunque los objetos son realmente superficies, POV-Ray los maneja como si fueran sólidos. Por ejemplo, niebla -fog- y media no van dentro de los objetos sólidos. Si coloca una esfera de vidrio en la niebla, verá que no hay niebla dentro de la esfera.
Si añade el indicador "hollow" al objeto, POV-Ray no lo manejará más como un sólido, para que la niebla y media puedan invadir el interior del objeto. Esta es la razón por la cual POV-Ray genera un alerta cuando pone la cámara dentro de un objeto que no es vacio -non-hollow- (porque, tal como lo dice, niebla y otros efectos atmosféricos pueden no comportarse como lo espera).
Si la escena no utiliza ningún efecto atmosférico (niebla o media) no hay ninguna diferencia entre un objeto "sólido" o "vacio".
Por eso todos los objetos en POV-Ray son huecos. Pero la superficie de los objetos es siempre infinitamente delgada, y hay una sola superficie. En los objetos huecos del mundo real siempre hay dos superficies: una externa y otra interna.
Los usuarios se refieren a menudo a esta clase de objetos cuando inquieren acerca de objetos huecos. Esta clase de objetos se logran fácilmente con una operación CSG de diferencia -difference-, como esta:
// Un simple vaso de agua hecho una diferencia:
difference
{ cone { <0,0,0>,1,<0,5,0>,1.2 }
cone { <0,.1,0>,.9,<0,5.1,0>,1.1 }
texture { Glass }
}
El primer cono delimita la superficie externa del vidrio y el segundo cono delimita la superficie interna.
Como se describe en la pregunta anterior acerca de "objetos huecos", éstos tienen siempre dos superficies: una externa y otra interna. Si tomamos el mismo ejemplo, un vaso sencillo sería asi:
// Un sencillo vaso de agua hecho con una diferencia:
#declare MyGlass=
difference
{ cone { <0,0,0>,1,<0,5,0>,1.2 }
cone { <0,.1,0>,.9,<0,5.1,0>,1.1 }
texture { Glass }
}
El primer cono delimita la superficie externa del vidrio y el segundo cono delimita la superficie interna.
Si queremos llenar el vaso con agua, tenemos que hacer un objeto que coincida con la superficie interna del vaso. Tenga en cuenta que para evitar el problema de superficies que coinciden, debe escalar el objeto "agua" justo un poco más pequeño que la superficie interna del vaso. Sería algo parecido a esto:
#declare MyGlassWithWater=
union
{ object { MyGlass }
cone
{ <0,.1,0>,.9,<0,5.1,0>,1.1
scale .999
texture { Water }
}
}
Ahora el vaso está lleno de agua. Pero hay un problema: Hay demasiada agua. El vaso debería estar lleno sólo hasta cierto nivel, que debería ser definible. Bueno, esto se hace muy fácil con una operación de CSG:
#declare MyGlassWithWater=
union
{ object { MyGlass }
intersection
{ cone { <0,.1,0>,.9,<0,5.1,0>,1.1 }
plane { y,4 }
scale .999
texture { Water }
}
}
Ahora el nivel del agua se halla a una altura de 4 unidades.
No hay soporte directo para esto en POV-Ray, pero puede lograr resultados aceptables con el Object Bender de Chris Colefax (»http://www.geocities.com/SiliconValley/Lakes/1434/bend.html).
Algunos objetos pueden ser "doblados" modelándolos con otros objetos. Por ejemplo, un cilindro curvo puede hacerse más fácilmente (y más exactamente) usando la intersección entre un torus y algunos objetos delimitantes.
Puede resultar un poco extraño qué la mayoría de los renderizadores soporten el doblado de objetos, mientras que POV-Ray no. Para entender esto, uno debe conocer cómo funcionan esos otros renderizadores (los llamados "scanline-renderers"):
En los llamados "scanline renders" todos los objetos son modelados con mallas de triángulos (o con sólidos básicos , primitivas como las NURBS y parches bezier que pueden convertirse fácilmente a triángulos). El "doblado" es, de hecho, logrado al mover los vértices de los triángulos.
En este contexto el término "doblado" es engañoso. Estrictamente hablando, el doblar una malla de triángulos también doblaría a los mismos triángulos, no sólo los vértices. Ningún renderizador puede hacer esto. (Puede simularse, sin embargo, dividiendo los triángulos en otros más pequeños, y así el efecto del "doblado" sería más aproximado, aunque no perfecto.) Lo que estos renderizadores hacen no es un doblado real en un sentido matemático estricto, sino solamente una aproximación que se logra por el movimiento de los vértices de los triángulos.
Esta diferencia puede sonar irrelevante, porque el resultado de esta clase de "falso" doblado frecuentemente luce tan bien como un doblado "verdadero". Sin embargo, no es irrelevante desde el punto de vista de POV-Ray. Esto es porque POV-Ray no representa los objetos mediante triángulos, sino que son verdaderas superficies matemáticas. POV-Ray no puede "simular" un doblado moviendo vértices porque no hay vértices a los cuales mover. Practicar el doblado ( y otras transformaciones no-lineares) requeriría el cálculo de la intersección de la superficie del objeto con una curva (en vez de una linea recta), lo que es bastante difícil y muchas veces imposible analíticamente.
Nótese que los objetos de isosuperficie (isosurface) pueden modificarse con funciones propias a fin de lograr toda clase de transformaciones (lineares y no-lineares) de manera que no están necesariamente ceñidos a esta limitación. Sin embargo, el logro de las transformaciones deseadas requiere algún conocimiento matemático.
Véase también la pregunta acerca de la variable ior.
"El desenfoque está muy granulado. ¿Me puedo deshacer de esa granularidad?"
Si. Ajuste variance a 0 (o a un valor muy pequño, como
por ejemplo 1/100000) y determine un valor para blur_samples
lo suficientemente grande. El renderizado se hará mucho más lento, pero
el resultado debería ser mucho mejor.
|