Construir un cuadrado a partir de una tortuga Logo 3D

En el ejercicio Un mesh de cuatro puntos - script python , se utilizaron cuatro coordenadas x,y,z como punto de partida para construir un cuadrado. Se guardaban en una lista llamada coords estas coordenadas y en una lista llamada faces se guardaban las lista que contienen los puntos que las definen.

En este ejercicio se utiliza una libreria llamada tortuga.py, esta libreria debe estar ubicada correctamente en las carpetas .blender (en caso de correr el programa sobre el sistema operativo linux), en mi caso personal este sería el path (camino),

lugar de ubicación /home/mherrero/.blender/blender-2.63-linux-glibc27-i686/2.63/scripts . Es importante ubicar este archivo tortuga.py sino tendremos un error.

El archivo tortuga.py es una clase llamada Tortuga, en nuestro caso creamos una tortuga en el espacio invocando de esta forma en el script t=Tortuga(), de este modo t tiene las propiedades del objeto Tortuga. Por ejemplo t.Andar(1) hace avanzar una unidad a la tortuga, la cual conserva las nuevas coordenadas que ocupa en el espacio. De igual modo puede Virar, Rolar o Cabecear en determinada cantidad de grados sexagecimales, ejemplo t.Virar(90) la tortuga se orienta a 90 grados de la dirección anterior.

Para entender un poco sobre la geometría de la tortuga, puede consultar estos enlaces:

Paraíso de LOGO.

EN EL PRINCIPIO ERA EL LOGO (MI VIDA CON EL LOGO por Eduardo E. Cavallo), blog.

La vida de un Genio, Seymour Papert, breve biografía.

Para entender mejor este ejercicio se copia a continuación el script que se utiliza, Usted puede copiarlo y pegarlo directamente en el espacio de texto en Blender y hacerlo correr. Si sabe como hacerlo consulte este ejercicio que lo guiará Primeros pasos para usar un script python en Blender

import bpy

from tortuga import Tortuga

coords=[] # lista donde se acumulan las coordenadas

faces=[] # lista donde se acumulan los puntos de las caras

t=Tortuga() # crea una nueva tortuga

t.Rolar(90)

def carga_coords():

coordenada=[]

coordenada.append(t.X)

coordenada.append(t.Y)

coordenada.append(t.Z)

coords.append(coordenada)

def andar(paso):

t.Andar(paso)

carga_coords()

#############

# Principal #

#############

i=0

while i < 4:

andar(1)

t.Virar(90)

i = i + 1

faces = [[0,1,2,3]]

me = bpy.data.meshes.new("cuadrado")

me.from_pydata(coords,[],faces)

me.update()

ob = bpy.data.objects.new('cuadrado', me)

ob.data = me # link the mesh data to the object

scene = bpy.context.scene # get the current scene

scene.objects.link(ob) # link the object into the scene

ob.location = [0,0,0] # scene.cursor_location

Analizaremos cada uno de los pasos que va dando este script.

import bpy

con esta línea importamos toda la libreria blender python

from tortuga import Tortuga

con esta línea importamos la clase Tortuga del archivo tortuga.py, que debe estar correctamente ubicado, como se recomendo más arriba.

En este directorio he puesto el archivo tortuga.py, es el único modo en que funciona (para los que usan Linux).

/home/mherrero/.blender/blender-2.65-linux-glibc211-i686/2.65/scripts/startup

El archivo tortuga.py lo puede bajar de esta página Archivos

t=Tortuga() # crea una nueva tortuga llamada t

t.Rolar(90)

Con esta línea hacemos rolar la tortuga para ubicarla correctamente en el plano x,y de Blender. Mis conocimientos actuales no me permiten hacerlo de otro modo.

def carga_coords():

coordenada=[]

coordenada.append(t.X)

coordenada.append(t.Y)

coordenada.append(t.Z)

coords.append(coordenada)

Esta es una función que nos permite cargar en una lista las coordenadas x,y,z del lugar donde se encuentra la tortuga en la lista coords mediante el método append, es un procedimiento un poco burdo tomar directamente las coordenadas de un objeto, dato que X,Y,Z (en mayúsculas) son variables globales y son suceptibles de hacer variar, por eso no deben usarse en el script. Se utiliza una lista coordenada que el método siempre la define como vacía coordenada=[] para poder ser reutilizada nuevamente cuando se invoque el método en otra oportunidad.

def andar(paso):

t.Andar(paso)

carga_coords()

Esta función es muy simple tiene como entrada la distancia a recorrer por la tortuga, de modo que después de recorrer esa distancia llama a carga_coords() y guarda en la lista coords las nuevas coordenadas.

i=0

while i < 4:

andar(1)

t.Virar(90)

i = i + 1

Definimos a i con valor 0, luego se hace avanzar y cargar las coordenadas con andar(1), se hace virar la tortuga 90 grados con t.Virar(90), de este modo la tortuga en su recorrido guarda las cuatro coordenadas de los puntos que definen la cara del cuadrado.

La unica cara se define como compuesta por los puntos 0,1,2,3

Tenga en cuenta que faces es una lista que contiene a su vez listas con los puntos que definen cada cara.

faces=[[0,1,2,3]]

Una vez que tenemos cargadas las listas coords y faces, creamos un objeto que va a contener estos datos.

me = bpy.data.meshes.new("cuadrado")

este objeto esta vacío, lo cargamos de esta manera.

me.from_pydata(coords,[],faces)

actualizamos los datos

me.update()

Creamos un objeto que llamamos cuadrado, que contiene los datos del objeto me.

ob = bpy.data.objects.new('cuadrado', me)

enlazamos los datos de me al mesh ob

ob.data = me # link the mesh data to the object

llamamos a la escena donde queremos que aparezca, en este caso la que esta activa.

scene = bpy.context.scene # get the current scene

Ponemos en esa escena al objeto ob, para hacerlo visible

scene.objects.link(ob) # link the object into the scene

Ubicamos al objeto ob con location en las coordenadas (0,0,0).

ob.location = [0,0,0] # scene.cursor_location

Imaginemos que la tortuga es una canoa, este sería su recorrido.

Algunos ejercicios extras:

intercale antes de la línea i=0 , esta línea t.Cabecear(45) y vea los resultados.

El cuadrado resaltado esta a 45 grados del anterior.

Si se anima haga un script modificando el anterior con donde dibuje 8 cuadrados en un giro completo.

Si no lo consigue no se desaliente, hay varias cosas que considerar, por ejemplo hacer otro loop y agregar una variable para incrementar el valor de los puntos de las nuevas caras.

O esta otra que solo tiene un agregado, t.Andar(1)

Queda abierto el desafió para los lectores. Espero comentarios.

Cualquier duda o dificultad que Usted tenga al realizar este ejercicio, la escribe en forma de carta a marioantonio.herreromachado at gmail.com, . Si tiene alguna inquietud o duda no cubierta por este ejercicio también lo comenta y lo incluiremos en esta página u otra si fuera necesario. Gracia por su visita.

Mario Antonio Herrero Machado