Sie sind auf Seite 1von 92

Proyecto Fin de Carrera

Ingeniera Tcnica de Telecomunicacin


Sonido e Imagen

DISEO Y DESARROLLO DE MDULOS BLENDER


EN PYTHON PARA EL MODELADO 3D
DE COLINAS A PARTIR DE MAPAS TOPOLGICOS

Autor
Andrea Lluch Cruz

Tutor
Pablo Suau Prez

Septiembre, 2008

DISEO Y DESARROLLO DE MDULOS BLENDER


EN PYTHON PARA EL MODELADO 3D
DE COLINAS A PARTIR DE MAPAS TOPOLGICOS

Escuela Politcnica Superior de Alicante

ndice

Captulo 1. Introduccin ............................................................................................ 5


1.1 Introduccin ...................................................................................................... 5
1.2 Objetivo del proyecto......................................................................................... 8
1.3 Descripcin de los captulos ............................................................................. 12

Captulo 2. Herramientas ........................................................................................ 13


2.1 Blender ............................................................................................................ 13
2.2 Python ............................................................................................................. 15
2.3 Interfaz de Programacin de Aplicaciones de Blender ...................................... 16
2.4 Scripts modeladores de rboles: Lsystem y Gen3 ............................................. 18

Captulo 3. Diseo y desarrollo del mdulo 1 ......................................................... 21


3.1 Programacin dirigida por eventos ................................................................... 21
3.2 Generacin de colinas ..................................................................................... 23
3.3 Deteccin de contornos .................................................................................... 23
3.3.1 Snakes o Active Contours.......................................................................... 24
3.3.2 Sistema de seguimiento de curva ............................................................... 25

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

3.3.3 Marching Cubes .........................................................................................27


3.4 Interpolacin ....................................................................................................33
3.4.1 Splines cbicos ..........................................................................................33
3.4.2 Resolucin del sistema de ecuaciones ........................................................34
3.5 Generacin de la malla .....................................................................................35
3.6 Mapa de alturas ................................................................................................37
3.7 Deteccin de bordes .........................................................................................38
3.7.1 Operadores de gradiente: Prewitt y Sobel ...................................................38
3.7.2 Algoritmo de Canny...................................................................................40
3.7.3 Procedimiento con barrido vertical y horizontal .........................................42
3.7.4 Comparativa de mtodos ............................................................................43
3.8 Texturizado automtico del terreno ..................................................................45
3.9 Creacin de rboles ..........................................................................................46
3.9.1 Texturizar un rbol.....................................................................................46
3.10 Distribucin de vegetacin por la superficie ...................................................47
3.10.1 Punto interior en un tringulo ...................................................................50
3.10.2 Algebra lineal: Planos en el espacio .........................................................51

Captulo 4. Diseo y desarrollo del mdulo 2 ..........................................................53


4.1 Programacin mediante eventos .......................................................................53
4.2 Visualizar mapa topogrfico .............................................................................54
4.3 Dibujar rboles .................................................................................................55
4.4 Exportar fichero de coordenadas.......................................................................57
4.5 Algunos detalles generales de implementacin .................................................58

NDICE

Captulo 5. Problemas encontrados ......................................................................... 59


5.1 Aprendizaje ..................................................................................................... 59
5.2 Implementacin ............................................................................................... 60
5.3 Algoritmos....................................................................................................... 63

Captulo 6. Manual de usuario ................................................................................ 69


6.1 Manejo del script o mdulo 1 ........................................................................... 69
6.2 Manejo del script o mdulo 2 ........................................................................... 74
6.3 Pruebas ............................................................................................................ 76

Captulo 7. Conclusiones .......................................................................................... 79


7.1 Conclusiones ................................................................................................... 79
7.2 Ejemplos de uso ............................................................................................... 80
7.3 Trabajo futuro .................................................................................................. 83

Referencias ................................................................................................................ 87

Captulo 1
INTRODUCCIN

El primer captulo presenta los aspectos principales del proyecto. En primer lugar se
exponen las motivaciones que han llevado a la realizacin de este trabajo y las
aplicaciones que se pretenden desarrollar. En segundo lugar se describen los objetivos
fundamentales y se completan con ejemplos reales. Por ltimo, se enumeran las secciones
en las que est dividida la memoria, junto con una descripcin de su contenido.

1.1 Introduccin
La realizacin de cualquier tarea infogrfica, ya sea para la creacin de
videojuegos, recorridos virtuales, infoarquitectura o presentaciones multimedia, requiere el
trabajo de profesionales en diseo, modelado y animacin que realizan los proyectos de
forma manual, y muchas veces sin aprovechar material previo. Pongamos por ejemplo el
estudio de varias montaas del mundo, de las cuales se tienen sus mapas topogrficos y se
necesita el modelo 3D ms exacto posible de cada una de ellas. Debido a que esta tarea es
muy lenta y complicada de realizar, es interesante conseguir una aplicacin que elabore los
modelos 3D y que se pueda utilizar para prximos estudios topogrficos. Es por ello que
este proyecto surge de la necesidad de acelerar o simplificar el proceso de creacin de
material infogrfico, convirtiendo tareas muy costosas en sencillas aplicaciones
automatizadas.

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

El estudio de la topografa de una zona determinada es un tema de gran importancia


ya que desde la antigedad el anlisis del relieve del terreno ha resultado necesario para
edificar y distribuir los territorios. Del mismo modo, un mapa topogrfico que ofrezca
informacin precisa sobre un cerro, vaguada, valle o cordillera, es imprescindible para la
construccin de vas, viaductos, redes acuferas, instalaciones de suministro elctrico y de
telecomunicaciones, etc.
El relieve de la zona de estos mapas se interpreta mediante curvas de nivel (curvas
que unen todos los puntos situados a una misma cota de referencia) o utilizando un
degradado de colores segn la altura. Ante un mapa topogrfico, y dada la naturaleza de su
representacin, una curva de nivel no puede ser en ningn caso abierta, ya que sera
incoherente por propia definicin. Al mismo tiempo, distintas curvas de nivel slo pueden
superponerse en caso de pendientes completamente verticales, y el cruce de las mismas
slo se podra dar por formas excepcionales de vaco bajo terreno en la naturaleza. Al ser
estas condiciones inusuales no son consideradas. La pendiente en una zona determinada,
viene dada por la separacin de los planos de cota y por la distancia horizontal sobre plano.
As, una distancia sobre plano de 10m reales con una separacin de planos de cota de 5m
resulta una pendiente del 50%. Por lo tanto, se deduce que una zona con poca pendiente
tendr una mayor separacin entre curvas de nivel que una zona con mayor pendiente.
Asimismo, se puede distinguir visualmente las curvas cerradas como zonas de depresin
(crteres, valles y vaguadas), o como cimas.
Gracias a la tecnologa actual, resulta relativamente fcil conseguir una descripcin
minuciosa del relieve del terreno mediante mapas topogrficos. Lo realmente difcil de
estos mapas es interpretarlos, o ms bien, conseguir una correcta visualizacin
tridimensional. Para solucionar dicha dificultad, en este proyecto se presentan dos
aplicaciones o mdulos. El primer mdulo se llama Modelado de colinas y distribucin de
vegetacin en su superficie y consigue una representacin en 3D in situ de una colina que
puede servir de ayuda a cualquier alteracin, estudio o proyecto que se quiera llevar a cabo
sobre ese terreno montaoso. Adems, nos proporciona otra opcin para distribuir
vegetacin en la superficie generada, con la que se puede conseguir un aspecto ms real. El
usuario tiene la posibilidad de elegir doce tipos de rboles distintos. Adems, dicha

CAPTULO 1. INTRODUCCIN

aplicacin requiere un fichero de coordenadas que se genera en el segundo mdulo. El


mdulo 2 se llama Creacin del fichero de coordenadas de los rboles y es una
herramienta que permite dibujar rboles en el mapa topogrfico y guardar sus coordenadas
en un fichero de texto de forma muy intuitiva y fcil. Estos rboles se pueden borrar y
mover, as como ir representando sus coordenadas en una ventana emergente.
Si hacemos un estudio de la multitud de programas de modelado en 3D que se
pueden encontrar en el mercado, Blender se convierte en el programa idneo para
conseguir los objetivos del proyecto, ya que es una herramienta grfica muy completa que
incorpora un intrprete Python muy prctico para la programacin de scripts y es software
libre, por lo que podemos modificarlo, distribuirlo y usarlo para cualquier propsito de
forma gratuita, en contraposicin a otras herramientas como 3D Studio, Maya o XSI.

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

1.2 Objetivo del proyecto


El objetivo del proyecto es desarrollar nuevos mdulos que permitan una
visualizacin directa, sencilla y precisa de superficies montaosas a partir de su mapa
topogrfico, mapa que no sera fcilmente comprensible sin un anlisis exhaustivo previo.
Dado que esta aplicacin tambin va dirigida a facilitar y reducir el trabajo del infografista,
se pretende una completa automatizacin de la tarea, siendo necesaria tan slo la
introduccin de unos datos simples por parte del usuario y una imagen .bmp. Dicha
aplicacin est orientada a simulaciones tridimensionales, tcnicas de cine, desarrollo de
videojuegos, as como cualquier otro uso. Cabe destacar que el desarrollo actual de la
aplicacin, incluye un emplazamiento virtual de vegetacin. Este cdigo, en caso de ser
mejorado y actualizado, brinda mltiples opciones prcticas de desarrollo en muchas
cuestiones, entre ellas el impacto medioambiental (deforestacin, incendios, efectos de la
minera y cantera, edificacin, etc.). Con la premisa de fomentar el uso de software libre,
se recurre al programa de modelado y animacin Blender, que es de cdigo abierto y
software libre. Acorde a dicha idea, se va a publicar la aplicacin en el repositorio de
programas libres de freshmeat[21].
Utilizando las herramientas de la aplicacin conseguida con el presente proyecto, la
imagen tridimensional obtenida se ajusta fielmente al modelo topolgico, proporcionando
una idea tan aproximada a la realidad como el propio mapa topolgico o topogrfico. Para
comprobar dicha precisin, a continuacin se presentan modelos con los volcanes Mauna
Loa y Mauna Kea de la isla de Hawi. El mapa topogrfico de la figura 1.1 se ha obtenido
de la pgina web Wikimedia Commons[19], donde se pueden conseguir mapas de alta
calidad en formato .SVG.

CAPTULO 1. INTRODUCCIN

Figura 1.1: Mapa topogrfico de la isla Hawi

A partir de la informacin que nos ofrece el mapa topogrfico de la isla de Hawi,


se consigue un mapa de curvas de nivel en blanco y negro para cada uno de sus dos
volcanes, el Mauna Loa y el Mauna Kea. Posteriormente, cada mapa se utiliza como
entrada en el script topogrfico implementado en este proyecto, obteniendo los resultados
que se muestran en las figuras 1.2 y 1.3. En dichos mapas, se ha considerado una
equidistancia de 250m, por ser las altitudes de las curvas de nivel mltiplos de 250.

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

El volcn Mauna Loa es uno de los ms activos de las islas Hawaianas. Este
volcn es el ms conocido por ser el ms grande de la Tierra, con un volumen
estimado en aproximadamente 75.000 km.

Figura1.2: Ejemplo del volcn de Hawi Mauna Loa

10

CAPTULO 1. INTRODUCCIN

El volcn Mauna Kea es vecino al Mauna Loa, y es uno de los cinco volcanes que
forman las islas hawaianas. El Mauna Kea es ms alto que el Mauna Loa, aunque
no llega a superar su volumen por no estar tan sumergido en la tierra.

Figura1.3: Ejemplo del volcn de Hawi Mauna Kea

11

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

1.3 Descripcin de los captulos


Para una mayor comprensin de la memoria, a continuacin se presenta una breve
descripcin de cada uno de los captulos.

