jueves, 7 de junio de 2007

Blender y Phyton: programando en el lado oscuro

Buenas, he estado estas semanas llevando a la practica un algoritmo de remallado para la facultad.

El algoritmo lo he implementado como un script del conocido programa Blender, magnífico programa gratuito de edición 3D y para el código, el lenguaje Python.

Estas tecnologias eran nuevas para mi y la verdad, me ha costado algo "adaptarme" al tipo de codigo que uno genera con Python.


Y es que la documentacion que circula por Internet al respecto por lo general suele ser incompleta y poco precisa, incluso desde la especificación oficial que uno puede consultar desde el website oficial de Blender he detectad problemas de este tipo.

La verdad me ha dejado un sabor bastante amago la experiencia, pero como se que en el futuro, habrá gente en mi situación he decido publicar estos enlaces con tutoriales y redactar mis propios consejos. Creo que es un conocimiento que puede resultar realmente útil.

Enlaces
Consejos&Info
  • Mesh&Nmesh: Las clases de Blender Mesh y NMesh representan la malla de un objeto 3D, solo que la NMesh es una clase con lso dias contados pero ofrece una ventaja, si tenemos una escena animada en Blender en la que se modifica nuestra malla mediante una transformacion, la clase NMesh tendra la malla ya transformada, pero la clase Mesh NO. Tened en cuenta, como vereis en la especificación que los metodos son diferentes.

  • Listas de listas: para crear una lista de listas en Python hay que hacer un par de trapis. Por ejemplo, queremos crar una lista con coordenadas, y que cada posición de la lista se corresponda con la posicion del vertice en su estructura original haremos esto:

    ListaCoordenadas=[ ]
    for v in Mesh.verts:
    ListaCoordenadas.append(v.co)

    Si hicieramos un print ListaCoordenadas obtendriamos algo similar a esto:
    [ [0 , -1 , 2.76] , [2,-2.4 , 1] , ... ]

    Las listas de Blender son vomitibamente flexibles asi que podeis meter listas de listas de apuntadores, de palabras, un pupurri, etc.
    Señalar también que el metodo append añade un elemento al final de la lista, siemrpe al final, más info en el tutorial que os he facilitado.
  • Eliminar vertices, arestas o caras: las librerias de Blender, como se ve en la especificación permiten eliminar vertices, aristas y caras, pero hay una cosa que no te dicen, y es que, si tienes 50 vertices, y eliminas el 45, los vertices superiores (del 46 al 50) seran modificados y se decrementaran sus indices en una posicion:

    Vertices: ... 43 44 45 46 47 48 49 50 -> Eliminamos vertice 45 -> ... 43 44 45 46 47 48 49

    Problema! Si volvemos a referenciar el vetice 45, ahora sera el 46 de antes, y asi para todos los demas que tengan un indice >=45
    Ademas si accedemos al vertice 50, nos saldremos de rango.
    Este hecho genera unos problemas brutales si utilizamos estructuras auxiliares que se conectan a la maya mediante indices o si simplemente tenemos indices almacenados en una variable local
    Consejo importante, reactualiza todas tus estructuras/variables globales/locales si eliminas un vertice, cara o aresta y estabas indexandolos.
    Una buena solucion, si hemos eliminado el indice 45 y tenemos una variable local llamada vMolon:

    me.verts.delete( me.verts[45] )
    if vMolon >= 45:
    vMolon-=1

    Como vereis he metido me.verts[45] en vez del indice, y es que como dije, a pesar de lo que diga la especificación muchas cosas no hacen lo que deberían y es mejor pasarle el objeto MVert como he hecho directamente y adios problemas.
    La actualizacion de los indices es vital, porque no petara hasta que nos salgamos de rano y eso, puede simplemente no pasar y que el programa haga cosas raras y no tengamos ni idea y queramos suicidarnos de forma llamativa.

Bueno, de momento no tengo más consejos.

La experiencia no ha sido muy de mi agrado y es que la el lenguaje ya de por si no me convence, prefiero lenguajes mas estrictos como Java y C++ y tirar de librerias tipo OpenGL para aplicaciones 3D que sabes lo que hacen y no te dan sorpresas como es el caso de las librerias de Blender, que son algo asi como un expediante X que solo puede ser resuelto mediante paranoia y mucho cafe.

No hay comentarios: