Introducción. Siempre me gustaron los castillos. Cuando comencé a modelar en 3D use una herramienta llamada Ray Dream Designer y el primer tutorial que hice fue haciendo un castillo. Era un pequeño y plano castillo, de texturas pobres, sin ventanas, etc. Lo que siempre me molestó de ese castillo fueron las planas y pobres texturas de las paredes, quizás si hubieran sido de distintos tonos de blanco y con piedras esquineras modelándolo. Los castillos de verdad tienen cada roca a la vista, rocas inexactas y rocas de distintos tamaños, etc. De lejos la textura era muy bien apreciable, pero no podías acercarte a ellas sin sentir vergüenza. También es difícil desmontar algunos bloques o agregarle daño de batallas. Siempre soñé construir un castillo apegado al escrutinio, pero las herramientas a la mano no bastaban, no pensaba construirlo bloque por bloque.
Renuncié a mi sueño por un tiempo, poniendo mi vista en nuevos programas y eventualmente saltando a Blender. Con la extensión del lenguaje Python mi sueño resurgió. Si la ordenador podía hacer todo el trabajo duro entonces yo solo tendría qué encargarme del diseño general y ver nacer mi trabajo. Busqué para ver si alguien ya había hecho esto antes, pero no pude encontrar nada cercano a lo que quería. Esto me confundió, pues parecía un problema simple para resolver. Más de 600 líneas de código después descubrí porque no era tan simple como yo pensaba.
Lo que sigue es mi primera incursión en la escritura Python y los resultados. Una sección de cómo usar los scripts viene primero seguido de una corta historia de la codificación y algunas cosas que aprendí en el proceso. Aún no estoy muy satisfecho con los scripts, pero resultan muy útiles y espero que sean muy útiles también para ustedes.
Usando auto albañilería. Vamos directo a la diversión. Si no lo tienes descarga la versión más reciente y ubícala en tu carpeta de scripts (normalmente Blender/.Blender/scripts). Para iniciar un script, abre una ventana de Scripts y elige scripts>wizards>automasonry, deberías llegar a ver algo como esto.
Es el GUI inicial. Si presionas en Make this wall acabaras con algo como en la figura 2.
Si no lo consigues necesitas instalar Python. Si eso no funciona necesitare arreglar el script. La encarnación actual te permite crear paredes con o sin ventanas rectangulares, puertas y crestería. El script genera dos objetos mallas, una pared y una lechada.
Todos los botones y opciones contienen ventanas repentinas explicadoras así que, puedes sentirte libre de usar el programa sin tener que leer todo este tedioso tutorial.
Si no te crees tan audaz aquí hay una explicación de todas las opciones del GUI.
Crea esta pared: Este botón genera la pared que conforma la opción que has seleccionado. Si hay una curva seleccionada la longitud de la pared se ajustara a la longitud de la curva y tendrá a la curva como un padre. Esto significa qué todas las características de la curva serán aplicadas a la pared en si. Si la curva es cerrada el script asumira qué se trata de un círculo perfecto. Si la curva no es un círculo entonces esa no será la longitud correcta.
Muro: Este ajuste gobierna el tamaño en general de la pared en la unidad Blender. La altura de la pared no incluye la cresta (ver Crenels).
Straight edges/Offset edges: Básicamente si quieres hacer una pared de loop cerrado usa offset de lo contrario straight.
Stones: esto controla el tamaño de las piedras. Depth también ajustara el espesor de la pared. Las piedras pueden exceder estos límites en los bordes, para hacer que todo calce, o debido al ajuste del peso de las rondas. Estos ajustes se deben a la línea central de la lechada, por lo tanto una larga Grout W reducira el tamaño de las rocas.
Bevel: El tamaño del bisel. Si se reduce a cero las piedras tendrán esquinas cuadradas lo que es perfecto para reducir el conteo poly-count.
Grout W: la anchura de la lechada, bastante sencillo.
Página 21:
Grout D: La distancia de la lechada con la superficie de las piedras. Esto se refiere a la profundidad, por lo que si hay una gran variedad en profundidad de la lechada será bastante atrás en las piedras más gruesas.
Row Weight: Esta opción ajusta en como el peso de las piedras afecta a la anchura de las mismas en aquella ronda. Valuaciones positivas son normales (piedras cortas, piedras anchas) pero valuaciones negativas son válidas también (piedras cortas, piedras estrechas) Usualmente la ajusto en 0.0 y 1 dependiendo de la aplicación.
Dor y Window: Ambas son casi lo mismo. Apaga y prende una ventana o puerta presionando su etiqueta correspondiente. La posición de la puerta es desde su origen hasta el centro de la puerta. La altura y anchura se ajustaran como esperes. Los espacios de las ventanas serán centrados entre los bordes, y los bordes de la puerta (en caso de haberlos). La cima de la ventana se ajustara a la altura de la puerta aún si las puertas están apagadas. Esto significa qué los dinteles de ambas tendrán la misma altura (generalmente cierto en arquitectura). El botón Angled bascula un ángulo a lo largo de los lados de la puerta/ventana, como estaría presente en una flecha de castillo. Generalmente las puertas no tienen ángulos así, pero los dejé como opción solo en caso de que los quieras.
Crenels: La cresta corona de las paredes. Tamaño, anchura y espacio de trabajo son lo contrario a las ventanas, ajustando el tamaño a las porciones de las rocas, no a las aperturas. Las cestas son siempre anguladas, aunque agregare una opción para controlar esto en el futuro.
Exit: Este botón enciende a los albañiles y te permite hacer el trabajo por tu cuenta. Muy útil si ya terminaste de crear las estructuras de piedra.
El script es muy rápido así que, puedes crear paredes muy largas si lo deseas, creo que la de la figura 3 tomó treinta minutos aproximadamente.
Algunas técnicas. Aquí tengo algunos trucos que descubrí. Sospeecho que los usuarios más laboriosos podrán descubrir muchos más.
Caminos: crea un pasillo alto, pared sin ventanas, puertas o cresta y ponlo para seguir una curva en axis Z. Resulta un pasillo, calle o carretera, ver la figura 4.
Haz de soporte: las crestas también pueden ser usadas para sostener hazes de castillos de múltiples historias, estructuras de defensa, etc. Ver figura 5.
Multipared: puedes construir una pared en múltiples segmentos, esto permite distintos tipos de puertas y ventanas juntos. El ejemplo anterior de los hazes juntando dos tipos de paredes una sobre otra.
Sub surf: este script automáticamente valúa todos los bordes a 0.5 lo que resulta en un buen resultado de subsurf.
Mezcla de texturas: renderiza el valor Z de la pared en una vista isométrica y guardalo como textura. Ahora puedes usar esto como un boteo o una textura para pared de pocos píxeles. Usando Offset Edges y los recortes correctos permiten un azulejo perfecto.
Deformador de curva múltiple: a menudo las paredes son cónicas o curvadas. Aplicando una curva deformadora Z-axis sobre una X-axis, pueden conseguirse muchos efectos de pared. Esto puede ser usado para conseguir paredes más realistas (ver el perfil curvo del ejemplo de caminos) o paredes más caricaturescas.
Espero que este script cumpla los sueños de muchos de ustedes de castillos más realistas, paredes de ladrillos, caminos, texturas, torres, y cualquier otra cosa qué quieras hacer. Quedare impresionado si me haces saber lo que has logrado. Hazme saber si te encuentras con alguna falla y trataré de corregirla a la brevedad.
Escribiendo el script. Si aún estas leyendo esto puede que estés interesado en saber cómo el script fue programado. El código esta decentemente bien documentado, así que, siéntete libre de jugar y experimentar con él. Aquí hay un pequeño fondo de cómo lo escribí y algunas lecciones que, aprendí. Algunas cosas son buena programación básica, otras son más relacionadas a Blender.
Antes de programar cualquier cosa debí aprender Python. En la escuela tomé un curso de computación, desde luego, y termine haciendo un poco de programación en mí tiempo libre, así que, había algunos fondos que construir. Esencialmente, todos los lenguajes de programación y expresión de progresión lógica, y Python no es diferente. Trabajé en el tutorial de inicio de Python, escribí unas pequeñas aplicaciones para jugar con algunas características y ponerme cómodo con la sintaxis. A este punto comencé a introducir en Blender algunas extensiones Python. Mi primer script de Blender tomó un objeto malla y creó cada posible polígono con las vértices existentes. No fue muy útil, pero sí divertido. También descubrí que puedes pegar Blender tratando de crear un objeto con muchos polígonos.
A este punto también examinaba muchos de los scripts de Blender. Aquí están las dos primeras cosas que aprendí de las extensiones Python.
Lección 1: has tu tarea. Esto es cierto en cada aspecto de la vida, y se aplica aquí también. Todos los tutoriales básicos de Python fueron invaluables y me ayudaron a estructurar un eficiente script. Mirando los foros de Blenderartisc.org también ayudó mucho. Si pones el esfuerzo en descubrir la forma correcta de hacer las cosas, alcanzaras tus metas muchos más fácil con el pasar del tiempo. Aprender Python antes de aprender el Python de Blender en verdad ayudó mucho.
Lección 2: Documenta tú código. Este es uno de los puntos más estresantes de la ciencia computacional, y también muy útil. Si alguien más quiere usar tú script no debería tener que lo que hace cada línea de código. Si creaste el script hace un mes o dos no recodaras todo lo que hace, créeme. Sé que es un lastre, sé que parece inútil. Por favor, oh por favor, documenta tú código. Cuando miraba documentación me ayudó inmensamente.
Una vez que termine unos pequeños mini-scripts en Blender empecé en el marcador de pared. Desde que el script progresaba de hacer planos cuadros de pared a complejas paredes con puertas, ventanas y características varias, noté algunas otras cosas.
Lección 3: programar extensiones Python no es tan difícil como parece. Los cuadros de extensiones en Blender incluyen algunas herramientas muy bien avanzadas que vuelven elemental la extensión de programación. Si tienes la idea para un script, y le tienes confianza a tus dotes de programador debes intentarlo.
Lección 3 Corolaria: Pero es más difícil de lo que parece. Debes estar preparado para la frustración. Aunque sea agradable, el Python de Blender está muy lejos de la perfección. La forma lógica en que funcionan las cosas es a veces (aunque desalentadora, más no siempre) como trabajaran. Estate preparado para perseverar en los puntos más duros. Mientras trabajaba en los scripts tuve otras tres ventanas abiertas.
El Script de Python hace referencia (accesible desde el interior de Blender en el menú de ayuda) al paquete de ayuda del menú Python y a los Scripts de los foros de Blenderartists, org. Estos 3, con mucha persistencia, podrán guiarte a través de tu temporada de problemas de scripting. Mientras el Script progresa de simple a complejo, me encontré a mí mismo descubriendo que mi arquitectura original era insuficiente o altamente ineficiente para lo que estaba tratando de lograr. Creo que rescribí cada función al menos una vez desde el principio. Inicialmente estaba usando el script Bevel Center para hacer el biselado, pero tuve que recodificar algunas partes para hacerlo funcionar desde una llamada exterior (lo que habría requerido descargar una alterada versión de Bebel center junto a Auto Masonry) y fue muy lento. Al final mordí mis balas y recodifique todos mis bloques de función básicas para incluir el biselado. Al principio del proyecto tenía tres formas de acercarme, las cuales abandone a los pocos días de comenzar a trabajar. Aquí está mi cuarta lección.
Lección 4: Se capaz de reconsiderar tus avances. Aunque esto signifique empezarlo todo de cero. Cada cierto tiempo da un paso atrás y di a ti mismo 2¿Está bien esta manera de seguir o existe una manera más favorable? . Si quieres hacer un buen script siempre opta por la manera favorable. A veces las cosas no resultaran como esperas, pero es mejor que no intentarlo para nada.
Aun tengo muchas ideas en mente para desarrollos futuros. También pienso que debere rescribir muchas estructura cuando vuelva al proyecto (en línea con lección 4). Sin embargo, cuando el script estuvo ya casi por terminar era hora de:
El GUI: escribir el GUI puede ser la parte más divertida o descorazonadora del proceso dependiendo en que tan bien manejes tus variables. Si agradablemente escribiste funciones y variables de comando, el GUI debería ir sobre ruedas. Escribir un GUI en Blender es muy fácil, y en verdad finaliza el Script. Por otro lado, no te sientas obligado a incluir cada característica en el GUI si no está bien soportado o no es confiable. Hay muchas características en AutoMasonry que son perfectamente funcionales en el código, pero no en GUI. Si tu código está bien documentado los códigos maestros podrán usarlo de cualquier manera y no incluir todas sus características en el GUI le evitara dolores de cabeza a los usuarios principiantes.
Mejoras futuras. Quisiera mejorar este script en muchas direcciones. Desafortunadamente mi tiempo es absorbido por otros proyectos actualmente. Aquí presento algunas mejoras que me gustaría agregar, si ustedes tienen otras en mente haganmelas saber:
Arcos: Actualmente las puertas y ventanas son de cima plana. Me gustaría agregarles a ambas arcos puntiagudos y redondeados. Esto requerirá significante recodificación de la arquitectura básica del script, pero pienso que lo vale.
Defectos: no todas las rocas son perfectas. Algunas rocas deberían tener esquinas faltantes, o trizaduras. Una versión anterior (mientras usaba Bevel Center) podía romper esquinas, pero no he agregado esta opción a su conversión de biselado interno. Agregar grietas sería mucho más difícil, pero creo que es posible.
Grout: Ahora mismo la lechada no es más que un segundo puesto de bloques debajo de las piedras. En superficies curvas esto crea problemas con la lechada en la qué algunas subsuperficies ayudan, pero no reparan.
Un verdadero algoritmo de piedra de lechada también requerida una mayor revisión del código, pero también creara un trabajo mejor terminado y permitirá biselar la lechada.
Más robustos puestos para puertas y ventanas: actualmente el GUI para puertas y ventanas es muy limitado. El script puede aceptar cualquier configuración de puerta o ventana, pero no puedo descubrir una forma de simplificar la interfaz. Si hay una forma de hacerlo que alguien me lo haga saber.
Ajustes persistentes: la capacidad de guardar los ajustes en un archivo volvería más fácil el ajuste de opciones. También volvería más fácil la creación de múltiples paredes con offset edges que hagan malla una con otra, o angular esquinas con bordes inter cerrados. Esto también requiere una profunda revisión de código.
Así que básicamente, cuando me vea con un par de semanas libres, rescribiré el script de una mejor manera. Cuando lo haga incluiré cualquier mejora qué me envíen al tiempo. Alternadamente, si alguien se siente audaz, lo invito a hacerle cambios al script por su cuenta. Estaré feliz de aprender todas las mejores que puedan hacerle, seguro hay muchas.
Espero que con este script muchos hagan realidad sus sueños de castillos realistas, paredes de ladrillos, caminos, texturas, torres, y cualquier otra cosa que se te ocurra. Estaré emocionado de saber en que lo están usando. Si te cruzas con alguna falla o desperfecto, házmela saber a la brevedad.
Taller publicado en Blender Art Magazine por Paul Sponer y traducido para foro3d.com.