Captulo 1 Introduccin. Expone el tema del proyecto y los objetivos que se


pretenden conseguir.
Captulo 2 Herramientas. Ofrece informacin sobre las herramientas empleadas en
la elaboracin de las aplicaciones o mdulos, todas ellas son de libre distribucin.
Captulo 3 Diseo y desarrollo del mdulo 1 Modelado de colinas y distribucin
de vegetacin en su superficie. Describe el cmo se llev a cabo el desarrollo, los
motivos y justificaciones de los algoritmos y mtodos que se han estudiado para la
realizacin del primer script.
Captulo 4 Diseo y desarrollo del mdulo 2 Creacin del fichero de coordenadas
de los rboles. Describe el cdigo fuente junto con las explicaciones de los
mtodos y distintos sistemas que se han utilizado para la realizacin del segundo
script.
Captulo 5 Problemas encontrados. Presenta las dificultades y complicaciones
ocurridas a lo largo del proyecto tanto a nivel de aprendizaje, como de
implementacin y de algoritmos.
Captulo 6 Manual de usuario. Proporciona la informacin necesaria para el
manejo de las opciones de la aplicacin.
Captulo 7 Conclusiones. Captulo final que concluye y propone posibles mejoras
del proyecto.
Referencias

12

Captulo 2
HERRAMIENTAS

En esta seccin se contemplan las herramientas utilizadas a lo largo del proyecto. En


primer lugar, se describe el programa de modelado 3D Blender, de gran importancia ya
que ha permitido que se cumplan todos los objetivos que se plantearon. A continuacin, se
habla sobre el intrprete Python y sobre la Interfaz de Programacin de Aplicaciones de
Blender en este lenguaje. Por ltimo, se introducen dos scripts generadores de vegetacin
escritos en Python y utilizados para crear los rboles del primer mdulo.

2.1 Blender
Blender es un programa especializado en el modelado y la creacin de grficos
tridimensionales. La ventaja que tiene con respecto a otros programas de 3D es que es un
programa multiplataforma, puede ser modificado al disponer de su cdigo fuente abierto y
es software libre, por lo que se puede descargar gratuitamente desde su web [1].
En la figura 2.1 se muestra la interfaz que se presenta al inicio de la ejecucin de
Blender. En dicha figura se puede ver la pantalla dividida en dos paneles, el ms grande es
la ventana 3D y el panel inferior es la ventana de botones, donde se pueden encontrar todas
las opciones disponibles para modificar los objetos de la escena 3D.

13

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

Figura 2.1: La interfaz de Blender

Blender utiliza primitivas geomtricas, curvas Bzier, NURBS, simulacin de


partculas, edita vdeo y audio, posee un motor de juegos, dispone de un render interno y
render YafRay, y tiene un intrprete Python para la creacin de scripts que permiten
extender las funcionalidades bsicas del sistema, de forma sencilla, sin necesidad de
modificar el cdigo fuente del programa. Todo ello hace que sea un programa muy
completo con el que se puede realizar proyectos muy competitivos y profesionales.
Asimismo su perfeccionamiento est en continuo avance y constantemente surgen nuevos
progresos. Precisamente porque su cdigo fuente es abierto, se puede participar aportando
mejoras en su desarrollo. Este tipo de mejoras se puede realizar de dos formas mediante
scripts y mediante plugins.

14

CAPTULO 2. HERRAMIENTAS

2.2 Python
Los scripts se realizan para ser ejecutados por el intrprete Python[5] que incorpora
Blender. El editor Python de Blender lo podemos ver en la ventana izquierda de la figura
2.2. Python fue diseado por Guido Van Rossum y es un lenguaje de programacin de alto
nivel, interpretado, interactivo y orientado a objetos. Un programa escrito en Python es
bastante ms corto que su equivalente en C. Adems, su lectura resulta ms fcil que si
utilizramos otros lenguajes de programacin. Python al igual que Blender est en
constante avance y ha experimentado un aumento muy significativo del nmero de
programadores y empresas que lo utilizan, entre ellas Google.

Figura 2.2: La interfaz de Blender con el editor Python a la izquierda

15

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

2.3 Interfaz de Programacin de Aplicaciones de Blender


Para el desarrollo de scripts es indispensable hacer uso de la API[2] (Interfaz de
Programacin de Aplicaciones) de Blender, que dispone de mdulos con libreras de
funciones en Python que nos permiten acceder a las propiedades de los objetos. Cada uno
de los mdulos que podemos encontrar en la API se ocupa de una funcin. As por ejemplo
si queremos manipular la malla buscaremos en el mdulo NMesh, y si lo que necesitamos
es mostrar mens, mensajes de advertencia o aadir botones la informacin la
encontraremos en el mdulo Draw, as como otros mdulos que nos permiten insertar
elementos en la escena, realizar transformaciones, buscar archivos en directorios, etc. En la
figura 2.3 se puede ver un diagrama de los mdulos disponibles en Blender.

16

CAPTULO 2. HERRAMIENTAS

Mdulo principal

Blender

Submdulos
Armature
BezTriple
BGL
Camera
Curve
Draw
Effect
Geometry
Group
Image
Ipo
Key
Lamp
Lattice
Lybrary
Material
Mathutils
Mesh
Metaball
Modifier
NMesh
Noise
Object
Registry
Scene
Sound
Text
Text3d
Texture
TimeLine
Types
Window
World
sys

NLA
Action

IpoCurve

MeshPrimitives

Pose
Coinstraint
ActionStrips
Radio
Render

Font

Theme

Figura 2.3: Diagrama de mdulos de la API de Blender

17

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

2.4 Scripts modeladores de rboles: Lsystem y Gen3


La utilizacin de un generador de vegetacin surge de la necesidad de modelar
rboles para distribuirlos por la superficie de las colinas generadas con nuestra aplicacin,
uno de los objetivos planteados en este proyecto. Se pueden destacar como scripts
generadores de rboles Lsystem[3] y Gen3[4]. Ambos son scripts para Blender basados en
gramticas[16]. Estos modeladores ofrecen la posibilidad de cambiar la curvatura del
rbol, su direccin, la longitud del ramaje, el volumen del tronco, la cantidad de hojas, etc.
Sin embargo, el resultado final del rbol es bastante diferente para cada generador. Con el
modelador Gen3 se puede conseguir rboles muy realistas. Adems, nos da la opcin de
elegir el tipo de copa del rbol, es decir, si tiene forma cilndrica, triangular y forma de
crculo. En la figura 2.4 se muestra un ejemplo obtenido en el modelador Gen3. En la
ventana de la derecha se pueden encontrar todas las opciones disponibles para generar los
rboles.

Figura 2.4: Generador Gen3

18

CAPTULO 2. HERRAMIENTAS

El script Lsystem resulta muy til porque genera el rbol y le aade textura, con lo
que nos evitamos de su texturizado posterior. Los rboles que se crean con Lsystem son
tambin bastante realistas, pero es mucho ms difcil conseguir buenos resultados porque
se debe conocer bien el funcionamiento de cada una de las opciones de la aplicacin.
En la figura 2.5 se muestra la interfaz que se presenta tras la ejecucin del
modelador Lsystem y la generacin de un rbol. En la ventana de la izquierda se puede ver
la vista de cmara y en la ventana de la derecha todas las opciones disponibles para generar
los rboles.

Figura 2.5: Generador Lsystem

19

Captulo 3
DISEO Y DESARROLLO DEL MDULO 1
MODELADO DE COLINAS Y DISTRIBUCIN DE
VEGETACIN EN SU SUPERFICIE
El captulo 3 describe el cdigo fuente junto con las explicaciones de los algoritmos,
mtodos y distintos sistemas que se han estudiado para la realizacin del primer script.
Este primer script tiene dos funciones. Por un lado, est dedicado a la obtencin
totalmente automatizada de una montaa en 3D, a partir de una imagen 2D de un mapa
topogrfico. Por otro lado, nos brinda la posibilidad de distribuir automticamente
vegetacin en la superficie montaosa. En la primera parte, el usuario debe introducir una
imagen de un mapa topogrfico de una colina y el script muestra una representacin
tridimensional de la montaa texturizada. En la segunda parte, el usuario debe
seleccionar qu tipo de vegetacin pretende colocar en las coordenadas dadas por un
fichero de texto, creado con el mdulo descrito en el siguiente captulo.

3.1 Programacin dirigida por eventos


El intrprete de Python incluido en Blender se basa en la metodologa de
programacin dirigida por eventos. En la programacin dirigida por eventos el intrprete se
encarga de ejecutar una funcin, llamada manejador, cuando el usuario efecta una accin

21

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

sobre la interfaz, como por ejemplo presionar un botn. Los eventos enlazan las acciones
del usuario con las funciones o manejadores asociados a dichas acciones.
La programacin con eventos es mucho ms sencilla y eficaz que la programacin
tradicional cuando se trabaja con interfaces grficas, ya que obtendramos un cdigo lleno
de condicionales y llamadas a funciones. Al comenzar la ejecucin del programa primero
se cargan todos los mdulos necesarios, a continuacin se llevan a cabo las inicializaciones
de los eventos y dems cdigo inicial, y finalmente se ejecuta la funcin Register, que se
encarga de trabajar con eventos.
Register se encuentra alojado en el mdulo Draw, por lo que antes ya se ha cargado
este mdulo. Register adems tiene tres parmetros, que son tres funciones que segn el
estado de los eventos relacionan las acciones del usuario con sus funciones
correspondientes. A la primera funcin de Register se le ha llamado GUI, por ser la
encargada de definir botones y textos para dibujarlos en el interfaz. Los botones y textos se
generan con el mdulo Draw. Event es la segunda funcin y es la que maneja los eventos
de teclado y ratn. La tercera funcin, bevent, ejecuta funciones segn los eventos
generados en las acciones del usuario. Por lo tanto, las funciones para cargar el mapa
topogrfico, cargar el fichero de texto, generar el terreno y distribuir vegetacin en la
superficie se llaman desde la funcin bevent, que es la que mayor control ejerce en el
script.

22

CAPTULO 3. DISEO Y DESARROLLO DEL MDULO 1

3.2 Generacin de Colinas


El resto del captulo se estructura de la siguiente manera: a partir de la seccin 3.2,
y hasta la 3.8, se describen los procesos necesarios para generar un modelo 3D de una
colina a partir de un mapa topolgico. Este proceso incluye la deteccin del contorno de la
imagen, el mtodo de interpolacin, la generacin de la malla, la deteccin de bordes para
mapas de altura y el texturizado de la colina. Desde la seccin 3.9 hasta el final se explica
cmo se crea y texturiza un rbol y los mtodos estudiados para distribuir vegetacin en la
superficie de la montaa.
Para la generacin de colinas se ha creado la funcin GenerarTerreno, que como se
ha dicho en el apartado anterior se llama desde la funcin bevent, y bevent a su vez la
activa si se ha presionado el botn Generar Terreno del interfaz.
El primer paso de esta funcin es cargar la imagen del mapa topogrfico, cuyo
nombre se habr introducido en un campo de texto. Consecutivamente, se procede al
anlisis del mapa para conseguir las coordenadas de los puntos de control necesarios para
generar la malla del modelo. Dichos puntos de control se obtienen detectando el contorno
de las curvas de nivel de la imagen.

3.3 Deteccin de contornos


Se deben detectar los contornos de las curvas de nivel con el fin de extraer los
puntos de control necesarios para generar la malla del modelo 3D. Existe una gran
variedad de procedimientos para detectar contornos en una imagen. Para seleccionar un
mtodo debemos prestar especial atencin a cmo son los contornos que pretendemos
obtener. En nuestro caso son diversas curvas de nivel dispuestas unas dentro de otras.
Dadas las caractersticas particulares de nuestro problema, debemos buscar el algoritmo
ms adecuado. Definitivamente se utiliz el algoritmo de Marching Cubes en la
implementacin final, aunque previamente se baraj la posibilidad de utilizar otros
procedimientos: un mtodo basado en Snakes o Active Contours, y un sistema de
seguimiento de curva mediante casos.

