CAT.mcr Contenido de la Ayuda

1.0 Introducción

1.1 Descripción
1.2 Como funciona
1.3 Contenido
1.4 Donde buscar actualizaciones

2.0 Guía de instalación y uso

2.1 Utilización de la macro CAT()
2.2 La macro CAT_Save()
2.3 La macro CAT_Load()

3.0 Referencia Cell_Shape

4.0 Tutorial: Ejemplo básico

5.0 Trabajando con mallas (p.e. Poser)

5.1 El problema con inside_vector

6.0 Consideraciones sobre velocidad


1.0 Introducción

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.

1.1 Descripción

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.

1.2 Funcionamiento

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.

1.3 Contenido

El fichero de inclusión contiene:

1.4 Donde buscar actualizaciones

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


Volver Arriba

2.0 Guía de instalación y uso

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"

2.1 Utilización de la macro CAT()

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:

// 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.

2.2 La macro CAT_Save()

Esta pequeña macro solo necesita cuatro parámetros para hacer funcionar la macro principal:

// 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" */

2.3 La macro CAT_Load()

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:

// 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 */


Volver Arriba

3.0 Referencia Cell_Shape

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.


Volver Arriba

4.0 Tutorial : Ejemplo básico

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 "CAT.mcr" en nuestra escena. Guardamos el resultado de subdividir My_Thing en 20 rodajas procesando cada celda dentro del objeto y escribiendo la posición de las celdas en el fichero "test01.txt". Obsérvese que no hay ningún resultado visible en la escena...

Fuente : CAT_examp_02.pov

Veamos la nueva forma llamando a la macro CAT_Load() y equilibremos la composición situando el nuevo objeto a la izquierda de la imagen. ¿no es estupendo?. </irónico>

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 Cell_Shape...

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 Subd tendrán celdas de diferente tamaño, sin importar el valor que usemos para Cell_Scale. (Recuerda que Cell_Scale multiplica el tamaño de cada celda, no sirve para ajustar un radio determinado) Nótese también que el grosor de los pisos se utiliza en el cálculo del tamaño de la matriz para determinar el número de celdas en cada piso.

Fuente : CAT_examp_06.pov


Volver Arriba

5.0 Trabajando con mallas (p.e. Poser)

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
Los objetos malla (mesh y mesh2) se pueden usar ahora en operaciones CSG tales como diferencia e intersección, añadiendo para ello la palabra clave inside_vector, teniendo así definido un 'interior'. Esto únicamente funcionará bien con mallas que tengan un volumen completamente cerrado. Si las mallas tienen cualquier agujero, podría funcionar, pero el resultado no está garantizado.

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...

// [...]
#include "untitled_pov_mat.inc"
#declare Untitled=mesh2{
vertex_vectors{
18909,
<-0.0070828,0.435842,-0.01579>,
...
...
...

}
uv_mapping
}

// [...]
#include "untitled_pov_mat.inc"
#declare Untitled=mesh2{
vertex_vectors{
18909,
<-0.0070828,0.435842,-0.01579>,
...
...

}
inside_vector <0,1,0>

uv_mapping
}


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.

5.1 La cuestión con inside_vector

El problema con inside_vector es que los resultados no están garantizados. Dependiendo del vector utilizado la macro puede fallar y generar celdas inesperadas alineadas al vector inside_vector. Una pista: Los modelos a baja resolución parecen funcionar mejor que los de alta resolución (pero no siempre).


En este ejemplo la figura de la derecha (de un modelo de alta resolución de Poser 6) muestra muchas más celdas que el de la izquierda (modelo a baja resolución de Poser 4).

Solución: Editar el fichero de inclusión generado, localizar las celdas "incorrectas" y eliminarlas.



Volver Arriba

6.0 Consideraciones sobre velocidad


Volver Arriba