nunca el 3d fue tan sencillo como con python y blender

Upload: aprender-libre

Post on 05-Apr-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/31/2019 Nunca el 3D fue tan sencillo como con Python y Blender

    1/550 Nmero 35 W W W . L I NUX- M A GA Z I NE . E S

    trar la misma escena: un cubo en el

    centro de la pantalla con una lmpara y

    una cmara en posiciones predefinidas.Blender arranca un intrprete que

    tiene acceso a sus propias libreras, y

    no son pocas! Para ello, comenzamos

    importando la librera Blender, que

    aglomera toda la funcionalidad que

    Blender nos ofrece. Esta librera alberga

    un enorme nmero de paquetes, los

    cuales nos permiten realizar cualquier

    accin posible desde nuestro programa.

    Como estamos comenzando con un

    ejemplo sencillo, slo importaremos los

    paquetes Curve, Object, Scene y Text3d.

    En Blender trabajamos con escenas,que es lo que vemos en la ventana

    donde aparecen los objetos tridimen-

    sionales. Cada escena contiene una

    extraer todo el poder de ese software

    que tanto ha costado crear.

    Blender escogi a Python, verRecurso [2], como lenguaje script, per-

    mitiendo que cualquiera con algunos

    conocimientos de 3D y programacin

    pueda hacer cosas realmente vistosas.

    Dedicaremos este artculo a crear una

    escena en Blender sin emplear en nin-

    gn momento el ratn slo con nues-

    tro cdigo fuente.

    Nuestra Primera Escena

    Comencemos con algo simple, digamos

    que queremos poner un texto cual-

    quiera en una escena de Blender; elcdigo se puede ver en el Listado [1].

    Para ello debemos arrancar Blender. En

    un primer momento siempre nos mos-

    Y

    ah qued Blender, ver Recurso

    [1], en medio del software

    libre, con grandes vtores porparte de sus ms acrrimos seguidores,

    esperanzados ante la posibilidad de

    poder disponer por fin de un software

    profesional de diseo 3D. Y encima

    libre!

    Se puede pedir algo ms? Pues s.

    Una vez que un software es libre pode-

    mos esperar que comience a adaptarse

    a los convenios del software libre. Uno

    de estos convenios es que si te da igual

    que la gente mire el cdigo fuente,

    entonces empotra algn intrprete de

    lenguaje en tu programa para que losque sean menos tcnicos puedan

    DESARROLLO Python y Blender

    Nunca el 3D fue tan sencillo como con Python y Blender

    PYTHON 3D

    Blender es la gran esperanza del software libre en cuestiones de grficos 3D. Software privado en sus inicios,

    este competidor de 3D Studio decidi cambiar su licencia para ser software libre y escogi Python como

    lenguaje de script! POR JOS MARA RUZ

    01 import Blender

    02 from Blender import Curve,

    Object, Scene, Text3d

    03 txt = Text3d.New(MiTexto)

    04 scn = Scene.GetCurrent()

    05 ob = scn.objects.new(txt)

    06 ob.makeDisplayList()

    07 txt.setText(Linux Magazineen Blender!)

    08 Window.RedrawAll()

    Listado 1: Nuestro holamundo

    Botn Derecho Seleccionar objeto

    Rueda Acercarse o alejarse de escena

    May + Rueda Desplazar escena arriba/abajo

    Control + Rueda Desplazar escena izquierda/

    derecha

    Control + Botn Izquierdo Seleccionar todos los objetosdel rea creada

    Control + Botn Derecho Mover objeto usando

    cuadrcula (a saltos)

    Tabla 1: Combinaciones

  • 7/31/2019 Nunca el 3D fue tan sencillo como con Python y Blender

    2/5

    Python y Blender DESARROLLO

    51Nmero 35W W W . L I NUX- M A GA Z I NE . E S

    serie de objetos posicionados en tres

    dimensiones. En estos objetos estn

    incluidos la cmara que nos muestra lo

    que veremos de la escena, as como

    luces que la iluminan. Sin luces no se

    vera nada, como en la realidad. Pordefecto se arranca con una escena en la

    que la cmara y una nica luz aparecen

    siempre en una posicin estndar. De

    hecho, cuando generemos un objeto

    aparecer, si no indicamos lo contrario,

    en el centro de la escena.

    En nuestro cdigo arranca creando

    un objeto de tipo Text3d, que generar

    un texto tridimensional con ancho, alto

    y profundidad. El objeto creado existe,

    porque lo hemos creado, pero no ser

    visible hasta que lo vinculemos a una

    escena. Por eso el siguiente paso con-

    siste en extraer la escena actual, la que

    estamos viendo en ese momento,

    mediante la funcin

    Scene.GetCurrent() . El objeto devuelto

    contiene toda la informacin que des-

    cribe la escena actual y adems incor-

    pora mtodos que nos permitirn mani-

    pularla. En nuestro caso slo queremos

    una cosa: aadir el texto que hemos

    creado a la escena. El mtodo

    objects.new() nos permitir hacerlo y

    nos devolver un nuevo objeto. La

    clase Text3d genera un texto tridimen-

    sional llamado Mesh, pero desde el

    punto de vista de la escena todo lo que

    hay son objetos con una serie de coor-

    denadas. El objeto devuelto al aadir el

    texto a al escena envuelve a nuestro

    texto para que, por ejemplo, podamos

    manipular sus coordenadas. Por el

    momento nos conformaremos con las

    coordenadas por defecto.

    Cdigo Python en BlenderMuy bien, ya sabemos qu aspecto ten-

    dr el cdigo, pero cmo lo cargamos?

    Para Blender una animacin o escena

    01 import Blender

    02 from Blender import Scene,

    Object, Mesh, Mathutils,

    Material, Camera, Lamp, World

    03 import random

    04 import math

    05 from random import *

    06

    07 escena = Scene.getCurrent()

    08 camara = []

    09 lampara = []

    10

    11 for objeto in escena.objects:12 print objeto

    13 if (objeto.getType() ==

    Camera):

    14 camara = objeto

    15 if (objeto.getType() ==

    Lamp):

    16 lampara = objeto

    17

    18 # tenemos la cmara

    19 # la ponemos en un sitio til

    20 camara.setLocation(18,-6,24)

    21 lampara.setLocation(18,-6,26)

    2223 def nuevo_color (r,g,b):

    24 c = Material.New()

    25 c.rgbCol=

    [(r*1.0)/255,(g*1.0)/255,(b*1.

    0)/255]

    26 c.setAlpha(1.0)

    27 c.setRef(0.8)

    28 c.setSpec(0.8)

    29

    30 return c

    31

    32 colores = []

    33 colores.append(nuevo_color(24,

    103, 122))

    34colores.append(nuevo_color(185

    , 228, 240))

    35

    colores.append(nuevo_color(116

    , 173, 17))

    36

    colores.append(nuevo_color(180

    , 48, 47))

    37

    colores.append(nuevo_color(253

    , 226, 45))

    38

    39 contador = 040

    41 def cubo (x,y):

    42 global contador

    43

    44 cajaMesh =

    Mesh.Primitives.Cube(.5)

    45 cajaMesh.materials =

    [colores[randint(0,len(colores

    )-1)]]

    46

    47 caja =

    escena.objects.new(cajaMesh,

    Cube + str(contador))

    48 contador += 1

    49 caja.setLocation(x, y,randint(0,20))

    50 caja.setSize(2, 2,

    randint(2,5))

    51

    52 coords = [(x,y) for x in range

    (0,10) for y in range(0,10)]

    53

    54 for coord in coords:

    55 cubo(coord[0],coord[1])

    56

    57 #Mostramos los nuevos

    elementos por pantalla

    58 Blender.Redraw()

    Listado 2: Un Mundo de Cajas

    Figura 1: Men de pantallas.

  • 7/31/2019 Nunca el 3D fue tan sencillo como con Python y Blender

    3/552 Nmero 35 W W W . L I NUX- M A GA Z I NE . E S

    der. El cuadrado negro con una cruz en

    su interior sera la cmara, el crculo en

    blanco con las tres flechas de colores

    (las 3 coordenadas x,y,z) sera la lm-

    para, y por ltimo tenemos nuestro

    texto.

    Todos los programas de diseo 3D

    son complicados de manejar. Hay que

    realizar muchas acciones con slo un

    ratn y un teclado. En particular nos

    interesa saber cmo podemos mover y

    rotar los objetos y tambin cmo des-plazarnos por el escenario. La Tabla [1]

    nos muestra todas las combinaciones

    que necesitamos, que junto a algo de

    paciencia nos permitir obtener las

    mejores imgenes.

    Pero cmo se sacan las imgenes?

    Pues es necesario renderizarlas, ya que

    el ordenador realiza los clculos para

    saber qu debe mostrar. Renderizar es

    el paso ms sencillo de todos, basta con

    pulsar la tecla F12, pero es el ms com-

    plicado para el ordenador. Depen-

    diendo de la escena puede tardar

    segundos o das! El resultado final ser

    el mostrado por la Figura 5.

    Renderizando Algo msComplejoEl modo de trabajo con Blender es el

    siguiente. Primero planteamos un esce-

    nario en el que dispondremos los obje-

    tos que necesitemos para nuestra

    escena. Una vez tengamos los objetos

    situaremos luces que emitirn de dis-

    tinta forma dependiendo de su tipo, y

    slo nos queda colocar la cmara en el

    punto desde el que queremos rodar.

    Nuestro programa situar en una

    escena una cantidad de cubos, o cajo-

    nes, de distintos tamaos y colores. De

    esta forma aprenderemos lo ms bsico

    de Blender y podremos seguir todo el

    proceso hasta la creacin de una ima-

    gen renderizada.

    Ahora renderizaremos una escena

    ms complicada, vase el Listado [2].

    Para ello rellenaremos un rea del espa-

    cio con cajas de distintos altos y colo-

    res. Pero esta ltima accin es ms

    complicada de lo que pudiese pareceren un primer momento. Colorear como

    si fuese un programa de dibujo es

    imposible en los programas como Blen-

    der, puesto que al existir distintas

    luces, el color de un objeto depende de

    sus caractersticas. Un objeto puede

    dejar pasar la luz, por ejemplo pense-

    mos en un cristal, o puede oponerse a

    que pase. Tambin puede absorber una

    se compone de una serie de fuentes.

    Podemos verlas en la Figura [1] al pul-

    sar sobre el men desplegable que se

    encuentra junto a Help.

    Hay 5 tipos diferentes de fuentes,

    pero el que nos interesa a nosotros es el

    quinto: Scripting. Una vez pulsemos

    en l, en la ventana aparecer un editor

    de texto como el que vemos en la

    Figura [2]. No nos debemos dejar enga-

    ar por su austeridad, posee un men

    en la parte inferior que nos permitiractivar el coloreado de cdigo fuente y

    seleccionar distintas opciones sobre

    cmo se ha de mostrar el texto.

    A pesar de ello, veo mucho ms

    cmodo trabajar en un fichero externo

    e irlo recargando cuando queramos

    verlo en accin. Casi todas las opciones

    de trabajo (cargar un fichero, guardarlo

    ) tienen combinaciones de teclas que

    nos permitirn trabajar sin emplear el

    ratn, lo que es de agradecer. Podemos

    cargar en este momento el cdigo del

    Listado [1] o escribirlo directamente(opcin para valientes). Y ahora qu

    hacemos?

    Podemos ejecutar el cdigo, o bien

    seleccionar en el men inferior File-

    >Run Python Script o, mi opcin pre-

    ferida, pulsar Alt-p Y si falla el script?

    Lo mejor es ejecutar Blender desde un

    terminal. De esta forma nos mostrar la

    salida del intrprete de Python en l y

    podremos comprobar si todo ha ido bien

    (ver Figura 3). Una vez ejecutado nues-

    tro programa aparecer una escena pare-

    cida a la que se muestra en la Figura 4.

    En ella podemos ver los elementos

    ms importantes de una escena Blen-

    DESARROLLO Python y Blender

    Figura 2: Editor Python.

    Figura 3: Salida por terminal.

  • 7/31/2019 Nunca el 3D fue tan sencillo como con Python y Blender

    4/5

    cantidad de luz y puede devolver el

    resto. Un espejo apenas absorbe luz y

    como resultado la devuelve al exterior.

    As que un objeto tiene un color, una

    transparencia, una capacidad de obser-

    var luz y una capacidad de reflejar luz.Todo esto es necesario para que Blen-

    der decida con qu color mostrar un

    objeto.

    MaterialesLa funcin nuevo_color() aisla todo el

    cdigo de generacin de materiales. Los

    materiales se crean mediante el mtodo

    New() de la clase Material. Lo cierto es

    que no es muy ortodoxo, por lo que

    debera haber una clase Material con la

    que poder generar un objeto directa-

    mente, aunque en Blender no es as,

    sino que es necesario usar New(). El

    objeto devuelto es el que representa el

    material de un objeto. Curiosamente, el

    color del material se selecciona asig-

    nando el color directamente a la variable

    rgbCol. Aqu hay que tener cuidado.

    Recuerdo que pas un buen rato hasta

    adivinar por qu todos mis objetos eran

    blancos: los colores se pasan como tri-

    pletas de valores entre 0 y 1. No se

    puede pasar un color en valores entre 0

    y 255, como normalmente se hace. Si sepasan de este modo Blender entender

    que el valor ser 1. Por eso, cuando paso

    el color a caja realizo la conversin apli-

    cando un pequeo truco. No podemos

    operar con un entero, 3, y un flotante ,

    5.3, Python se quejara. Esta es la razn

    por la que multiplico el nmero que me

    dan, que es entero, por 1.0, de forma

    que Python lo convierta en flotante.

    Ya tenemos un material con color,

    ahora necesitamos asignar valores de

    transparencia, con setAlpha() , de

    reflexin , con setRef(), y de specula-

    rity , setSpec() (para este ltimo tr-

    mino no hay una traduccin sencilla

    al castellano, se refiere a la capaci-

    dad de actuar como espejo). Todos

    estos parmetros se seleccionan

    empleando un nmero entre 0 y 1. Si

    queremos que los objetos aparezcan

    lustrosos necesitamos que devuelvan

    mucha luz, por lo que los valoressern altos. El canal Alpha, que es

    quien proporciona la transparencia,

    se considera abierto, deja que pase

    toda la luz, para un valor de 0.

    Almacenaremos los distintos mate-

    riales que creemos en una lista. El

    objetivo es poder seleccionar fcil-

    mente materiales al azar cuando

    creemos las cajas, de forma que la

    imagen muestra cajas de distintos

    colores.

    Las CajasTenemos dos posibilidades a este res-

    pecto. Podemos hacer uso de las fun-

    ciones que Blender posee y que permi-

    ten generar cubos con una sola lla-

    mada, o podemos crear las cajas emple-

    ando las funciones ms bsicas de

    Blender para s entender mejor cmo se

    crean los objetos. Comencemos por la

    va fcil. Vamos a crear cajas usando lafuncin Mesh.Primitives.Cube() sin pre-

    ocuparnos mucho de qu es un Mesh ,

    que veremos en otro artculo.

    El cdigo de generacin de las cajas

    lo hemos aislado, nuevamente, en una

    funcin a la que damos el original nom-

    bre de cubo. A esta funcin le pasare-

    mos dos parmetros, la posicin x e y

    de la caja. La tercera coordenada, z,

    nos la quedamos nosotros, porque la

    variaremos para cada caja que genere-

    mos.

    Aunque hemos dicho que ya veremoslo que es un Mesh en accin, ahora

    necesitamos saber lo que es. Un Mesh

    es un conjunto de vrtices, caras que

    forman estos vrtices y propiedades de

    estas caras. Un Mesh es informacin

    abstracta de un objeto. Puedo decir que

    una rueda mide tantos centmetros de

    radio sin que ello afecte, en un primer

    momento, a su situacin en el mundo.

    Podemos ver los Mesh como almacenes

    de informacin especfica y nica de un

    objeto. Por ello, cuando generamos el

    cubo lo hacemos con la funcin

    Mesh.Pr imit ives.Cube() de la librera

    Mesh. Hay muchas otras primitivas,

    Python y Blender DESARROLLO

    53Nmero 35W W W . L I NUX- M A GA Z I NE . E S

    Figura 4: Renderizado del texto.

    Figura 5: Linux Magazine en Blender.

  • 7/31/2019 Nunca el 3D fue tan sencillo como con Python y Blender

    5/5

    Cmara y Accin!Y de dnde sacamos la cmara y la

    lmpara? Obtendremos ventaja del

    hecho de que Blender, por defecto,

    siempre nos presenta la misma

    escena cuando lo arrancamos. Sabe-

    mos que hay un cubo (que no nos

    interesa), una lmpara y una cmara.

    Antes de la funcin nuevo_color()

    hay un cdigo que localiza tanto lacmara como la lmpara. Para ello

    invocamos el mtodo getCurrent() de

    Scene.

    Blender entiende que hay varias

    escenas posibles en nuestro diseo,

    de hecho, incluso hay varios mundos

    posibles para que podamos reutilizar

    nuestro trabajo. Podemos pensar en

    varios diseos para un mismo tra-

    bajo, en los cuales compartimos el

    mismo escenario, con la misma

    cmara o iluminacin, incluso es

    posible compartir el valor de la gra-vedad! Blender viene con un motor

    fsico para ello.

    Ya tenemos nuestro escenario, el

    que por defecto abre Blender. Los

    objetos de un escenario son de distin-

    tos tipos: cmaras, armaduras (perso-

    najes), curvas, lmparas, Podemos

    verlos todos en la documentacin del

    mtodo getType(), en el Recurso [3].

    Y es esta funcin la que nos va a

    decir de qu tipo es un objeto. Si

    sabemos que slo habr una lmpara

    y una cmara, con recorrer los obje-

    tos y localizar los que se correspon-

    dan con estos tipos nos basta. Una

    vez que tengamos ambas slo tene-

    mos que darles una posicin, como

    hicimos con las cajas.

    Cuando ejecutemos el cdigo se

    generar la escena, y al pulsar F12 el

    resultado ser el que aparece en la

    Figura 6.

    Conclusin

    El empleo de Python como lenguajescript en Blender abre un enorme

    mundo de posibilidades. Slo hemos

    araado las puertas de este mundo,

    que exploraremos en otros artculos.

    De hecho, nicamente hemos visto lo

    ms simple: poner objetos en un

    escenario. Pero Blender es much-

    simo ms que eso: podemos realizar

    animaciones con comportamiento

    fsico realista o personajes con mus-

    culatura. Son ya cientos los scripts

    Python que hay colgados en la web

    de Blender, ver Recurso [1], y quepodemos estudiar para aprender a

    crear las imgenes ms sorprenden-

    tes y vistosas. I

    como por ejemplo Cylinderpara cilin-

    dros.

    Con los datos del Mesh en un

    objeto y almacenados pasamos a

    asignar los materiales que componen

    ese Mesh . Al ser varios, se pasancomo una lista. En nuestro caso slo

    pasaremos un material por Mesh ,

    pero queremos que las cajas sean

    diferentes, por lo que usamos la fun-

    cin randint() de la librera random,

    que nos permite conseguir un

    nmero entero aleatorio dentro del

    rango que le pasemos como parme-

    tro. Emplearemos ese nmero para

    seleccionar un material al azar de la

    lista que creamos en el apartado

    anterior.

    Ya tenemos nuestro Mesh definido,

    ahora hay que posicionarlo en el

    espacio del escenario. Para ello invo-

    camos la funcin objects.new() del

    objeto escena. Para la escena, todos

    los elementos son objetos con una

    serie de parmetros comunes, como

    ya vimos antes. Ahora nuestro objeto

    ya existe en el mundo real de Blen-

    der. Pero an as hay que situarlo,

    por defecto aparecer en la coorde-

    nada (0,0,0), y darle un tamao. Los

    mtodos setLocation y setSize() seencargan de ello. Como queremos

    que las cajas se siten en posiciones

    ms o menos aleatorias, volvemos a

    recurrir a la funcin randint() para

    dar la altura a la que situamos el

    objeto y su propia altura. Situaremos

    los objetos a diferentes alturas, s,

    pero dentro de una cuadrcula. Cada

    objeto medir 2 de ancho por 2 de

    largo, y se irn situando en posicio-

    nes conocidas en los ejes x e y.

    Necesitamos posicionar los objetos

    como si estuviesen en un tablero,para que no se aplasten unos a otros.

    La manera que he escogido es crear

    una lista de coordenadas usando una

    lista de compresin. Esta lista, alma-

    cenada en la variable coords, guar-

    dar tuplas con las posiciones x e y

    de cada objeto dentro de la cuadr-

    cula que va desde la posicin (0,0)

    hasta la posicin (20,20). Con un

    bucle for recorreremos la lista cre-

    ando las cajas en las posiciones indi-

    cadas formando un tablero perfecto.

    Ya tenemos todos los elementos en

    su sitio o no? Nos faltan las luces y

    la cmara!

    DESARROLLO Python y Blender

    54 Nmero 35 W W W . L I NUX- M A GA Z I NE . E S

    DESARROLLO Python

    RECURSOS

    [1] Pgina de inicio de Blender: http://

    www.blender.org

    [2] Informacin general sobre el intr-

    prete Python de Blender: http://www.

    blender.org/education-help/python/

    [3] La clase Object de Blender: http://

    www.blender.org/documentation/244PythonDoc/Object.Object-class.

    html

    Figura 6: Renderizado de escena final.