23

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

3.3.1 Snakes o Active Contours


El snake est definido por una lista de puntos v(s)=(x(s),y(s)) introducidos por el
usuario. Este contorno est representado por la suma de las energas de todos sus puntos.
Cada punto tiene dos tipos de energas de signo contrario: la energa interna que presenta la
elasticidad de la curva y su resistencia a la deformacin, y la energa externa que atrae al
snake a puntos con un alto valor de gradiente (los contornos de la imagen).

La energa interna consta de dos trminos. Vs (s) y vss (s) son las derivadas de
primer y segundo orden. La primera logra que el snake acte como membrana y la segunda
permite conseguir esquinas. Estos factores se ponderan con

, que representan la

tensin o elasticidad del contorno y la rigidez.

El trmino Eimagen est compuesto por varias energas: la energa de lnea se ve


atrada por zonas oscuras o claras de la imagen dependiendo del signo del factor de
ponderacin Wlnea, la energa de los bordes busca zonas de alto gradiente y la energa de
terminacin hace que el snake se vea atrado por esquinas o terminaciones finales de
segmento.
Eimanen= WlineaElinea + WbordeEborde + WtermEterm

24

CAPTULO 3. DISEO Y DESARROLLO DEL MDULO 1

Por ltimo, el trmino

representa una serie de fuerzas que permiten atraer al

snake a zonas concretas de la imagen. El mtodo de snakes, a da de hoy, se utiliza para


obtener el contorno de un slo objeto, pero cuando se buscan resultados distintos el
proceso se complica. Es por ello, que no es viable su implementacin para detectar los
contornos de las curvas de nivel interiores de un mapa topogrfico.

3.3.2 Sistema de seguimiento de curva


Tras analizar el mtodo anterior, se plante una tcnica de seguimiento de curva
que consiste en subdividir la imagen en rejillas para detectar los puntos de corte con cada
celda, y estudiar un sistema de seguimiento de curva a partir de unos casos definidos
previamente. Lo llamamos sistema de seguimiento porque realmente lo que realiza cuando
encuentra un contorno es continuar su camino por las rejillas hasta que se vuelve al punto
de partida y as sucesivamente con todas las curvas de nivel. En la figura 3.1 se representan
los casos que se definen. El punto verde es el punto que se ha hallado en el caso anterior y
el punto negro es el que se va a encontrar siguiendo el orden que marcan las flechas rojas.

Figura 3.1: Casos definidos en un sistema de seguimiento de curva

Para comprender el procedimiento nos podemos fijar en la figura 3.2, en la que se


muestra un ejemplo sencillo compuesto por dos elipses y dividido en 4x4 rejillas. En la
imagen se pueden ver los valores de los puntos de corte con las rejillas. Adems, en cada
celda se indica la direccin del recorrido de lectura de pxeles.

25

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON


Eje x: Ancho en pixeles
0

194

388

582

776

0
387; 12

193; 52

388; 12

582; 56
581; 56

194; 52
63; 152

704; 152

153

705; 153

Eje y: Alto en pixeles

62; 153
387; 245

388; 245

10; 305

343; 305

488; 305

757; 305

10; 306

343; 306

488; 306

757; 306

306
387; 360

388; 360

73; 458

694; 458

459
74; 459

193; 545

581; 541

194; 545
387; 585

388; 585

693; 459
582; 541

612
Figura 3.2: Mapa con la direccin de la lectura de los puntos de corte con las rejillas

Este sistema de seguimiento de curva est dispuesto para rejillas en las que hay dos
puntos de control, que son los puntos de interseccin de la curva con la rejilla. Si slo
hubiese un punto de control se podra contemplar aadiendo ms casos, pero si hay tres o
cuatro puntos de control no hay manera alguna de solucionarlo. Por lo que este sistema se
desestim al dar problemas en rejillas con tres y cuatro puntos de control. En la figura 3.3
se muestra un ejemplo de una rejilla con cuatro puntos de control.

26

CAPTULO 3. DISEO Y DESARROLLO DEL MDULO 1

Figura 3.3: Ejemplo de rejilla con cuatro puntos de control

3.3.3 Marching Cubes


Como en el caso anterior, la idea central del mtodo de Marching Cubes consiste en
dividir la imagen en celdas y detectar los puntos de corte con cada rejilla. De esta forma, se
pueden conseguir los puntos de control que nos permitirn obtener las curvas por
interpolacin. La divisin de la imagen se hace bajo la condicin de una curva por rejilla.
La diferencia con respecto al mtodo por casos es que con Marching Cubes podemos
encontrar dos tramos de la misma curva de nivel en una rejilla, como es el caso de tener
cuatro puntos de control.
Una vez se tiene la imagen subdividida, la informacin que interesa son los puntos
de corte. Para ello es suficiente con recorrer los bordes de cada celda. En la figura 3.4 se
muestra un ejemplo sencillo en el que se pueden ver los valores de los puntos de corte con
las rejillas. Adems, en la celda superior izquierda se indica la direccin del recorrido de
lectura de pxeles.

27

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

Eje x: Ancho en pixeles


0

194

388

582

776

0
193; 52
194; 52

387; 12

388; 12

582; 56
581; 56

704; 152

63; 152
153

Eje y: Alto en pixeles

62; 153

705; 153
388; 245

387; 245
10; 305
306

488; 305

343; 305

10; 306

343; 306

488; 306

387; 360

757; 305
757; 306

388; 360
694; 458

73; 458
459
74; 459
193; 545

194; 545
387; 585

581; 541
388; 585

693; 459
582; 541

612
Figura 3.4: Ejemplo de puntos de corte en un mapa sencillo de dos elipses

Para cada celda o rejilla se crea un objeto de tipo Rejilla, donde se guardan las
coordenadas de los puntos de corte. Las coordenadas del eje x se almacenan en el atributo
con terminacin .x, y las coordenadas del eje y en el atributo con terminacin .y. Los
primeros objetos que se obtienen en el ejemplo de la figura 3.4 se detallan a continuacin
junto con la imagen de la rejilla a la que se refiere.

Objeto Rejilla 1:

self.x = 193, 63

Objeto Rejilla 2:

self.x = 387, 194 self.y = 12, 52

28

self.y = 52, 152

CAPTULO 3. DISEO Y DESARROLLO DEL MDULO 1

Objeto Rejilla 3:

self.x = 581, 388 self.y = 56, 12

Objeto Rejilla 4:

self.x = 704, 582 self.y = 152, 56

Objeto Rejilla 5:

self.x = 62, 10

Objeto Rejilla 6:

self.x = 387, 343 self.y = 245, 305

self.y = 153, 305

A continuacin determinamos los puntos de control a partir de los puntos de corte.


La diferencia entre un punto de corte y un punto de control es que un punto de control tiene
un punto vecino en la celda siguiente, tal y como se puede observar en la figura 3.5. Como
se puede comprobar en dicha figura no todos los puntos de corte tienen un vecino en la
celda que le sigue.

29

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

Figura 3.5: Diferencia entre puntos de corte y puntos de control

El algoritmo lee las rejillas en cualquier orden para distribuirlas en listas de la


siguiente forma.
Si los puntos de control de la celda no tienen un punto de control vecino en ninguno
de los objetos de las listas generadas, esa rejilla se guarda en una nueva lista. Esto
nos indica que todava no se han ledo los tramos de curva que le suceden a esa
rejilla.
Si alguno de los puntos de control de la celda tiene un punto de control vecino en
otra lista, la rejilla se guarda en esa lista ya que es un tramo de de la misma curva
de nivel.
Si los puntos de control de la rejilla tienen varios puntos de control vecinos en
varias listas distintas, se unen esas listas ya que representan a una misma curva.

Los puntos de control que se van hallando se guardan en los atributos con
terminaciones .pcx y .pcy. El proceso que se sigue para ordenar los primeros objetos
Rejilla del ejemplo de la figura 3.4 se detalla a continuacin.

30

CAPTULO 3. DISEO Y DESARROLLO DEL MDULO 1

Lectura de la primera rejilla


Se guarda en la primera lista (Lista[0]).

Lista[0]:

Objeto Rejilla 1 (lista[0][0]): self.x = 193, 63 self.y = 52, 152

Lectura de la segunda rejilla


Se comprueba que uno de sus puntos tiene un vecino en la primera lista, por lo que
la rejilla se guarda en la misma lista.

Lista[0]:

Objeto Rejilla 1 (lista[0][0]): self.x = 193, 63 self.y = 52, 152


self.pcx = 193

self.pcy = 52

Objeto Rejilla 2 (lista[0][1]): self.x = 387, 194 self.y = 12, 52


self.pcx = 194

self.pcy = 52

A continuacin se leen las celdas sucesivamente hasta la quinta rejilla.

31

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

Lectura de la sexta rejilla


Los puntos del sexto objeto no tienen un punto vecino en ninguno de los puntos de
los objetos ya guardados en listas, el objeto se guarda en una nueva lista (lista[1]).

Lista [1]:

Objeto Rejilla 6(lista[1][0]): self.x = 387, 343 self.y = 245, 305

Posteriormente, se siguen los mismos pasos para el resto de objetos. Al finalizar el


procedimiento tendremos una lista de celdas por cada curva de nivel de la imagen. En
principio esta lista de objetos no sigue el orden de los puntos de ningn contorno sino que
dichos objetos se han creado consecutivamente conforme se han ledo las celdas. La
solucin para conseguir el orden requerido consiste en aprovechar la vecindad detectada
anteriormente y as hacer una conexin directa entre celdas y puntos de control. Es decir,
se sabe que cada punto de control tiene un vecino en otra rejilla y que a su vez habr otro
punto de control cuyo vecino estar en la rejilla que le sigue en la direccin de la curva. De
este modo a travs del primer punto podemos hacer un seguimiento por el resto de rejillas
obteniendo su orden final. El ltimo punto de la curva ser el que tenga vecindad con
puntos de la primera celda del contorno. Con esta tcnica se consigue una lista de
coordenadas por cada curva de nivel. Estas curvas de nivel estn establecidas en orden
creciente segn su altitud y sus puntos de control estn debidamente organizados.

32

CAPTULO 3. DISEO Y DESARROLLO DEL MDULO 1

3.4 Interpolacin
La interpolacin es el proceso mediante el cual obtendremos, a partir de los puntos
de control de una curva, una expresin analtica que nos permitir calcular cualquier punto
de la misma. Esto puede servir, por ejemplo, para dibujar dicha curva. En primer lugar, se
puede pensar que al elegir un nmero elevado de subdivisiones en el mtodo de Marching
Cubes se obtienen suficientes puntos de control y que no es necesario interpolar. Sin
embargo, para generar la malla necesitamos que todas las curvas de nivel tengan el mismo
nmero de puntos. Adems, a partir de la interpolacin podemos obtener ms o menos
polgonos en funcin del nmero de puntos y as controlar la precisin final del modelo.

3.4.1 Splines cbicos


Partiendo de las coordenadas de los puntos de control obtenidos mediante el
procedimiento de Marching Cubes pretendemos calcular una funcin interpolante que pase
por los puntos. De las tcnicas existentes se puede destacar la interpolacin polinmica y la
segmentaria. Con un mtodo de interpolacin polinmica como Lagrange o diferencias
divididas obtenemos un elevado nmero de oscilaciones para polinomios de alto grado.
Una posible solucin a este problema sera dividir el conjunto de puntos en varios tramos,
por lo que tendramos que usar interpolacin segmentaria. El mtodo ms utilizado de
interpolacin segmentaria es el conocido como splines. Se basa en aproximar las curvas
mediante ecuaciones de tercer grado.
El objetivo de la interpolacin es hallar dos funciones paramtricas x(t) e y(t), que a
partir de un parmetro t comprendido entre 0 y 1, proporcionen las coordenadas x e y de
cualquier punto de la curva. Cada intervalo [t 0,t1],[t1,t2],[tn-1,tn], est definido por un
polinomio diferente dado por:

