15/9/14

Superficies, Breps y Mallas # 2 Tutorial

Para el segundo tutorial básico veremos como tratar con los componentes comunes para representaciones volumétricas. Es una aproximación carente de la necesaria teoría, pero cumple con la estrategia de estos tutoriales de dar a conocer lo antes posible los componentes y el proceso de diseño con Grasshopper. Si desea aprender más detalladamente consulte el manual de Grasshopper en español.

Puede descargar el archivo .gh desde aquí, pero se recomienda primero realizar este simple tutorial paso a paso y experimentando por uno mismo distintas posibilidades.



Superficies

Hay muchas formas de crear superficies como podrá comprobar en el archivo .gh de este tutorial. En este caso vamos a crear una superficie que nos servirá como base de un anillo, cuyos parámetros serán la talla, y el ancho superior e inferior. No se desanime si lo encuentra demasiado largo, ya que también veremos como empaquetar todo el guión en un único componente para reutilizarlo cuando se desee.




Para empezar, invocamos el componente Circle y extraemos sus parámetros, haciendo click derecho sobre ellos nos aparece un menú desplegable y pulsando "Extract parameter" (abajo de todo del menú desplegable) y también podemos cambiarles el nombre (en la caja de texto, situado en la parte superior del menú) por "plano" y "talla" respectivamente. Para visualizar en el componente, en lugar del icono, su nombre, haciendo click derecho sobre el centro del componente nos aparece otro menú desplegable y hacemos click sobre el icono situado a la derecha de la caja de texto (en la parte superior del menú). Nota* Esto sólo cambia este componente, para visualizar icono o nombre en el centro de todos los componentes, desde barra de archivo Display > Draw icons.

Invocamos también el plano XZ y lo enchufamos a "plano" y para el radio necesitamos un poco de matemáticas. En joyería existen varios sistemas de calibración de tallas según el país o la zona geográfica, es decir la forma en la que se relaciona la talla de un anillo con su radio. La fórmula para calcular la longitud de un anillo en países como España, Italia o Suíza es:

longitud circunferencia = 40 + Talla + 2*grosor, 

donde el grosor se refiere al espesor de la plancha de metal que formaría el anillo, el cual cuanto más grueso sea más costará doblarlo (creo que solo es una estimación de error, nada preciso sin duda), por lo que en este caso computacional podemos prescindir de la parte 2*grosor. Necesitamos despejar el radio, por lo que utilizamos esta propiedad del círculo:

 longtitud circunferencia = 2*pi*radio;

 esto nos lleva a que 2*pi*radio = 40 + Talla, por lo que:

 radio = (40+Talla) / 2*pi.

Veamos como hacer esto (conseguir el radio del anillo a partir de la talla) de dos maneras. La forma simple es usar los componentes de suma y división, los cuales están en la pestaña "Maths", ficha "Operators", componentes "Addition" y "Division". Usamos "Addition" para sumar el parámetro variable "Talla" que viene del slider, y añadimos un parámetro constante usando un panel que contenga el número 40, ambos los conectamos a "Addition", su salida será Talla+40. Este lo enchufamos a la primera entrada de "Division" y para su segundo parámetro de entrada añadimos otro parámetro constante con otro panel que contenga 2*pi. El resultado o la salida de "Division" será el radio que buscamos.
La otra forma de hacerlo es más elegante, usando el componente "Expression" en lugar de los otros cuatro, el cual está en la pestaña "Maths", ficha "Script". Al sacar este componente al lienzo, por defecto viene con dos parámetros de entrada, en este caso solo nos interesa tener uno, a si que si nos acercamos los suficiente a sus parámetros de entrada (haciendo zoom con la rueda del ratón o pulsando ctrl + mover el ratón arriba o abajo), veremos que nos aparece un circulito con un "+" y otro con un "-". Esta funcionalidad la tienen solo algunos componentes (como "Addition", "List item"...) y nos sirve para añadir o retirar parámetros, en este caso, retiraremos el segundo parámetro del "Expression" pulsando en el circulo con "-". Ahora solo tenemos un parámetro de entrada, al cual necesitamos cambiarle el nombre como he explicado antes, click derecho sobre el input, aparece menú desplegable, en la caja de texto en la parte superior escribimos "T" y pulsamos enter. Ahora hacemos doble click en el centro del componente y nos aparecerá una ventana para editar la fórmula, aquí escribimos (40+T) / (2*pi) y pulsamos aceptar. Tenga en cuenta que este componente da error si los parámetros de entrada no reciben ningún valor, simplemente enchufe el componente "Talla" que viene del slider al la entrada de nombre "T" del "Expression". De esta forma, el resultado del componente es el radio del anillo. Nota* el nombre del parámetro (en este caso "T") y el nombre de la variable usada dentro de la fórmula (40+T) / (2*pi), deben ser el mismo, ya que la letra "T" está haciendo referencia al valor que recibe en parámetro de nombre "T". 
El resultado de estas dos formas de hacer lo mismo deberían ser como en la siguiente imagen.



Por defecto, la costura de un círculo empieza en el eje positivo X. La costura es el punto inicial por el que empieza a contar parámetros internos, por ejemplo, el parámetro 0 es el punto más a la derecha de este círculo, el 0.5 es el punto más a la izquierda y el 0.75 es el punto más abajo de este círculo (siempre y cuando esté reparametrizado, sus parámetros van de 0 a 1) . Si extruyéramos este círculo, la costura de la superficie estaría situada al lado derecho en forma de línea de costura, para evitar esto, podemos situarla en la parte inferior con el componente Seam. Enchufamos este componente a Circle y reparametrizamos la entrada (click derecho>reparametrizar) y en el parámetro seam hacemos click derecho > Set Number y escribimos 0.25. Para comprobar el resultado, podemos utilizar el componente Evaluate Length con lenth = 0.



Ahora veamos como situar otro círculo con la distancia inferior y superior como referencia.
Primero vamos a hacer dos puntos arriba y abajo del círculo con el componente Evaluate Length y factores 0 y 0.5 (nota* si los valores los da desde un panel, tiene que desactivar Multiline Data; si lo hace desde un slider, puede hacer Internalise data en el parámetro del Evaluate, ya que no cambiaremos estos valores en ningún momento). Utilizamos el componente Move para mover estos puntos y la dirección será el eje Y (escriba en el lienzo Y y le aparecerá de primero en la lista). Al ser dos puntos que queremos que tengan valores distintos, debemos darle dos valores númericos para la distancia. Para ello creamos dos slider y dos componentes genéricos de números decimales, a los cuales les cambiamos el nombre por ancho sup. y ancho inf. y los enchufamos entre sí y al vector Y (para que estos valores coincidan correctamente con el punto factor 0 y factor 0.5 del círculo, hay que conectar primero el valor inferior (que se vincula con 0) y luego el superior (que se vincula con el segundo punto de la lista que devuelve Evaluate Length.
Como después de hacer el círculo haremos una simetría, tenemos que dividir los valores entre dos para corresponder correctamente la distancia, para ello en el input del vector Y, hacemos click derecho> Expression y escribimos x/2.


Ya tenemos la distancia superior e inferior que tendrá el círculo. Para llegar a él, utilizamos el método Circle CNR (Centro, vector Normal(perpendicular) y Radio). Para hacer el centro, solo tenemos que unir estos dos nuevos puntos en una línea y evaluar el factor 0.5 que nos dará un punto en medio de la línea. El componente move nos devuelve una lista con dos puntos y necesitamos un componente que extraiga cada punto en un output distinto para conectarlos al componente line. Podemos utilizar List Item, haciendo zoom en él hasta que nos aparezca un + para extraer otra salida. (este componente y los de su pestaña los veremos en el próximo tutorial).

Conecta las dos salidas de List Item a los parámetros de line y este conéctalo a Evaluate Length con un factor de 0.5. Además del punto, que será el centro del círculo, nos devuelve una tangente a la línea que tenemos que girar 90 grados. Para ello utilizamos el componente Rotate (vector). Conectamos el vector, como eje utilizaremos el componente Unit X y de ángulo le damos 0.5*pi.
Para el radio, simplemente medimos la distancia entre el punto que hará de centro con cualquier punto que movimos, utilizando el componente Distance. Conectamos los tres valores al componente Circle CNR y ya tenemos el círculo.

Ahora escriba en el lienzo, mirror y merge, para invocar el componente Mirror, el cual conectamos con Circle CNR y utilizamos el plano original del principio, y con Merge conectamos ambos círculos. Nos devuelve dos círculos en una única lista, que es lo que necesitamos para el componente Loft con el que haremos la superficie.

Ahora vamos a encerrar el script en un componente. Primero conectamos un componente genérico de superficie a la salida del loft y a su salida el componente Cluster Output. Selecciona todos los componentes excepto los parámetros de entrada y salida como en la imagen.
Ahora pulse click central del ratón y haga click en el icono superior con forma de caja. El resultado debe ser este.

Para guardar el componente en su barra de componentes, selecciónelo y valla a File> Create User Object. Le aparecerá una ventana para configurar el nombre del componente, la abreviatura, una descripción (opcional), la pestaña de componentes (si escribe una nueva le aparecerá una nueva pestaña), el grupo dentro de la pestaña, opciones de posición y el icono que se puede personalizar.


Yo ya tengo desarrollados más de 20 userObjects para joyería que lanzaré próximamente con el nombre de Peafowl.




Breps

Boundary REPresentations son polisuperficies que tienen distintos métodos que las superficies. Pueden ser abiertos o cerrados. Para este tutorial, seguiremos con el ejemplo anterior para hacer un anillo con perfil de media caña que convertiremos en brep cerrado.

Lo primero que haremos será invocar el componente Brep Edges para utilizar las curvas que quedaron encerradas en el cluster. Este componente separa las curvas desnudas, es decir, las que no tocan con ninguna otra superficie, y las interiores, en este caso sería la línea de costura.


En estas curvas extraemos con Evaluate Length el punto factor 0 (otra manera de hacerlo sería utilizando la línea de costura y el componente End Points). Sea como sea, necesitamos el componente List item para tener dos outputs con puntos separados como hicimos previamente. Para hacer el perfil, invocamos la curva Bezier Span, que se crea con dos puntos y dos vectores.

Conectamos cada punto en cada input y para los vectores necesitaremos los componentes Unit Z, Reverse y un slider para darle amplitud. Conéctalos como en la imagen.


Ya tenemos una sección/perfil y dos curvas que nos pueden servir de raíles con el componente Sweep2. Extraemos las curvas en diferentes outputs con List item y conectamos todo al componente.


Ups! Algo ha salido mal. Este es un error genérico al tratar de hacer superficies a partir de curvas. Se suele necesitar que las curvas tengan el mismo sentido o que sus costuras estén alineadas. En este caso, por haber hecho una simetría en el plano XZ, el sentido de la segunda curva se ha invertido y por eso no casan correctamente. Para solucionarlo, invocamos el componente Flip Curve, que cambia el sentido de una curva. El segundo input es opcional y requerido para este caso, guide, al que le damos una curva guía cuyo sentido hará invertir o no al resto de curvas de la lista. Por lo tanto, podemos seleccionar la primera curva para que nos sirva como guía con el componente List item. Tras conectarlo, podemos comprobar los cambios con el segundo output de Flip Curve, que nos avisará con un True de las curvas que si ha invertido. Tras ello, lo volvemos a conectar al Sweep y ya tenemos una nueva superficie.


Para unir superficies y breps utilizamos Join Brep. Conecta el Sweep al Join y para conectar la superficie del cluster, saca un cable de éste mientras aprietas Shift, verá que que la flecha del cursor cambia a verde con un + (en la imagen no se ve).

Ahora observe que ha pasado. Las superficies no se han unido porque cada una proviene de ramas diferentes (aprenderá acerca de las ramas, listas e índices en los siguientes tutoriales). Otra forma de notificarnos los datos que procesan los componentes es con Param Viewer, que nos da información sobre las ramas pero no sobre su contenido. Tiene otra opción de visualización (click derecho > Draw Tree). 

Para resolver esto, podemos aplanar la entrada del Join brep para que todos los datos pasen a una única lista. Haga click derecho en su input y seleccione Flatten. El resultado es un brep cerrado.





Mallas

Las mallas son representaciones volumétricas compuestas por caras de tres o cuatro vértices. En el archivo de ejemplo explicamos un poco más, pero aquí vamos a ver cómo suavizar el anillo que hemos creado.

Para convertir un brep en malla tenemos el componente Mesh Brep. Otra opción con componentes nativos es conectarlo al componente genérico de malla, pero el resultado no es el mismo, haga la prueba. Necesitará extraer las aristas con Mesh Edges.


Una forma espléndida de suavizar mallas es con el plugin para Grasshopper llamado WeaverBird, que puede descargar gratis desde la página de su desarrollador. De esta forma no solo subdividimos la malla, sino que suavizamos las aristas o bordes angulares. De esta sencilla manera se consiguen acabados orgánicos muy fácilmente.


Ahora veamos el resultado en Rhino. Para pasar geometría de Grasshopper a Rhino, recordamos que tiene que darle click central sobre el componente final y seleccionar cocinar (el huevo frito). Oculte todos los componentes en Grasshopper. En el visor de Rhino, en la pestaña del nombre de vista, haga click derecho y seleccione la visualización Rendered.



Ahora que ha visto un ejemplo para realizar un anillo, vea con calma el archivo de ejemplo de este tutorial que puede descargar desde aquí para conocer otras formas de crear superficies y mallas y experimente por sí mism@. Siéntase libre para compartir sus dudas o sugerencias en un comentario, sus dudas pueden ayudar a otras personas.


*********************************************************************************


El primer workshop de joyería generativa en España, impartido por dos expertos en Grasshopper: Rodrigo Carbajal, arquitecto y diseñador de interacción y Daniel Abalde, diseñador generativo de joyería y creador de Peacock. Los alumnos aprenderán a modelar algoritmos con Grasshopper, las habilidades de la joyería generativa y a renderizar e imprimir en cera sus propios diseños. Visita el enlace para más información.
*********************************************************************************

No hay comentarios:

Publicar un comentario