3.4.6  Objeto Texto

El objeto text es una primitiva que permite usar fuentes y colecciones TrueType para crear objetos de texto. Estos objetos se pueden usar en composición y transformarse en posición, tamaño y apariencia como cualquier otro objeto de POV-Ray.

En este tutorial haremos dos usos de este objeto. En primer lugar, colocaremos unas cuantas letras sobre un plano ajedrezado. Podemos usar cualquier fuente TTF, aunque en este tutorial usaremos timrom.ttf o cyrvetic.ttf, que acompañan a POV-Ray. Creamos el archivo textdemo.pov y escribimos:

  #include "colors.inc"
camera {
location <0, 1, -10>
look_at 0
angle 35
}
light_source { <500,500,-1000> White }
plane {
y,0
pigment { checker Green White }
}

Ahora, incluyamos el objeto de texto. Usaremos el archivo timrom.ttf con la cadena "POV-RAY 3.5" De momento, haremos nuestras letras de color rojo. La sintaxis es muy sencilla. La primera cadena entrecomillada es el nombre de la fuente, la segunda es el texto que aparecerá en el dibujo. Los dos números decimales que le siguen son el grosor y el desplazamiento. El grosor determina el tamaño del bloque sobre el que están recortadas las letras. Los valores apropiados pueden estar entre 0.5 y 2. El desplazamiento es un valor que se añadirá al valor definido por la propia fuente para separar las letras. De momento se dejará a cero.

  text {
ttf "timrom.ttf" "POV-RAY 3.5" 1, 0
pigment { Red }
}

Al trazar esta escena a 200x150 -A, observamos que las letras se salen por la derecha de la imagen. Esto es así porque POV-Ray sitúa el texto de forma que la esquina inferior izquierda delantera de la primera letra coincide con el origen. Para centrarlo deberemos desplazar el texto en el sentido negativo del eje x. Pero ¿cuánta distancia? En la documentación vemos que la altura de las letras está entre 0.5 y 0.75 unidades. Si asumimos que la distancia entre una y otra ronda las 0.5 unidades, significa que la cadena en total tendrá unas 6 unidades (12 caracteres y espacios), de forma que trasladaremos el objeto 3 unidades en el sentido negativo del eje x.

  text {
ttf "timrom.ttf" "POV-RAY 3.0" 1, 0
pigment { Red }
translate -3*x
}

Mucho mejor. Ahora vamos a jugar un poco con los parámetros del objeto. En primer lugar, aumentaremos su grosor hasta un valor grande... ¡pongamos 25!

  text {
ttf "timrom.ttf" "POV-RAY 3.0" 25, 0
pigment { Red }
translate -2.25*x
}

Realmente, queda un tanto extraño. Devolvamos este valor a 1 e intentemos un valor diferente para el desplazamiento. Pongamos 0.1 en lugar de 0 y volvamos a trazar.

¡Un momento! ¡Las letras se desplazan en ángulo! ¡Esto no es lo que describe el manual! Parece que el valor de desplazamiento se aplica tanto en el eje x como en el eje y, en lugar de desplazarlas sólo en la dirección x. ¿Se necesita aquí un vector en lugar de un solo número? Probemos. Reemplacemos 0.1 por 0.1*x y probaremos de nuevo.

¡Ahora funciona! Las letras siguen en línea recta, aunque un poco más separadas de lo que estaban antes. Verifiquemos esta propiedad haciendo que las letras se desplacen en otra dirección. Cambiando 0.1*x por 0.1*y, observamos que las letras suben un poco al desplazarnos de izquierda a derecha, sin separarse horizontalmente más de lo que estaban. Ahora, probemos en el eje z. Reemplacemos 0.1*y por 0.1*z. Trazar esto supone una pequeña desilusión: no hay desplazamiento, sólo funciona en las direcciones x e y.

Acabemos nuestra escena dando a las letras una textura mejor, usando un valor mayor para el grosor, y añadiendo un pequeño desplazamiento vertical a nuestras letras. Para obtener un mejor resultado, usaremos una esfera celeste, adornaremos un poco nuestro plano y buscaremos una situación de la cámara mejor (trazamos la siguiente escena a 640x480 +A0.2):

  #include "colors.inc"
camera {
location <-5,.15,-2>
look_at <.3,.2,1>
angle 35
}
light_source { <500,500,-1000> White }
plane {
y,0
texture {
pigment { SeaGreen }
finish { reflection .35 specular 1 }
normal { ripples .35 turbulence .5 scale .25 }
}
}
text {
ttf "timrom.ttf" "POV-RAY 3.0" 25, 0.1*y
pigment { BrightGold }
finish { reflection .25 specular 1 }
translate -3*x
}
#include "skies.inc"
sky_sphere { S_Cloud5 }

Ahora, vamos a usar un objeto de texto en una operación CSG. Intentaremos crear un bajorrelieve en un bloque de piedra usando unas letras. Crearemos un nuevo archivo llamado textcsg.pov y escribimos lo siguiente:

  #include "colors.inc"
#include "stones.inc"
background { color rgb 1 }
camera {
location <-3, 5, -15>
look_at 0
angle 25
}
light_source { <500,500,-1000> White }

Y ahora, creamos el bloque de piedra. Lo queremos de ocho unidades de largo para centrar en su interior nuestra frase (POV-Ray 3.0), que mide alrededor de seis unidades. Lo haremos también de cuatro unidades de alto y una de grueso. Como queremos evitar una coincidencia accidental entre la superficie del bloque y la del texto, usaremos 0.1 en lugar de 0 para la coordenada z inicial. Finalmente, le damos una agradable textura de piedra escogida del archivo stones.inc.

  box {
<-3.5, -1, 0.1>, <3.5, 1, 1>
texture { T_Stone10 }
}

Lo siguiente es crear nuestro texto. Usamos el mismo objeto que en el primer ejemplo, sólo variando un poco el grosor y el desplazamiento.

  text {
ttf "timrom.ttf" "POV-RAY 3.0" 0.15, 0
pigment { BrightGold }
finish { reflection .25 specular 1 }
translate -3*x
}

Recordemos que, por defecto, el texto se coloca de forma que su cara frontal se apoya en el plano x-y. Como el frontal del bloque se inicia en z=0.1 y el grosor es de 0.15, resulta que nuestro texto penetra en la piedra un total de 0.05 unidades. Ahora, basta situar alrededor de ambos objetos una operación de diferencia y tendremos nuestro objetivo:

  difference {
box {
<-3.5, -1, 0.1>, <3.5, 1, 1>
texture { T_Stone10 }
}
text {
ttf "timrom.ttf" "POV-RAY 3.0" 0.15, 0
pigment { BrightGold }
finish { reflection .25 specular 1 }
translate -3*x
}
}
Texto excavado en piedra.
Texto excavado en piedra.

Lo trazamos a 200x150-A. Nos fijamos si se aprecia realmente la profundidad del texto. y su textura en oro brillante. Lo volvemos a trazar, esta vez a 640x480 +A0.2 para ver el resultado más claramente, pero seamos pacientes, porque esta imagen tardará algo de tiempo en estar lista.