33

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

En la expresin anterior, hi=ti+1-ti y zi son incgnitas. Para determinar sus valores,


se debe resolver un sistema lineal de n-2 ecuaciones e incgnitas.

+
+
+
.

Donde bi son los trminos independientes de la matriz y fi los valores de los puntos.

3.4.2 Resolucin del sistema de ecuaciones


En la resolucin del sistema de ecuaciones se pueden usar mtodos directos y
mtodos iterativos. Con los mtodos directos se consiguen resultados exactos y con
mtodos iterativos el coste computacional es menor y la solucin se va refinando
gradualmente. Como en nuestro caso lo que buscamos es una solucin exacta, y en
principio no es importante el coste, podemos hacer uso de un mtodo directo como es el de
Gauss-Jordan. Este mtodo se basa en realizar operaciones sobre sus filas y columnas
hasta conseguir una matriz equivalente que sea matriz identidad. Lo primero es elegir el
coeficiente que se utiliza para obtener ceros, tanto por arriba como por debajo de la
diagonal principal. En segundo lugar, se normaliza el valor de su fila dividiendo todos sus
elementos entre el valor del pivote. Como resultado cada fila obtendr directamente el
valor de una de las incgnitas.

34

CAPTULO 3. DISEO Y DESARROLLO DEL MDULO 1

3.5 Generacin de la malla


El terreno de la colina se genera con una malla que sigue la forma indicada en el
mapa topogrfico. Dicha malla est compuesta por caras que se unen y se crean mediante
vrtices y aristas. Las caras son polgonos de entre 3 y 4 lados. No obstante, si quisiramos
formar polgonos con ms de 4 lados podemos unir varias caras.
Para comenzar, se parte de una serie de coordenadas que definen cada curva de
nivel del terreno. Mediante interpolacin se ha conseguido la misma cantidad de puntos en
cada curva de nivel, por lo que los puntos calculados en cada curva son equidistantes. Se
consideran estos puntos como los vrtices con los que se generan las caras. A partir de
estos vrtices interesa formar caras de cuatro lados porque es ms fcil de implementar ya
que se generan menos polgonos. Por lo tanto, la tcnica consiste en unir vrtices dos a dos
de una curva con la que le sigue, tal y como se muestra en la figura 3.6.

Figura 3.6: Generacin de la malla a partir de los vrtices de curvas de nivel adyacentes

35

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

La superficie plana inferior y superior de la colina se crea con polgonos


triangulares, ya que es necesario aadir un vrtice central que es el punto de unin de todas
las caras de ese nivel.
Para crear y manipular la malla se hace uso del submdulo NMesh, que contiene las
funciones que dan acceso a sus propiedades. En primer lugar, se genera una malla vaca
mediante el mtodo GetRaw. Siguiendo los pasos que se han explicado en los prrafos
anteriores, se obtienen las coordenadas de los vrtices. Posteriormente, estos vrtices se
generan con el mtodo Vert de NMesh y se aaden a la lista de vrtices verts del objeto
malla vaco. A continuacin, se genera una cara mediante el mtodo Face de NMesh. Cada
objeto cara lo compone una lista de vrtices, por lo que debemos ir aadiendo los vrtices
de la lista verts correspondientes a cada cara.
El orden en el que se aaden los vrtices es muy importante y se ha tratado con
mucho cuidado, ya que en caso de no hacerse bien la cara podra deformarse e incluso
quedar con los vectores normales justo en el lado opuesto, no visualizndose correctamente
en el render final.
Al igual que con los vrtices, la cara generada se debe aadir a la lista de caras
faces de la malla originalmente vaca. Todos estos pasos se realizan para cada una de las
caras de la colina y considerando si el usuario ha seleccionado la obtencin de la malla de
la tapa inferior. Finalmente con la funcin PutRaw se lleva el modelo de la colina a la
escena de Blender.

Resultado con mapas de curvas de nivel


En la figura 3.7.B se puede ver una vista en planta de la colina en 3D formada a
partir de la imagen mostrada en la figura 3.7.A. La imagen se ha captado de manera que se
puedan reconocer todas las aristas que forman los polgonos del modelo. De esta forma
podemos comparar su coincidencia con las curvas de nivel del mapa topogrfico de la
figura 3.7.A. En este caso se ha hecho con una interpolacin de 32 puntos. Cuanto ms
grande sea el nmero de puntos ms se aproximar al modelo de la imagen original. Como

36

CAPTULO 3. DISEO Y DESARROLLO DEL MDULO 1

podemos comprobar con el nmero de puntos elegido el resultado se ajusta correctamente


a las curvas de nivel del mapa topogrfico. Si nos fijamos en la figura 3.7.C vemos que las
aristas se ven muy acentuadas. Para suavizar la malla podemos usar la herramienta Set
Smooth incluida en Blender y cuyos resultados se muestran en la figura 3.7.D en una vista
en perspectiva.

Figura 3.7: Ejemplo de mapa de curvas de nivel

3.6 Mapa de alturas


La idea inicial era realizar una aplicacin que de forma automatizada modele una
colina en tres dimensiones a partir de su mapa topogrfico. Sin embargo, en un mapa
topogrfico como el de la figura anterior el usuario tendra que introducir la altura de cada

37

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

curva o indicar la diferencia de altura entre pares de curvas. Lo realmente interesante es


que esto se haga con la menor intervencin posible por parte del usuario. Para ello se aade
la opcin de utilizar mapas de altura en niveles de gris, en lugar de mapas en blanco y
negro nicamente con las curvas.
Para obtener las alturas en un mapa de niveles de gris, partimos del nivel del mar
que lo definimos con el color negro. La altura mxima de la montaa se representa con el
color blanco y es un parmetro que debe indicar el usuario o vendr definido por defecto.
Una imagen en nivel de gris tiene sus tres componentes de color (R,G,B) con el mismo
valor. Como sabemos que el negro es el (0,0,0) y el blanco el (255,255,255) se puede
calcular a qu altura est cada curva de nivel con una regla de tres. Para cumplir los
requerimientos de la tcnica de Marching Cubes en la deteccin del contorno debemos
conseguir imgenes en blanco y negro(sin tonos de gris) con curvas de un pxel de grosor.
Para ello es necesario utilizar algn mtodo de deteccin de bordes.

3.7 Deteccin de bordes


Los bordes son encontrados en cambios bruscos de nivel de gris en la imagen. Las
tcnicas ms comunes para encontrar zonas de alto gradiente en una imagen utilizan
mscaras de convolucin, como es el caso de los mtodos de Sobel, Prewitt y Canny. El
resultado de estos mtodos es una imagen del mismo tamao que la original en la cual, el
color negro significa que ha detectado borde y el blanco que no lo ha detectado.

3.7.1 Operadores de gradiente: Prewitt y Sobel


La deteccin de bordes con operadores de gradiente se realiza en dos pasos. En el
primero se aplica una mscara de convolucin Gx para buscar bordes horizontales, y en el
segundo paso buscamos los verticales con la mscara de convolucin Gy. El resultado final
es la media de la suma de ambos. A continuacin se muestran las mscaras de convolucin
de Prewitt y Sobel, junto con los ejemplos 3.8 y 3.9. Dichos ejemplos muestran los bordes
detectados para cada mtodo.

38

CAPTULO 3. DISEO Y DESARROLLO DEL MDULO 1

Prewitt

-1

-1

-1

-1

-1

-1

Gx

Gy

Figura 3.8: Deteccin de bordes con el filtro de gradiente de Prewitt

Sobel

-1

-1

-1

-2

-1

Gx

Gy

39

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

Figura 3.9: Deteccin de bordes con el filtro de gradiente de Sobel

3.7.2 Algoritmo de Canny


El mtodo de Canny[20] consta de varias fases. Lo primero es suavizar el ruido
aplicando un filtro gaussiano. El segundo paso es convolucionar la imagen con un
operador de gradiente, por ejemplo el operador de Sobel. Posteriormente se calcula la
direccin del gradiente de la imagen y se aproxima a cuatro ngulos (0, 45,90,135) para
simplificar el algoritmo. A continuacin, se analizan los vecinos que se encuentran en la
misma direccin del gradiente en un entorno de 3x3, y se conservan como borde aquellos
que tengan mayor intensidad que sus vecinos. Por ltimo, se utilizan umbrales para definir
conjuntos de pxeles que forman parte de un borde. En la figura 3.10 se puede ver el
pseudocdigo del mtodo de Canny y en la figura 3.11 el resultado obtenido tras aplicar
dicho algoritmo.

40

CAPTULO 3. DISEO Y DESARROLLO DEL MDULO 1

Sea : Image_in una imagen de NxM


image _ x (i, j)
// Sobel X
image _ y (i, j )
// Sobel Y
Para cada (i,j)
// Magnitud y direccin del gradiente
Angulo(i,j)=arctan( image _ x(i, j) / image _ y(i, j) )* (180/pi)
Si Angulo(i,j) < 22.5
Angulo =0 //Aproximamos a cuatro direcciones
Si no Angulo(i,j) < 67.5
Angulo =45
Si no Angulo(i,j) < 112.5 Angulo =90
Si no
Angulo =135
image(i, j) =
fin
Pixel_izq= 0; //Analizamos los vecinos en la direccin del gradiente
Pixel_der= 0;
Para i = 2:N-1
Para j =2:M-1
Si Angulo(i,j) == 0 Pixel_izq= image(i, j +1) ;
Pixel_der= image(i, j +1) ;
Si no Angulo(i,j) == 45
Pixel_izq= image(i +1, j 1) ;
Pixel_der= image(i 1, j +1) ;
Si no Angulo(i,j) == 90
Pixel_izq= image(i +1, j) ;
Pixel_der= image(i 1, j) ;
Si no Angulo(i,j) == 135 Pixel_izq= image(i 1, j 1) ;
Pixel_der= image(i +1, j +1) ;
Si image(i, j) >= Pixel_izq & image(i, j) >= Pixel_der
image(i, j) =255;
Si no image(i, j) =0;
fin
fin
Para cada (I,j) // Definimos conjuntos de pxeles que forman parte de un borde
Si image(i, j) > t1
image(i, j) = 255;
Si no image(i, j) < t2
image(i, j) = 0;
Si no
Para (p=-1; p<2; p++)
Para (q=-1; q<2; q++)
num2 = image(i +p, j +q) ;
Si num2 >= t1
image(i, j) =255;
Si no
image(i, j) =0;
fin
fin
fin
Figura 3.10: Implementacin del pseudocdigo del mtodo de Canny

41

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

Figura 3.11: Deteccin de bordes con el mtodo de Canny

3.7.3 Procedimiento con barrido vertical y horizontal


Al tener una imagen en niveles de gris homogneos podemos hacer un barrido
vertical y uno horizontal para detectar los bordes, que son los cambios bruscos de nivel de
gris en la imagen. En primer lugar se hace un barrido vertical. Si detecta un borde se indica
con un pixel negro en la imagen de salida. En cualquier otro caso se vern pxeles blancos.
Consecutivamente se hace un barrido horizontal para detectar el nivel de gris en sentido
horizontal. Si detecta borde compara con la imagen obtenida en el barrido vertical. Si
arriba a la izquierda o arriba a la derecha hay un pxel negro ser borde y se aadir un
pxel negro a la imagen de salida. En la figura 3.12 podemos ver un ejemplo de deteccin
de bordes utilizando este proceso.

