Gracias por descargar este fichero de inclusión. Aunque este proyecto tenga ya algún tiempo por fin se ha convertido en la casi-terminada macro + documentación que tienes ante ti.
Para contactar con el autor de este fichero (sugerencias, correcciones, preguntas,
donativos en oro en bancos suizos), puedes escribir a CAT_MCR
[en] persistencia.org
Si has leído la versión en inglés de esta documentación habrás podido comprobar que el idioma no es precisamente mi fuerte, por lo que es más que probable que se hayan colado varios crímenes sintácticos o gramaticales. De todos modos espero no haber metido demasiados "all your base are belong to us", pero cualquier corrección o ayuda siempre es bien recibida (con gratitud garantizada).
El fichero conteniendo la macro CAT está incluido en la carpeta sourcecodes de la documentación, también puede descargarse "cat_es.mcr", una versión con los comentarios en español, o aquí, "cat.mcr" la versión en inglés.
For the english version of the documentation, please click here.
Esta macro permite convertir figuras, objetos CSG u objetos importados desde
otros programas (mesh) -como personajes de Poser- en un nuevo objeto
basado en celdas para The Persistence Of Vision Raytracer (POV-Ray),
utilizando una técnica vagamente similar a la tomografía axial
computerizada.
Las sobremacros incluidas en el fichero permiten un uso más sencillo de la macro principal para convertir-guardar o generar-cargar ficheros sin tener que aprender a manejar varios parámetros a la vez.
El objeto de entrada se subdivide en rodajas (pisos) intersecándolo
con una delgada caja que es desplazada hacia arriba mediante un bucle #while
(macro interna Scanner()). Luego la macro lanza una matriz de test
de intersección contra cada rodaja utilizando la función trace
y escribe la posición de la celda ocupada como el parámetro de
una macro interna (la macro interna C()) en un fichero de salida
definido por el usuario. En la fase de render se incluye el previamente guardado
fichero de datos invocando la macro C() con la posición
de las celdas y el parámetro Cell_Shape para formar el nuevo
objeto de salida.
El fichero de inclusión contiene:
Comprobar en la página web de la macro CAT en www.persistencia.org/cathelp/CAT_es.html
Comprobar en el grupo de noticias povray.general o en povray.international
del servidor news.povray.org
Escribir a CAT_MCR [at] persistencia.org
Copia el fichero de la macro en el directorio donde estén el resto de
ficheros de inclusión de POV-Ray o en el mismo directorio donde se quiera
trabajar. Después sólo hay que incluir el fichero en nuestra escena:
#include "cat.mcr"
Antes de usar la macro hemos de tener previamente declarado el objeto que vamos
a "escanear":
#declare MyThing = object {...} ;
Entonces podemos invocar la macro CAT() utilizando los siguientes
parámetros:
OBJ - nombre del objeto previamente declarado que va a ser
convertidoSubd - Número de subdivisiones verticales (rodajas o
pisos) en las reemplazaremos el objeto por celdas.Surfacells - on significa que sólo se registrará
la posición de las celdas situadas en la superficie del objeto, mientras
que off ajusta el modo de cálculo para procesar y guardar
la posición de todas las celdas que se hallan dentro del objeto.Status - este es un parámetro de interruptor; en la
posición 0 el objeto es procesado y la situación
de las celdas se guarda en un fichero - mientras que en la posición
1 la macro lee el fichero de datos previamente guardado y genera
el resultado en el mismo sitio en que estaba el objeto original."File_name.ext" - Una cadena de texto conteniendo
el nombre del fichero en que guardar o leer datos.Cell_Shape - directiva #switch conteniendo 20
preajustes de celdas, desde vulgares esferas a combinaciones aleatorias de
cajas y cilindros, blobs, etc...Cell_Scale - ajusta el radio de las celdas multiplicando su
tamaño por este valor.// CAT (OBJ,Subd,Surfacells,Status,"File_name.ext",Cell_Shape,Cell_Scale)
CAT (My_Thing, 40, off, 0, "test01.txt", 0, 0)
/* Invocamos a la macro CAT para escanear el objeto My_Thing en 40 pisos,
procesando todas
las celdas dentro del objeto y guardar datos en el fichero "test01.txt"
luego...*/
CAT (My_Thing, 0, 0, 1, "test01.txt", 0, 1)
/* ...invocamos a la macro CAT para leer "test01.txt y generar algunas
pequeñas esferas */
Observa que en este ejemplo estamos invocando dos veces la misma macro: primero
para procesar y guardar el fichero, y después para leer el fichero
que se acaba de procesar y generar el resultado, pero no necesitamos hacer
esto cada vez que queramos usar la macro, gastando tiempo en procesar y escribir
siempre los mismos datos. Es más eficiente usar sólo una macro
cambiando el parámetro Status dependiendo de lo que estemos
haciendo, pero... ¿Por qué correr el riesgo de equivocarnos
mezclando parámetros y sobrescribiendo el fichero de salida reutilizando
parámetros que no sirven de nada? (p.ej. Cell_Scale y
Cell_Shape no afectan nada cuando estamos guardando la posición
de las celdas, mientras que OBJ, Subd y Surfacells
sólo están malgastando nuestro bonito código cuando se
están procesando los datos ya almacenados). Es hora de conocer a las
sobremacros.
Esta pequeña macro solo necesita cuatro parámetros para hacer funcionar la macro principal:
OBJ - Nombre del objeto previamente declarado,Subd - Número de subdivisiones verticales,Surfacells - (on) ¿Guardar sólo
la posición de aquellas celdas que se hallen en la superficie del objeto?
(off) ¿o todas y cada una de las celdas que estén
"dentro" del objeto?"File_name.ext" - Una cadena de texto conteniendo
el nombre del fichero donde guardar datos.// CAT_Save (OBJ,Subd,Surfacells,"File_name.ext")
CAT_Save (My_Thing, 35, off, "test05.txt")
/* Invocamos la macro CAT_Save para escanear My_Thing
en 35 "pisos" procesando cada celda y guardando datos en "test05.txt"
*/
Esta sobremacro servirá para leer un fichero de datos almacenado y seleccionar la forma de las celdas y su tamaño. Por lo que sólo necesitaremos estos parámetros:
"File_name.ext" - Una cadena de texto conteniendo
el nombre de fichero con los datos guardadosCell_Shape - elige que sub-objeto formará cada celda
para construir la nueva figuraCell_Scale - multiplica el tamaño de la celda por
este factor// CAT_Load ("File_name.ext",Cell_Shape,Cell_Scale)
CAT_Load ("test05.txt",14,1.25)
/* Invocamos la macro CAT_Load para cargar "test05.txt",
seleccionamos el preajuste de celda número 14 y re-escalamos su radio
a 1.25 */
Estos son todos los preajustes para Cell_Shape incluidos en la
macro CAT():
![]() |
El código de Cell_Shape puede ser tomado en sí mismo
como ejemplo para ser modificado o incorporar nuevas celdas.
|
|
Aviso: si deseas modificar
por tu cuenta esta sección de la macro ten en cuenta que el preajuste
13 "debe" conservarse como un objeto blob debido
a su particular sintaxis. |
Veamos algunos ejemplos básicos para ver el funcionamiento de los parámetros (click en imágenes para agrandar):
|
Primero definimos un fondo muy simple y definimos un objeto (My_Thing) situándolo en el lado derecho |
|
|
Fuente : CAT_examp_01.pov
|
|
|
Invocamos a la macro CAT_Save() incluyendo el fichero |
|
|
Fuente : CAT_examp_02.pov |
|
|
Veamos la nueva forma llamando a la macro |
![]() |
|
Fuente : CAT_examp_03.pov |
|
|
Una vez escaneado y convertido el objeto original no es necesario seguir
incluyéndolo en la escena. Borramos cualquier referencia y reutilizamos
el mismo fichero de datos con diferentes valores de |
![]() |
|
Fuente : CAT_examp_04.pov |
|
...o la misma forma Cell_Shape con diferentes
valores de Cell_Scale. |
![]() |
|
Fuente : CAT_examp_05.pov |
|
|
Nótese que el radio de las celdas se determina por el grosor de
los pisos, que se obtiene mediante el cociente: Altura_del_Objeto / N-Subdivisiones.
Por lo que: objetos de diferente altura e igual valor |
|
|
Fuente : CAT_examp_06.pov |
Por defecto la macro CAT() no funciona con mallas importadas desde
Poseray (u otros) dado que
estos objetos no tienen un 'interior' definido, por lo que no pueden ser procesados
en los cálculos de intersección. Veamos que dice la documentación
de POV-Ray respecto a esto:
|
6.5.2.3.1 Mallas Sólidas |
Sabiendo esto, hay que recordar que DEBEMOS añadir la palabra
clave inside_vector seguida de un vector 3D a nuestro fichero de
inclusión para poder trabajar con mallas. Veamos un típico fichero
de inclusión generado por Poseray:
| Antes... | Después... |
|
|
|
|
union
|
antes de
inside_vector |
después de
inside_vector |
Eso es todo, sólo hemos de añadir un vector inside_vector
antes de utilizar la malla con la macro CAT() para obtener celdas
nuevas y frescas.
|
|
MUY MUY MUY IMPORTANTE: Ignorar u olvidar esta sección aumentará drásticamente el tiempo de parsing sin obtener ningún resultado. |
|
El problema con
Solución: Editar el fichero de inclusión generado, localizar las celdas "incorrectas" y eliminarlas. |
Subd por debajo de 90. Nuestro cerebro
puede hacerse una idea del objeto original con muy pocos detalles, incluso
un valor de 50 puede ser recomendable.Surfacells on toma más tiempo de proceso, pero ahorra
tiempo al renderizar. Mientras que Surfacells off ahorra tiempo
de cálculo, pero toma más tiempo a la hora de generar la imagen.CAT_Save()
dentro de una escena compleja con desenfoque, radiosidad o áreas de
luz. Una simple escena sin luces es suficiente para convertir figuras.