42

CAPTULO 3. DISEO Y DESARROLLO DEL MDULO 1

Figura 3.12: Ejemplo del mtodo por barrido

3.7.4 Comparativa de mtodos


Los mtodos basados en operadores dan muy buenos resultados en la deteccin de
bordes en imgenes complejas. Sin embargo, estas tcnicas dificultan la obtencin de
bordes de grosor de un pxel. Por otro lado, el procedimiento por barrido slo se puede
utilizar para imgenes donde todas las regiones sean homogneas y nos garantiza la
obtencin de curvas continuas de un pxel. Por lo tanto, como en nuestro caso tenemos
mapas topogrficos que cumplen con estas caractersticas, y adems interesa que no haya
bordes gruesos por el correcto funcionamiento de Marching Cubes, se ha implementado el
procedimiento por barrido. En la figura 3.13 se visualizan los resultados para ambos
mtodos.

Figura 3.13: Comparativa de mtodos de deteccin de bordes

43

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

Resultado con mapas de alturas


En la figura 3.14.B se representa una vista en planta de la colina generada en 3D.
Como se puede comprobar el resultado se ajusta correctamente al mapa de alturas de la
figura 3.14.A. En las figuras 3.14.C y 3.14.D se puede observar una vista frontal de la
colina. La figura 3.14.D muestra la superficie con Set Smooth activado.

Figura 3.14: Ejemplode mapa de alturas

44

CAPTULO 3. DISEO Y DESARROLLO DEL MDULO 1

3.8 Texturizado automtico del terreno


Para aumentar el realismo del modelado en 3D de la montaa se aaden opciones
para obtener un texturizado automtico. Para cargar las texturas y cambiar sus opciones de
iluminacin y repeticin, se utilizan los paneles de material(F5) y textura(F6) disponibles
en Blender. Por lo tanto, se ha cargado la textura, se han realizado renders y se ha dejado
el brillo y la repeticin que mejor resultado visual daban.

Figura 3.15: Texturas colina

Como puede verse en la Figura 3.15, las texturas del tipo 1, 3, 4 y 5 estn
preparadas para repetirlas tanto horizontalmente como verticalmente. La textura 2 slo se
puede repetir horizontalmente porque verticalmente no tiene similitud, ya que la parte
inferior tiene musgo o csped aadido. La textura 6 no se puede repetir, pero es lo
suficientemente grande y tiene la suficiente calidad como para que no sea necesario. Una
vez hecho esto, se le ha dado un nombre a cada material y se ha guardado con la opcin
salvar aunque no tenga un objeto usuario para que el material se mantenga guardado en el
bloque de datos de Blender. Si esta opcin no se utilizase, los materiales se borraran al
cerrar el programa por no ser utilizados por ningn objeto. A continuacin, se llama a cada
material desde el script con la funcin Get del mdulo Material.

45

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

3.9 Creacin de rboles


En la segunda parte del mdulo 1, el usuario debe seleccionar qu tipo de rboles
pretende colocar en las coordenadas dadas por un fichero de texto, creado con el mdulo
descrito en el siguiente captulo. Los rboles se generaron previamente con los dos scripts
generadores de rboles explicados en el captulo 2, ya que dan muy buenos resultados y
simplifican el proceso de trabajo de realizar el modelado manualmente.

3.9.1 Texturizar un rbol


En este apartado se explican de un modo general los pasos a seguir para texturizar
adecuadamente los rboles generados con Gen3. Lo primero es crear un atlas de texturas
en el que se incluyan las hojas y cortezas del rbol, tal y como se muestra en la figura
3.16.1 (esta imagen fue la que se hizo para el script). Este atlas de textura, debe llevar
implcito un canal alfa que indique en color negro las partes transparentes, como se puede
ver en la figura 3.16.2.

Figura 3.16: Atlas de textura de hojas y tronco en color y con canal alfa

Una vez en Blender, se tiene que advertir al programa que utilice correctamente el
canal alfa. Para ello, en el editor de materiales se crea un nuevo material y en el editor de
textura se cargan las imgenes por separado. A la imagen del alfa se le ponen las opciones

46

CAPTULO 3. DISEO Y DESARROLLO DEL MDULO 1

de alfa y a la imagen de las texturas de las hojas y el tronco se le cambian las opciones de
transparencia. Para ms detalle se pueden ver los valores de las opciones pinchando un
rbol en Blender y mirando en el panel de materiales (F5). Finalmente en el mapeado de la
geometra (mapeado UV) se ajusta (en el panel de edicin UV) para cada rbol un modelo
de hoja diferente, y su textura del tronco.

3.10 Distribucin de vegetacin por la superficie


A partir del mdulo 2, descrito en el siguiente captulo, se obtienen las coordenadas
x e y de las posiciones de los rboles mediante la lectura de un fichero de texto. Dichas
posiciones habrn sido introducidas por el usuario. Como en el mdulo 1 se debe distribuir
la vegetacin en tres dimensiones, hay que estudiar un mtodo para obtener la coordenada
z de cada rbol y as colocarlo en la colina.
El primer mtodo que se estudi consista en hallar los vrtices ms cercanos de las
dos curvas adyacentes a la posicin del rbol, y hacer una media de la coordenada z de
dichos vrtices. El problema que presenta este mtodo es que algunos rboles pueden
hundirse en la superficie o no llegar a tocarla. Se pens en ajustar el rbol de forma que el
centro de gravedad estuviera en el medio del rbol y hacer el tronco ms largo, pero los
resultados no eran correctos para pendientes muy altas.
Con la segunda tcnica estudiada se puede conseguir el valor del eje z mediante
relaciones trigonomtricas, tal y como se muestra en la figura 3.17. P0 indica la posicin
del rbol y los puntos P1, P2 y P3 son los puntos ms prximos al rbol en cada curva de
nivel.

47

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

Figura 3.17: Obtencin del valor del eje z

Con los dos puntos ms cercanos a P0 podemos calcular D1 y d1 con el teorema de


Pitgoras.

En la figura 3.17.C se pueden ver los nuevos ejes que se obtienen. A partir de ellos
podemos calcular el valor del eje z mediante relaciones trigonomtricas:

De esta forma se puede saber a qu altura debe estar el rbol. Pero para algunos
casos no habra una lnea recta entre dos puntos de dos curvas de nivel que incluyeran al
rbol. Esto se puede comprobar en la figura 3.18.A, donde los puntos verdes son los
rboles y los puntos rojos son los puntos obtenidos mediante interpolacin. En la figura
3.18.B, al contrario que la figura 3.18A, se puede ver que los rboles s que estn incluidos
en la recta que une dos puntos de dos curvas de nivel.

48

CAPTULO 3. DISEO Y DESARROLLO DEL MDULO 1

Figura 3.18: Comprobacin de exactitud de la segunda tcnica

Para solucionar este problema se pens en obtener a partir de las ecuaciones de las
curvas los puntos ms cercanos, en lugar de los vrtices usados para crear la malla. Aunque
de esta forma se soluciona el problema planteado, el cmputo operacional se incrementa
sustancialmente.
Por consiguiente, aunque el segundo mtodo era vlido para solucionar el
problema, se empez a estudiar la implementacin a partir de la informacin de los
vectores normales de las caras. En el mdulo NMesh en la clase NMFace disponemos de la
instancia normal con la que podemos obtener el vector normal a una cara. Como hemos
visto en apartados anteriores tambin tenemos la clase NMVert que dispone de la instancia
co con la que podemos obtener las coordenadas de los vrtices. Por lo tanto, tenemos los
datos posibles para aplicar los conocimientos adquiridos en matemticas de lgebra lineal.
La dificultad que planteamos ahora es estudiar un mtodo para saber si un punto est
dentro de un polgono. Como los posibles polgonos en Blender son de 3 y 4 lados,
podemos limitarnos a obtener el punto interior a un tringulo.

49

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

3.10.1 Punto interior en un tringulo


La comprobacin de la pertenencia de un punto a un tringulo se basa en el
concepto de orientacin. Dado un tringulo ABC y un punto P del plano, P est en el
interior de este tringulo si la orientacin de los tringulos ABP, BCP y CAP es la misma
que la orientacin del tringulo ABC.
Por lo tanto, supongamos el tringulo ABC de la figura 3.19. El punto Q no est en
el tringulo. Esto se puede verificar observando que el tringulo ABQ tiene orientacin
contraria al tringulo ABC. Los tringulos ABP, CAP, BCP s mantienen la orientacin as
que se puede establecer que P est en el interior del tringulo.

Figura 3.19: Punto interior al tringulo ABC y orientacin

En este teorema, la orientacin de un tringulo es la misma que la orientacin de


sus tres vrtices, as que podemos construir un algoritmo para decidir si un punto est o no
en el interior de un tringulo. Para ello, consideremos un tringulo A1A2A3. Llamemos u
= A1 - A3 y v = A2 - A3, entonces el signo de u*v decide la orientacin del tringulo. Por
consiguiente, el clculo de la orientacin del tringulo se puede realizar segn la siguiente
frmula:
(A1.x - A3.x) * (A2.y - A3.y) - (A1.y - A3.y) * (A2.x - A3.x)

50

CAPTULO 3. DISEO Y DESARROLLO DEL MDULO 1

Si el resultado es mayor o igual que cero, la orientacin del tringulo ser positiva.
En caso contrario, la orientacin del tringulo ser negativa.
Debemos tener en cuenta que tambin nos podemos encontrar polgonos de cuatro
lados. En este caso, se parte el polgono por la mitad obtenindose dos tringulos con los
que aplicar el mtodo del punto interior a un tringulo.

3.10.2 Algebra lineal: Planos en el espacio


Una vez averiguamos la cara a la que pertenece cada rbol, obtenemos el vector
normal a cada cara o plano mediante la instancia normal de la clase NMFace. Las
coordenadas de los vrtices del plano se obtienen con la instancia co de la clase NMVert.
Llegado a este punto, tenemos las coordenadas de los vrtices que definen el plano y su
vector normal. Por lo tanto, podemos obtener el valor del eje z del rbol a partir del
teorema de lgebra lineal que se explica a continuacin.

Un plano se define por un vector normalizado perpendicular a la superficie del


mismo = (a, b, c), y la distancia d que le separa del origen de coordenadas, de forma que
los puntos (x, y, z) sobre su superficie son aquellos que verifican la siguiente ecuacin:

a*x+b*y+c*z+d=0

Figura 3.20: Vector normal

51

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

Por consiguiente, el punto Po (x,y,z) pertenece al plano


.(Po-P)=0

s y slo s

Po-P, es decir si

(a,b,c).(xo-x, yo-y, zo-z)=0.

a(xo-x)+b(yo-y)+c(zo-z)=0

ax+by+cz=axo+byo+czo

d= ax+by+cz
En consecuencia, una vez se tiene el valor de d podemos calcula la coordenada z del punto
Po:
z=(-((axo)+(byo)-d)/c)

52

Captulo 4
DISEO Y DESARROLLO DEL MDULO 2
CREACIN DEL FICHERO DE COORDENADAS DE
LOS RBOLES
El captulo 4 describe los pasos seguidos para programar el segundo script. Este segundo
script es una herramienta que permite al usuario dibujar rboles sobre el mapa
topogrfico y guardar sus coordenadas en un fichero de texto. Estos rboles se pueden
borrar y mover, as como ir representando sus coordenadas en una ventana emergente.

4.1 Programacin mediante eventos


En este mdulo 2 tambin se utiliza programacin mediante eventos, por lo que la
estructura que se sigue es similar a la del modulo 1. Recordando lo explicado en el
apartado 3.1, la funcin bevent es la que mayor control ejerce en el script, y en este caso es
la que hace las llamadas a las funciones de cargar el mapa y visualizarlo, dibujar el rbol,
exportar el fichero de texto y mostrar las coordenadas de los rboles en una ventana
emergente.

53

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

4.2 Visualizar mapa topogrfico


Para visualizar la imagen del mapa topogrfico se ha creado la funcin Visualizar.
El primer paso de la funcin es cargar la imagen mediante el mtodo Load del mdulo
Image, mdulo que contiene todas las opciones disponibles para modificar las imgenes. El
segundo paso es mostrar la imagen del mapa topogrfico en la interfaz de Blender. Para
ello, se genera un plano y se carga la imagen del mapa en dicho plano. Nos podemos
encontrar con varios problemas; por ejemplo, si creamos un plano con unas dimensiones
fijas, las imgenes que no tengan esas dimensiones saldran distorsionadas. Si creamos un
plano con las mismas dimensiones que el mapa, podran ser imgenes muy grandes que no
se visualizaran correctamente en la pantalla, como es el ejemplo de la figura 4.1.2, o muy
pequeas y tener que hacer un zoom para acercarnos manualmente, tal y como se muestra
en la figura 4.1.3. Como uno de los objetivos principales es que el proceso sea lo ms
automtico posible, se ha aplicado un factor de escala. Este factor de escala se calcula a
partir de la dimensin mayor de la imagen, que normalmente es el ancho. Con esto
conseguimos que todas las imgenes se visualicen con la misma escala y sin deformarse,
como se muestra en la figura 4.1.1.

4.4.1 Con factor de escala

4.1.2 Sin factor de escala y


sin ajustar

4.1.3 Sin factor de escala,


ajustado manualmente

Figura 4.1: Mapa con las posiciones de los rboles seleccionadas

54

CAPTULO 4. DISEO Y DESARROLLO DEL MDULO 2

Tomando el valor 50 para calcular el factor de escala, las imgenes se ajustan


correctamente al visor. Por lo tanto, en la imagen de la figura 4.1 de dimensin 500x400
pxeles el factor de escala es de 50/500, al ser el ancho mayor que el alto.
Consecuentemente, a partir de las dimensiones de la imagen se generan cuatro
vrtices que son las esquinas de la imagen. Dichos vrtices se crean con el mtodo Vert del
mdulo NMesh indicando para cada vrtice las coordenadas correspondientes. Estos
vrtices se aaden a la lista de vrtices verts de un objeto malla vaco que se habr
generado con la funcin GetRaw. A continuacin, a partir de los vrtices se genera la cara
del plano. Para ver como se genera una cara vase el apartado 3.5.
Una vez tenemos el objeto del plano es cuando tenemos que aplicar el factor de
escala. Hay dos formas de hacerlo: una es mediante la instancia size(x,y,z) y la otra con el
mtodo setsize(x,y,z) del submdulo Object. En ltimo lugar, se visualiza el objeto en la
ventana 3D y para ello utilizamos la funcin Redraw del mdulo Blender.

4.3 Dibujar rboles


La siguiente parte del mdulo est dedicada a dibujar los rboles sobre la imagen
del mapa topolgico para indicar su posicin. Se pueden dibujar rboles de dos formas. La
primera es a partir de botones de tipo numrico que indiquen las coordenadas (x,y) donde
se pretende dibujar el rbol. La segunda forma es dibujando el rbol en la posicin del
cursor grfico de Blender. Este cursor se representa con un crculo rojo e indica la posicin
en la que nos encontramos de la ventana 3D.

Dibujar rboles indicando coordenadas


Para dibujar los rboles se ha programado la funcin Dibujar y se le han pasado los
parmetros de las coordenadas (x,y) que introduce el usuario en los botones creados (en la
funcin GUI) en el interfaz. El sistema que se utiliza para dibujar los rboles no es dibujar

55

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

el rbol directamente en el mapa, sino que es parecido a un sistema de capas de un


programa de diseo como Photoshop o Gimp, en el que cada rbol est en un plano
diferente y el mapa topogrfico est en otro plano ms grande y en un nivel ms bajo. Por
ejemplo, podemos situar el plano del mapa en el eje z=0, y los rboles en el z= 0.5. Por lo
tanto, en primer lugar creamos un plano en el origen de coordenadas y le aadimos la
textura que represente un rbol. En segundo lugar, y antes de escribir el plano en la ventana
3D, se traslada el plano hasta la posicin que ha indicado el usuario en los botones de
coordenadas del interfaz.

Dibujar rboles en la posicin del cursor


Los pasos a seguir para dibujar los rboles en la posicin del cursor son idnticos a
los comentados en el apartado anterior. Con la nica diferencia de obtener las coordenadas
(x,y) del rbol con la funcin GetCursorPos del mdulo Window. En la figura 4.2 se puede
ver un ejemplo de mapa con las posiciones de los rboles en color verde.

Figura 4.2: Mapa con las posiciones de los rboles seleccionadas

56

CAPTULO 4. DISEO Y DESARROLLO DEL MDULO 2

4.4 Exportar fichero de coordenadas

Para exportar el fichero de coordenadas se ha creado la funcin ExportarFichero.


Primero se seleccionan todos los objetos que hay en la escena actual (plano del mapa y
planos de los rboles) mediante la funcin Get del mdulo Object. Estos objetos se
almacenan en una lista y comparten ciertos atributos cuya informacin se obtiene del
mdulo Object. Utilizamos los atributos LocX y LocY para acceder a las coordenadas de
los objetos. Posteriormente, mediante el mtodo write se escriben las coordenadas en el
fichero. Finalmente, se cierra el fichero con la funcin close.
Cabe mencionar que tambin contamos con la funcin PupBlock del mdulo Draw,
con la que se crea una ventana de datos que indica las coordenadas de los rboles. En la
figura 4.3 se muestra la ventana de coordenadas obtenida a partir del mapa de posiciones
de la figura 4.2.

Figura 4.3: Ventana de coordenadas obtenida a partir del mapa de la figura 4.2

57

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

4.5 Algunos detalles generales de implementacin

En la primera parte del mdulo 1, en la que se genera la colina, se hacen muchas


operaciones en el algoritmo de Marching Cubes y en el mtodo de interpolacin,
por lo que se tarda unos segundos en visualizar el modelo de la montaa. Es por
ello que necesitamos una barra de estado para proporcionar al usuario la
informacin sobre el progreso de carga. Para crear una barra de estado tenemos la
funcin DrawProgressBar en el mdulo Window.
Con respecto al interfaz, la imagen de fondo de los scripts se carga con la funcin
Load del mdulo Image, y se dibuja en el interfaz con la funcin Image del mdulo
Draw. Es por esto que se ha conseguido un entorno grfico agradable, con el que se
mejora la visualizacin y comprensin del script.
Para controlar los errores tanto del mdulo 1 como del mdulo 2 se crean mensajes
de error con la funcin PupMenu del mdulo Draw. Con esto conseguimos que el
usuario este informado de lo que debe hacer en cada paso.
En ltimo lugar, para que las imgenes del interfaz, las texturas de los rboles y las
texturas de la colina permanezcan empaquetadas en el script y as no tener que
transportarlas ordenador a ordenador, se utiliza la herramienta Pack Data. Gracias
a esto el nico archivo que necesitamos para abrir el script es el archivo de Blender
(.blend).

58

Captulo 5
PROBLEMAS ENCONTRADOS

En esta seccin se describen las dificultades y complicaciones ms importantes que se han


hallado durante el proceso de realizacin del proyecto tanto a nivel de aprendizaje, como
de diseo e implementacin de algoritmos.

5.1 Aprendizaje
La primera dificultad encontrada al comenzar con este proyecto fue aprender a
programar en Python. Enfrentarse a este lenguaje de programacin desconocido se hizo
posible gracias a la gran cantidad de informacin que se puede encontrar en libros y en
Internet. La diferencia ms notable y complicada con respecto a otros lenguajes de
programacin aprendidos a lo largo de la carrera es que se basa en el paradigma de
orientacin a objetos, metodologa no estudiada a lo largo de la titulacin.
Otro problema surgido fue el hecho de tener que aprender a programar con eventos
y tener que familiarizarse con la interfaz de programacin de aplicaciones de Blender.
Teniendo en cuenta que estos conceptos no se imparten en ninguna asignatura de la
titulacin, este proceso de aprendizaje se alarg durante varios meses.

59

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

5.2 Implementacin
Factor de escala
Experimentando con Blender se observ que objetos que se salen del rango de
coordenadas (150, -150), tanto en el eje x como en el y como en el z, no se visualizan
correctamente. Por lo tanto, si tenemos un mapa de 900x600 pxeles, y sabemos que un
pxel se interpreta como una unidad ms, la imagen se sale del rango visible. Por este
motivo, en el mdulo 2 (script de seleccin de las coordenadas de los rboles) se aplic el
factor de escala comentado en el apartado 4.2, que adems era necesario para que todos los
mapas se mostraran con la misma escala. Consecuentemente, se carga el mapa y se escala,
por lo que las coordenadas que obtenemos de los rboles se obtienen a partir del mapa
escalado. Esto quiere decir que si ahora cargamos el mapa en el mdulo 1(script generador
de superficie montaosa y distribucin de vegetacin) las coordenadas de los rboles y las
coordenadas del mapa no van a coincidir. La solucin a este problema es generar la colina
partiendo del mapa original y una vez generada, aplicarle el factor de escala, primero para
que se encuentre en el rango visible y segundo para poder distribuir los rboles.

Coordenadas locales y coordenadas globales


En Blender existen dos tipos de coordenadas: las locales y las globales. En
principio se pensaba que no haba ninguna diferencia entre ambas coordenadas, pero
debido a problemas continuos a raz de transformaciones de escalado se lleg a la siguiente
teora errnea:
Las coordenadas locales y las globales son iguales si no se modifica su
traslacin, rotacin y escalado. Sin embargo, si se aplica algn tipo de transformacin,
las coordenadas globales varan y las locales siguen siendo las originales.
No obstante, esta teora se desestim en la implementacin del mtodo de
distribucin de rboles del mdulo 1 debido a que cuando importbamos los rboles, haba
que ajustar manualmente su tamao para que tuvieran una proporcin correcta con respecto

60

CAPTULO 5. PROBLEMAS ENCONTADOS

a la colina. Pero al hacer la copia de los rboles no se mantenan los valores del escalado.
Tras estudiar muchas opciones se concluy cul era el problema. Se observ que si
escalbamos en modo objeto con el factor de escala S(1.8,1.8,1.8) la copia del objeto se
haca ms pequea, y si el factor de escala era S(0.5,0.5,0.5) la copia del objeto se haca
ms grande. Sin embargo, si estos cambios se realizaban en modo edicin, ambas
coordenadas se mantenan idnticas con el factor inicial (1,1,1) y se conservaba el cambio
realizado en la copia del rbol. As, se concluye la siguiente teora:

Las coordenadas locales y las coordenadas globales son iguales si no se


modifica su traslacin, rotacin y escalado, o si estas transformaciones se realizan en
modo edicin. Sin embargo, si se aplica una transformacin en modo objeto, las
coordenadas globales varan y las locales siguen siendo las originales.

Figura 5.1: Transformaciones en modo objeto

61

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

Figura 5.2: Transformaciones en modo edicin

Actualmente, la API de Blender no especifica qu tipo de coordenadas utiliza para


cada una de las funciones de acceso a coordenadas, transformaciones, etc. Aunque todas
las funciones que se han usado finalmente utilizaban coordenadas globales, no se puede
afirmar que todas atiendan a este tipo de coordenadas y no a las locales. Por consiguiente,
se aconseja que todas las transformaciones se realicen en modo edicin y en caso de ser
de forma implementada que se busquen funciones y mtodos que no varen las
coordenadas globales.

Vector normal
Los vectores normales son vectores perpendiculares a la superficie de los objetos, e
indican cul es la cara externa de cada polgono, adems de ser usados para clculos de
iluminacin y otros efectos. Por defecto, en Blender viene activada slo el vector normal
de uno de los lados de una cara, por lo que en principio habr un nico lado que ser
visible.
En el mdulo 1, cuando se generaba la colina, la ltima cara creada no se
visualizaba correctamente. El problema era que el orden en que se unan los vrtices de las
caras era diferente del que se segua para el resto de las caras del objeto, y las normales
quedaban justo en el lado contrario. Se lleg a esta conclusin al comprobar que si se

62

CAPTULO 5. PROBLEMAS ENCONTADOS

utilizaba la opcin Double sided para que hubiese normales en ambos lados, la cara s se
poda ver en el render. Por lo tanto, el orden en que se aaden los vrtices es muy
importante para que la cara no se deforme y para conseguir que las normales queden hacia
el lado correcto.

Ventana de coordenadas
Con la funcin PupBlock del mdulo Draw, se ha creado una ventana de datos que
indica las coordenadas de los rboles. Si el usuario borrase algn rbol de la escena, en el
bloque de datos se seguiran mostrando sus coordenadas. Este problema no se ha podido
solucionar ya que no se trata de un fallo de implementacin en el script.

5.3 Algoritmos
Marching Cubes
Descubrir fallos en el algoritmo de Marching Cubes era muy complicado ya que se
deba depurar el algoritmo rejilla por rejilla suponiendo posibles errores. Para ello, se
guardaban las coordenadas de los puntos de corte y de los puntos de control, y se
representaban en una grfica de Excel para justificar paso a paso si eran puntos correctos.
A continuacin se presentan los fallos que se descubrieron mediante esta tcnica

Si analizamos la cantidad de puntos de control que se pueden obtener por rejilla,


nos encontramos con que es posible tener entre 1 y 4 puntos de control tal y como se
muestra en la figura 5.3.

63

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

Figura 5.3: Posibles puntos de control por rejilla

Por otro lado, no puede existir un punto de control que tenga dos puntos de control
vecinos con el fin de evitar problemas en el caso de existir cuatro puntos de control en una
rejilla. Por consiguiente, cuando slo hay un punto de control en una rejilla no se puede
seguir una conexin entre los puntos, ya que una vez se detecta vecindad con un punto,
este punto ya no se puede volver a utilizar para detectar vecindad con otro. La solucin
est en aadir dos veces el punto de control. De esta forma, se considera que el punto y su
copia slo tienen un vecino cada uno y as se pueden hacer conexiones entre objetos.
Por otra parte, en rejillas de cuatro puntos se observ que se deba seguir una regla
para continuar el orden correcto de los puntos. Para comprender esta regla nos fijamos en
los errores establecidos en la figura 5.4.

64

CAPTULO 5. PROBLEMAS ENCONTADOS

Figura 5.4: Errores posibles en una rejilla de cuatro puntos

Se concluy que para obtener un orden correcto de puntos en el caso de tres y


cuatro puntos de control en una misma rejilla, se debe seguir un orden. Dicho orden se
muestra en el ejemplo de la figura 5.5.

Figura 5.5: Orden que se debe seguir en la rejilla de cuatro puntos de la figura 5.4

65

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

El camino seguido en la figura 5.5 comienza en el punto superior situado ms a la


derecha y coge los puntos del objeto Rejilla siguiendo la direccin de las agujas del reloj.
En la figura 5.6 se puede comprobar que seguir este orden es correcto para todos los casos
posibles.

Figura 5.6: Orden en direccin de las agujas del reloj seguido en rejillas de cuatro puntos

Por ltimo, se observ que en la primera rejilla con trozo de curva nos podemos
encontrar con los casos de la figura 5.7.

Figura 5.7: Formas posibles de la primera rejilla con tramo de curva

Por el contrario, la figura 5.8 muestra casos imposibles en la primera rejilla con
trozo de curva.

Figura 5.8: Formas imposibles en el primer tramo de curva

66

CAPTULO 5. PROBLEMAS ENCONTADOS

Como se puede ver, la primera rejilla con tramo de curva es la que va a indicar el
primer punto, y por lo tanto la direccin del camino que se va a seguir segn su conexin
con puntos de celdas adyacentes. Por ello, en la primera curva que se detecta se debe seguir
el orden de las agujas del reloj, o simplemente coger el punto que est ms a la derecha
como se puede observar en la figura 5.9. En caso contrario, el orden de obtencin de
puntos sera al contrario de las agujas del reloj y no se ordenaran bien los puntos de
rejillas de cuatro puntos de control.

Figura 5.9: Posible error creado en el inicio de una curva

En la figura de la izquierda se puede comprobar que si se coge como punto inicial


el punto de ms a la izquierda, no se consigue continuar correctamente por los puntos de la
curva. Sin embargo, en la figura de la derecha se comienza con el punto que se encuentra
ms a la derecha. De esta forma, s se puede continuar correctamente hasta el punto final
de la curva.
Llegado este punto, nos podemos preguntar por qu desde el principio no se
detectan los puntos de control directamente, y no se detectan porque inicialmente no es
posible, ya que en cada rejilla se necesitan conocer los puntos de corte de la celda siguiente
y los puntos de tu propia celda para no hacer una bsqueda de puntos en ella.

67

Captulo 6
MANUAL DE USUARIO

El captulo 6 es un manual de manejo bsico del script y de algunas herramientas


interesantes de Blender. Aunque los scripts son intuitivos y de fcil uso, esta gua sirve
como instrumento de consulta rpida de las opciones disponibles y de los resultados que
se pueden conseguir en ambos mdulos.

6.1 Manejo del script o mdulo 1


Este primer mdulo est dedicado a la obtencin de una montaa en 3D a partir de
una imagen en 2D de un mapa topogrfico, y a la distribucin de vegetacin en su
superficie a partir de un fichero de coordenadas generado en el mdulo 2. Para comenzar
con el manejo de este primer script, clicamos dos veces sobre el archivo .blend llamado
Mdulo 1.El interfaz que presenta Blender al arrancar el archivo es el mostrado en la
figura 6.1. Como se puede ver en dicha figura, la divisin de la izquierda es el editor
Python, y las ventanas de la derecha son las vistas 3D. La ventana inferior derecha es la
vista de cmara, es decir, la perspectiva que se va a visualizar en el render final, y la
ventana superior derecha es una vista en planta.

69

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

Figura 6.1: Interfaz Blender

A continuacin, ejecutamos el script situndonos con el ratn encima del editor de


Python y presionando ALT+P. El aspecto que se obtiene se muestra en la figura 6.2. En
esta figura podemos distinguir dos mens. En la parte superior est el men de opciones
para modelar la colina y en la parte inferior el men para distribuir los rboles. Estos
mens se pueden utilizar por separado, siendo independiente uno de otro.

70

CAPTULO 6. MANUAL DE USUARIO

Figura 6.2: Aspecto del script 1

Men modelar colina


Dentro del men modelar colina el primer paso es seleccionar una textura de entre
las 6 existentes. Posteriormente, cargamos la imagen .bmp del mapa topogrfico con la
opcin

, en la que nos aparecer una nueva ventana de bsqueda de archivos.

Seguidamente, en el men

, debemos seleccionar las

flechas de la derecha para indicar si es un mapa de alturas (mapa de niveles de gris) o un


mapa de curvas de nivel. La diferencia entre ellos la podemos ver en la figura 6.3.

71

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

Figura 6.3: Mapa de curvas de nivel y mapa en niveles de gris

Los botones de

, son para

dividir la imagen en rejillas. Estas opciones son necesarias para el algoritmo de Marching
Cubes(ver apartado 3.3.3). En principio no hace falta cambiar el nmero de subdivisiones,
a menos que el script avise de un nmero de rejillas incorrecto. En este caso, habr que
aumentar el nmero de subdivisiones presionando las flechas o bien pinchando el botn y
tecleando el nmero.
El botn de nmero de puntos

indica la cantidad de

puntos o vrtices que queremos obtener en cada curva de nivel. As por ejemplo, si
tenemos 30 puntos y 4 curvas de nivel obtendremos 4x30 vrtices, ms el vrtice superior
de la cara de arriba, un total de 121 vrtices. Con lo cual, cuanto mayor sea el nmero de
puntos ms precisin en las curvas de nivel y ms masa poligonal.
Segn el tipo de mapa hay dos formas de escoger la altura de la montaa. Por un
lado,

si

se

ha

seleccionado

mapa

de

altura,

tenemos

el

botn

de

cota

, que indica la altura total. Por otro lado, si se ha seleccionado


mapa de curva tenemos la opcin equidistancia

, que indica la

altura entre curvas de nivel. Adems, si es un mapa de curvas de nivel, nos aparece otra

72

CAPTULO 6. MANUAL DE USUARIO

opcin ms de tipo men

, que sirve para seleccionar

si la superficie superior es plana, puntiaguda o en cuenca deprimida, como es el caso de un


volcn. Esta opcin no est disponible para mapas de altura, ya que a partir de los niveles
de gris del mapa se puede conseguir este tipo de superficies.
En el caso de seleccionar el botn de geometra cerrada

se crea

una tapa inferior que cierra la superficie geomtrica. Por defecto la opcin de geometra
cerrada est desactivada.
Para terminar, debemos crear el terreno con la opcin

. El proceso

de creacin del terreno se puede visualizar en la barra de estado situada en la barra


superior.
Una vez se ha creado la montaa, en la parte inferior izquierda (en el panel de
edicin F9) tenemos el men Link and Materials. En este men est la herramienta Set
Smooth para suavizar la malla.

Figura 6.4: Herramienta de suavizado de malla Set Smooth

73

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

Men posicionar rboles


Para distribuir los rboles en primer lugar seleccionamos los tipos de rboles que
queremos utilizar. El color verde oscuro significa que el rbol est seleccionado.
Consecutivamente, cargamos el fichero de coordenadas

obtenido en el mdulo

2(script de creacin de fichero de coordenadas), y finalmente creamos los rboles con el


botn

6.2 Manejo del script o mdulo 2


Este segundo mdulo es una herramienta que permite dibujar rboles en el mapa
topogrfico y guardar sus coordenadas en un fichero de texto. Para comenzar con el
manejo del script, clicamos dos veces sobre el archivo .blend que se llama Mdulo 2.
Una vez ejecutado el script, se mostrarn las opciones que se presentan en la figura 6.5.

Figura 6.5: Aspecto del script 2

Primero, debemos cargar el mapa topogrfico


debemos visualizar el mapa en la escena

. A continuacin,
. Para dibujar rboles en el

mapa disponemos de dos opciones. Con la primera opcin


tenemos la posibilidad de introducir la coordenada del rbol. Con la segunda opcin

74

CAPTULO 6. MANUAL DE USUARIO

podemos dibujar el rbol en la posicin del cursor. Para cambiar la


posicin del cursor, clicamos con el botn izquierdo del ratn en la nueva posicin.
Una vez creado el mapa, tenemos disponible el panel de Transform Properties.
Este panel, que se puede activar y desactivar mediante la tecla N, y nos sirve para
modificar la posicin de los rboles. Para ello, seleccionamos el rbol con el botn
izquierdo del ratn y variamos las opciones LocX, LocY y LocZ.

Figura 6.6: Panel Transform Properties

Adems, podemos ir visualizando en una ventana emergente el nombre y las


coordenadas de cada rbol con la opcin

. Contamos con otra opcin

interesante que consiste en borrar un rbol, opcin que se lleva a cabo al clicar con el
botn derecho del ratn en el rbol que pretendemos borrar y darle a Suprimir.
Para exportar el fichero de texto primero elegimos la ruta
el que se desea guardar, y a continuacin exportamos el fichero

y el nombre con
.

Para renderizar la escena, y obtener una imagen 2D de la vista 3D debemos pulsar


la tecla F12.

75

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

6.3 Pruebas
A continuacin, en la figura 6.7 se presenta un ejemplo con capturas de las
opciones escogidas para generar una montaa a partir de su mapa topogrfico. En este
ejemplo, se puede comprobar que las situaciones marcadas en el mapa de posiciones
coinciden perfectamente con las de los rboles de la vista en planta. Conjuntamente, el
render final de la escena se muestra en el cuadro de previsualizacin y su textura
corresponde con el csped escogido en el men de texturas. Este render final, se puede
perfeccionar aadiendo sombras a las luces e incluyendo un fondo.

Figura 6.7: Mapa de alturas y distribucin de rboles

76

CAPTULO 6. MANUAL DE USUARIO

La figura 6.8 muestra un ejemplo de mapa de curvas de nivel con cuenca


deprimida. La textura seleccionada es de tipo roca y se puede observar su resultado en la
previsualizacin.

Figura 6.8: Mapa de curvas de nivel con cuenca deprimida

77

Captulo 7
CONCLUSIONES

Captulo final que expone las conclusiones obtenidas tras la realizacin del proyecto,
muestra varios ejemplos de uso, y propone posibles mejoras y ampliaciones que se pueden
desarrollar en futuras versiones.

7.1 Conclusiones
En este proyecto se han realizado dos scripts o mdulos destinados a conseguir,
aparte de representaciones tridimensionales precisas de mapas topogrficos, una
distribucin de vegetacin en su superficie, con una interaccin mnima por parte del
usuario. Una vez aplicado el script de topologa a distintos mapas y obtenido el modelo
equivalente de su colina con una precisa posicin de sus rboles, se concluye que los
resultados obtenidos permiten una gran exactitud tanto en la distribucin de vegetacin
como en la creacin de la superficie equivalente al mapa. Cabe destacar que la
automatizacin de la tarea consigue que la creacin de este tipo de objetos sea fcil y
rpida. Adems, el entorno grfico logrado mejora sustancialmente el interfaz ayudando a
la comprensin y visualizacin previa de texturas y vegetacin.
Por otro lado, con el presente proyecto se han adquirido y reforzado conocimientos
en el mbito de la ingeniera, especialmente en materias vinculadas con los grficos 3D por

79

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

computadora como lo son la infografa 3D, el tratamiento de imgenes, la programacin,


fundamentos matemticos de geometra, tcnicas de interpolacin, resolucin de sistemas y
nuevos algoritmos. Es por ello que, en los mdulos presentados, se han abordado las
matemticas necesarias para conseguir los objetivos planteados.
Las dificultades que se han ido presentando en la implementacin de los mdulos
se han resuelto a base de estudiar tanto mtodos propios, como algoritmos ya establecidos
a fin de obtener soluciones ms eficientes y robustas. Dicho esto, y teniendo en cuenta que,
tanto para la creacin de la colina, como para la distribucin de vegetacin, se han
estudiado varios mtodos de resolucin, se muestra y concluye que la dificultad no ha sido
slo tener una solucin matemtica del problema, sino conseguir una solucin eficaz.
Por otra parte, el proceso de aprendizaje de la programacin orientada a objetos, de
Python y en definitiva de conceptos de graficacin por computadora, en sus diferentes
etapas, ha estado plagado de obstculos. Pero es precisamente esa dificultad y la
satisfaccin de superarla lo que ha motivado a mejorar en todo lo posible cada uno de los
apartados del proyecto.
Por ltimo, Blender ha sido una herramienta muy completa y con un enorme
potencial para desarrollar todos los objetivos que se han propuesto. Por la red se ha podido
obtener mucha informacin sobre tcnicas de resolucin, programacin Python y opciones
de Blender, tanto en foros como en fuentes de informacin.

7.2 Ejemplos de uso


Topografa
La utilidad ms importante de los scripts es generar modelos tridimensionales a
partir de mapas topogrficos. En la figura 7.1 se muestra el modelo 3D obtenido a partir
del mapa topogrfico del monte Kenia de frica. En dicha figura se puede comprobar que

80

CAPTULO 7. CONCLUSIONES

las curvas de nivel del mapa coinciden con el modelo 3D generado que se muestra en la
vista en planta.

Figura 7.1: Montaa Kenia de frica

81

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

Videojuegos y cortometrajes
Otra utilidad que cabe destacar es la composicin de paisajes con montaas y
vegetacin en un videojuego o cortometraje. La figura 7.2, en la que se puede ver integrada
de forma eficaz una serie de colinas en el escenario de un videojuego, sirve de muestra.
Dicho videojuego ha sido desarrollado por Studio Prometea, compuesto por dos
diseadores y un programador. Estar terminado para la plataforma de Apple Iphone en
inicios del 2009. Se trata de un juego de carreras en el que se intenta imitar la dinmica de
anteriores juegos con gran xito como Mario Kart.

Figura 7.2: Videojuego Snowball Racing

82

CAPTULO 7. CONCLUSIONES

Las colinas que se presentan en la imagen de la figura 7.2 se han generado con los
ejemplos de la figura 3.7(con seleccin de superficie plana), con el mapa de la figura
3.14(con seleccin de superficie plana) y con el mapa de la figura 4.1 (con seleccin de
superficie puntiaguda).
Las posiciones de los rboles se han indicado con el script 2 (creacin del fichero
de coordenadas de los rboles), de donde obtenemos el fichero de coordenadas.
Seguidamente en el mdulo 1, se han generado las colinas y se ha cargado su textura
correspondiente. Por ltimo, se ha importado el rbol modelado para el videojuego al script
de topografa y se ha distribuido a partir de las coordenadas seleccionadas.

7.3 Trabajo futuro


A continuacin, se proponen posibles mejoras para las aplicaciones desarrolladas
en este proyecto. En primer lugar, se proporcionan varios ejemplos topogrficos que no se
observan en los mtodos descritos en el presente trabajo. Si ampliramos el cdigo para
dichos ejemplos se podran lograr modelos 3D de mapas topolgicos ms complejos.
Posteriormente, se comentan varias opciones que se podran aadir a los scripts,
consiguiendo as ms funcionalidades.

La aplicacin actual es capaz de generar superficies montaosas a partir de mapas


topogrficos, cuyas curvas de nivel son cerradas y situadas en distintas cotas. La primera
posible mejora sera ampliar el cdigo para contemplar el caso de ms de dos curvas de
nivel a una misma cota, tal y como se muestra en la figura 7.3.

83

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

Figura 7.3: Mapa con varias curvas de nivel en una misma cota

En segundo lugar, se podra estudiar un mtodo capaz de distinguir la coincidencia


en planta de las curvas de nivel en el caso de mxima pendiente en la superficie, como por
ejemplo una pared vertical del terreno. La figura 7.4 sirve de muestra.

Figura 7.4: Mapa con Coincidencia de las curvas de nivel

84

CAPTULO 7. CONCLUSIONES

Partiendo esta idea, se podra implementar el mtodo estudiado de forma que


tambin distinga cruces de curvas de nivel en el plano. De esta forma podramos
representar tridimensionalmente voladizos en el terreno.

La siguiente propuesta consiste en representar la totalidad del mapa topogrfico,


entendiendo como tal a todas las curvas de nivel, independientemente de que estn
limitadas por el marco de representacin del mapa (en el mdulo actual, el modelo es
generado a partir de la curva de nivel completa exterior).

Figura 7.5: Mapa topogrfico complejo

85

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

Como se ha visto en el captulo 3, el mdulo 1 incluye un emplazamiento de


vegetacin. La vegetacin est limitada a 12 tipos de rboles. Esto se puede mejorar de
varias formas.
Por un lado es interesante hacer una conexin entre el generador de rboles y el
mdulo 1 para que vaya generando vegetacin distinta cada vez. As, los
parmetros del generador se podran cambiar para decidir texturas, grosor, altura
del rbol, etc.
Por otro lado, se podra aadir una opcin para que el usuario cargase los objetos a
distribuir por la superficie. En este caso, incluso el propio usuario podra posicionar
edificios, antenas, vehculos o cualquier otro objeto.
Otra propuesta es aprovechar algunos de los algoritmos de los mdulos para hacer
una aplicacin en la que el usuario dibuje las distintas lneas del terreno mediante curvas
Bzier y fuese el propio mdulo el que generase el terreno. Esta aplicacin ya existe para
otro programa de 3D que se llama 3D Studio Max, pero no est disponible de forma
gratuita.
Con respecto a las posiciones de los rboles, en el presente mdulo el usuario
decide la posicin de cada rbol. Sin embargo, para darle ms posibilidades al script, se
podra aadir una opcin para que adems tambin se pudieran distribuir de forma
aleatoria.

86

Referencias

[1] Pgina oficial de Blender: <www.blender.org>


[2] Interfaz de Programacin de Aplicaciones de Blender:
<http://www.blender.org/documentation/242PythonDoc/>
[3] Generador de rboles Lsystem:
<http://www.geocities.com/blenderdungeon/lsystem/index.html>
[4] Generador de rboles Gen3: <http://www.geocities.com/bgen3/>
[5] Pgina oficial de Python: <http://www.python.org/>
[6] Tutorial de Python de Guido van Rossum: <http://docs.python.org/tut/>
[7] Andrs Marzal e Isabel Garca, Introduccin a la programacin con Python,
ed. Universitat Jaume I
[8] Timothy A.Budd, Introduccin a la programacin orientada a objetos, ed.
Addison-Wesley.
[9] Carlos Lpez, tutoriales de Python y Blender:
<http://klopes.iespana.es/tutoriales/pythonlopes/pythonlopes1.htm>
<http://klopes.iespana.es/tutoriales/pythonlopes/pythonlopes2.htm>
<http://klopes.iespana.es/tutoriales/pythonlopes/pythonlopes3.htm>
<http://klopes.iespana.es/tutoriales/pythonlopes/pythonlopes4.htm>
<http://klopes.iespana.es/tutoriales/pythonlopes/pythonlopes5.htm>

87

DISEO Y DESARROLLO DE MDULOS BLENDER EN PYTHON

[10] Allen Downey,Jeffrey, Elkner, Chris Meyers, Aprenda a pensar como un


programador con Python, ed. Green Tea Press
[11] Juan Manuel Sez Martnez, Mtodos matemticos de la computacin, ed.
Universidad de Alicante
[12] Clculo de intersecciones y obtencin de normales:
<http://www.inmensia.com/articulos/raytracing/planotrianguloycubo.html?pag=1>
[13] Punto interior a un tringulo:
<http://www.cidse.itcr.ac.cr/revistamate/Contribucionesv3n2002/WMoraMatProg/p
ag3.html>
[14]Marching Cubes:
<http://www.polytech.unice.fr/~lingrand/MarchingCubes/accueil.html>
[15] Tcnicas utilizando gramticas, Universidad Simn Bolvar de Caracas:
<http://www.ldc.usb.ve/~abianc/graficas/tecnicas.html>
[16] Parsing Techniques, a practical guide. Dick Grune, Ceriel Jacobs
<http://www.scribd.com/doc/5880/Parsing-Techniques>
[17] Estudio de los mapas topogrficos:
<http://www.uam.es/personal_pdi/ciencias/casado/GEORED/Topo-2/prac6.htm>
[18] Wikipedia: <http://www.wikipedia.org/>
[19] Wikimedia Commons: <http://commons.wikimedia.org/wiki/Main_Page>
[20] Mtodo de Canny:
<http://www.ieeexplore.ieee.org/iel5/9907/4609907/04609909.pdf?isnumber=4609
907&prod=JNL&arnumber=4609909>
[21] Repositorio de programas libres freahmeat: <http://freshmeat.net>

88

Das könnte Ihnen auch gefallen