MADRID, JUNIO 2016
Autor: Cristina Arnaiz Pérez-Villamil
Director: José María Peña Sánchez
Graduado en Ingeniería Informática
Universidad Politécnica de Madrid
Escuela Técnica Superior de Ingenieros Informáticos
TRABAJO FIN DE GRADO
Generación procedimental de coberturas
de edificaciones para modelos 3D
Indice general
1. RESUMEN 11.1. RESUMEN EN ESPANOL . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2. RESUMEN EN INGLES . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2. INTRODUCCION 3
3. TRABAJOS PREVIOS 7
4. DESARROLLO 104.1. HERRAMIENTAS UTILIZADAS . . . . . . . . . . . . . . . . . . . . . 10
4.2. PLANTEAMIENTO INICIAL PARA LA GENERACION DE CUBIER-
TAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4.3. ALGORITMO DE GENERACION DE CUBIERTAS . . . . . . . . . . . 13
4.3.1. FUNDAMENTO Y OBJETIVO . . . . . . . . . . . . . . . . . . 13
4.3.2. FUNCIONAMIENTO . . . . . . . . . . . . . . . . . . . . . . . 14
4.4. PARAMETROS PARA LA CREACION CUBIERTAS . . . . . . . . . . 30
4.4.1. PARAMETROS GABLE ROOF . . . . . . . . . . . . . . . . . . 30
4.4.2. PARAMETROS HIPPED ROOF . . . . . . . . . . . . . . . . . . 31
4.4.3. PARAMETROS GAMBREL ROOF . . . . . . . . . . . . . . . . 31
4.4.4. PARAMETROS MANSARD ROOF . . . . . . . . . . . . . . . . 31
4.4.5. PARAMETROS SHED ROOF . . . . . . . . . . . . . . . . . . . 31
4.5. ALGORITMOS AUXILIARES . . . . . . . . . . . . . . . . . . . . . . 32
4.5.1. ALGORITMO DE CREACION DE CONTORNO . . . . . . . . 32
4.5.2. ALGORITMO DE CREACION DE RECTANGULOS . . . . . . 43
4.5.3. ALGORITMO DE EXPANSION DE RECTANGULOS . . . . . 48
4.5.4. ALGORITMO DE MODIFICACION DE RECTANGULOS . . . 52
4.5.5. CREACION DE GEOMETRIA 3D . . . . . . . . . . . . . . . . 57
4.5.5.1. GEOMETRIA 3D GABLE ROOF . . . . . . . . . . . 57
4.5.5.2. GEOMETRIA 3D HIPPED ROOF . . . . . . . . . . . 58
4.5.5.3. GEOMETRIA 3D MANSARD ROOF . . . . . . . . . 59
4.5.5.4. GEOMETRIA 3D GAMBREL ROOF . . . . . . . . . 60
4.5.5.5. GEOMETRIA 3D SHED ROOF . . . . . . . . . . . . 62
i
5. RESULTADOS Y CONCLUSIONES 645.1. RESULTADOS GABLE ROOF . . . . . . . . . . . . . . . . . . . . . . 64
5.2. RESULTADOS HIPPED ROOF . . . . . . . . . . . . . . . . . . . . . . 66
5.3. RESULTADOS MANSARD ROOF . . . . . . . . . . . . . . . . . . . . 68
5.4. RESULTADOS SHED ROOF . . . . . . . . . . . . . . . . . . . . . . . 70
5.5. RESULTADOS GAMBREL ROOF . . . . . . . . . . . . . . . . . . . . 72
5.6. CONCLUSIONES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
6. BIBLIOGRAFIA 76
ii
Indice de figuras
2.1. Diagrama Funcionamiento House Builder . . . . . . . . . . . . . . . . . 4
2.2. Partes Librerıa House Builder . . . . . . . . . . . . . . . . . . . . . . . 4
2.3. Resultado House Builder con cubiertas sencillas . . . . . . . . . . . . . . 5
2.4. Esquema cubierta House Builder simple antes algoritmo . . . . . . . . . 5
2.5. Esquema cubierta House Builder compuesta despues algoritmo . . . . . . 6
2.6. Tipos de Cubiertas a Implementar . . . . . . . . . . . . . . . . . . . . . 6
4.1. Cubierta Compuesta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.2. Descomposicion Cubierta Compuesta en Cubiertas Simples . . . . . . . . 14
4.3. Visualizacion Descomposicion en Cubiertas Simples . . . . . . . . . . . 14
4.4. Vertices y Polıgonos de una Cubierta . . . . . . . . . . . . . . . . . . . . 15
4.5. Ejemplo: Coordenadas de los vertices de una Vivienda . . . . . . . . . . 16
4.6. Rectangulos proporcionados por el Optimizador . . . . . . . . . . . . . . 16
4.7. Contorno de la Vivienda . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.8. Division en rectangulos por los ejes de cada vertice . . . . . . . . . . . . 18
4.9. Ejemplo Extension de Rectangulo . . . . . . . . . . . . . . . . . . . . . 19
4.10. Ejemplo Extension de Rectangulo hacia Arriba . . . . . . . . . . . . . . 19
4.11. Ejemplo Extension de Rectangulo hacia la Derecha . . . . . . . . . . . . 20
4.12. Extension de Rectangulos: Rectangulo 1 . . . . . . . . . . . . . . . . . . 20
4.13. Extension de Rectangulos: Rectangulo 2 . . . . . . . . . . . . . . . . . . 21
4.14. Extension de Rectangulos: Rectangulo 3 . . . . . . . . . . . . . . . . . . 21
4.15. Extension de Rectangulos: Rectangulo 4 . . . . . . . . . . . . . . . . . . 22
4.16. Extension de Rectangulos: Rectangulo 5 . . . . . . . . . . . . . . . . . . 22
4.17. Extension de Rectangulos: Rectangulo 6 . . . . . . . . . . . . . . . . . . 23
4.18. Extension de Rectangulos: Rectangulo 7 . . . . . . . . . . . . . . . . . . 23
4.19. Tipos de tejados que requieren Algoritmo Modificacion de Rectangulos . 24
4.20. Cubierta con secciones incorrectas . . . . . . . . . . . . . . . . . . . . . 24
4.21. Cubierta con areas incorrectas de interseccion . . . . . . . . . . . . . . . 25
4.22. Cubierta con areas correctas de interseccion . . . . . . . . . . . . . . . . 25
4.23. Cubierta correcta tras Algoritmo Modificacion de Rectangulos . . . . . . 25
4.24. Modificacion de Rectangulos: Rectangulo 1 . . . . . . . . . . . . . . . . 26
4.25. Modificacion de Rectangulos: Rectangulo 2 . . . . . . . . . . . . . . . . 26
4.26. Modificacion de Rectangulos: Rectangulo 3 . . . . . . . . . . . . . . . . 27
4.27. Modificacion de Rectangulos: Rectangulo 4 . . . . . . . . . . . . . . . . 27
iii
4.28. Modificacion de Rectangulos: Rectangulo 5 . . . . . . . . . . . . . . . . 28
4.29. Modificacion de Rectangulos: Rectangulo 6 . . . . . . . . . . . . . . . . 28
4.30. Modificacion de Rectangulos: Rectangulo 7 . . . . . . . . . . . . . . . . 29
4.31. Gambrel Roof . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.32. Hipped Roof . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.33. Shed Roof . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.34. Mansard Roof . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.35. Gable Roof . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.36. Diferencia entre Punto Interior y Punto de Contorno . . . . . . . . . . . . 33
4.37. Diferencia entre Punto Interior y Punto de Contorno: Puntos Auxiliares . 33
4.38. Formacion de Aristas a partir de Puntos: Paso 1 . . . . . . . . . . . . . . 34
4.39. Formacion de Aristas a partir de Puntos: Paso 2 . . . . . . . . . . . . . . 34
4.40. Buscar Enlace para Arista . . . . . . . . . . . . . . . . . . . . . . . . . . 35
4.41. Enlace para Arista Encontrado . . . . . . . . . . . . . . . . . . . . . . . 35
4.42. Vertices Necesarios e Innecesarios en un Contorno . . . . . . . . . . . . 36
4.43. Construccion de Contorno: Paso 1 . . . . . . . . . . . . . . . . . . . . . 39
4.44. Construccion de Contorno: Paso 2 . . . . . . . . . . . . . . . . . . . . . 39
4.45. Construccion de Contorno: Paso 3 . . . . . . . . . . . . . . . . . . . . . 40
4.46. Construccion de Contorno: Paso 4 . . . . . . . . . . . . . . . . . . . . . 40
4.47. Construccion de Contorno: Paso 5 . . . . . . . . . . . . . . . . . . . . . 41
4.48. Construccion de Contorno: Paso 6 . . . . . . . . . . . . . . . . . . . . . 41
4.49. Construccion de Contorno: Paso 7 . . . . . . . . . . . . . . . . . . . . . 42
4.50. Construccion de Contorno: Paso 8 . . . . . . . . . . . . . . . . . . . . . 42
4.51. Construccion de Contorno: Paso 9 . . . . . . . . . . . . . . . . . . . . . 43
4.52. Construccion de Contorno: Paso 10 . . . . . . . . . . . . . . . . . . . . 43
4.53. Trazo de una Diagonal por un Vertice de Contorno . . . . . . . . . . . . 44
4.54. Trazo de las Diagonales por los Vertices de Contorno . . . . . . . . . . . 44
4.55. Diferencia Rectangulo Contenido y No Contenido en Contorno . . . . . . 45
4.56. Creacion de Rectangulos: Paso 1 . . . . . . . . . . . . . . . . . . . . . . 46
4.57. Creacion de Rectangulos: Paso 2 . . . . . . . . . . . . . . . . . . . . . . 47
4.58. Creacion de Rectangulos: Paso 3 . . . . . . . . . . . . . . . . . . . . . . 47
4.59. Creacion de Rectangulos: Paso 4 . . . . . . . . . . . . . . . . . . . . . . 47
4.60. Creacion de Rectangulos: Paso 5 . . . . . . . . . . . . . . . . . . . . . . 48
4.61. Creacion de Rectangulos: Paso 6 . . . . . . . . . . . . . . . . . . . . . . 48
4.62. Expansion Rectangulo: Permutacion {Abajo, Derecha, Arriba, Izquierda} 49
4.63. Expansion Rectangulo: Permutacion {Arriba, Izquierda, Abajo, Derecha} 49
4.64. Expansion Rectangulo: Permutacion {Izquierda, Abajo, Derecha, Arriba} 49
4.65. Expansion Rectangulo: Permutacion {Izquierda, Arriba, Derecha, Abajo} 50
4.66. Expansion de Rectangulos a lo largo del eje y . . . . . . . . . . . . . . . 50
4.67. Expansion de Rectangulos a lo largo del eje x . . . . . . . . . . . . . . . 51
4.68. Expansion de Rectangulos Posible y No Posible . . . . . . . . . . . . . . 51
4.69. Rectangulos Verticales, Horizontales e Iguales . . . . . . . . . . . . . . . 53
4.70. Interseccion por la Derecha . . . . . . . . . . . . . . . . . . . . . . . . . 54
4.71. Interseccion por la Derecha Resuelta . . . . . . . . . . . . . . . . . . . . 54
iv
4.72. Interseccion por la Izquierda . . . . . . . . . . . . . . . . . . . . . . . . 54
4.73. Interseccion por la Izquierda Resuelta . . . . . . . . . . . . . . . . . . . 55
4.74. Interseccion por la Arriba . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.75. Interseccion por la Arriba Resuelta . . . . . . . . . . . . . . . . . . . . . 56
4.76. Interseccion por la Abajo . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.77. Interseccion por la Abajo Resuelta . . . . . . . . . . . . . . . . . . . . . 56
4.78. Construccion Geometrıa 3D Gable Roof . . . . . . . . . . . . . . . . . . 58
4.79. Construccion Geometrıa 3D Hipped Roof . . . . . . . . . . . . . . . . . 59
4.80. Construccion Geometrıa 3D Mansard Roof . . . . . . . . . . . . . . . . 60
4.81. Construccion Geometrıa 3D Gambrel Roof . . . . . . . . . . . . . . . . 62
4.82. Construccion Geometrıa 3D Shed Roof . . . . . . . . . . . . . . . . . . 63
5.1. Gable Roof Vista 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
5.2. Gable Roof Vista 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
5.3. Gable Roof Vista 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.4. Gable Roof Vista 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.5. Gable Roof Vista 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.6. Gable Roof Vista 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
5.7. Hipped Roof Vista 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
5.8. Hipped Roof Vista 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
5.9. Hipped Roof Vista 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
5.10. Hipped Roof Vista 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
5.11. Hipped Roof Vista 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
5.12. Hipped Roof Vista 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
5.13. Mansard Roof Vista 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
5.14. Mansard Roof Vista 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
5.15. Mansard Roof Vista 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
5.16. Mansard Roof Vista 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
5.17. Mansard Roof Vista 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
5.18. Mansard Roof Vista 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
5.19. Shed Roof Vista 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
5.20. Shed Roof Vista 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
5.21. Shed Roof Vista 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
5.22. Shed Roof Vista 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
5.23. Shed Roof Vista 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
5.24. Gambrel Roof Vista 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
5.25. Gambrel Roof Vista 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
5.26. Gambrel Roof Vista 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
5.27. Gambrel Roof Vista 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.28. Gambrel Roof Vista 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.29. Gambrel Roof Vista 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
v
1 | RESUMEN
1.1. RESUMEN EN ESPANOLLurtis Rules es una empresa dedicada al desarrollo de herramientas que contribuyan
a mejorar la productividad de la industria de creacion de contenidos digitales. Su primera
herramienta, House Builder, es un asistente que permite a un usuario, sin necesidad de
tener conocimientos tecnicos de modelado, crear una edificacion en 3D que pueda ser
importada en sus proyectos directamente. House Builder genera, en pocos minutos, el tra-
bajo equivalente a dos semanas de un modelador profesional. El usuario introduce unas
breves descripciones sobre el diseno que desea, como el contorno o el numero de plantas
del edificio, y House Builder crea automaticamente una edificacion completa con gran
cantidad de elementos y detalles.
Entre los elementos que House Builder genera procedimentalmente se encuentran las
cubiertas o tejados de las edificaciones. Estas cubiertas pueden ser simples o compuestas.
Estas ultimas son aquellas que, por su contorno irregular, estan constituidas por la inter-
seccion de varias cubiertas simples (rectangulares). Para la generacion de una cubierta
compuesta, el algoritmo parte de las dimensiones del area que esta ocupa sobre el plano
horizontal y, a continuacion, la divide en subareas rectangulares que representen, cada
una, las dimensiones de las distintas cubiertas simples en que se descompone la cubierta
compuesta.
Una vez obtenidas las dimensiones de cada cubierta simple se construye del modelo
3D de cada una de ellas, con el fin de obtener el modelo 3D de la cubierta compuesta. Este
algoritmo permite construir distintos tipos o geometrıas de cubiertas simples (a dos aguas,
a cuatro aguas, etc), lo que da lugar a distintos tipos de cubiertas compuestas que Hou-
se Builder puede utilizar para enriquecer sus modelos y hacerlos mas atractivos y realistas.
1
1.2. RESUMEN EN INGLESLurtis Rules is a company dedicated to the development of tools that help the industry
of digital content creation to improve their productivity. Lurtis Rules’ first tool, House
Builder, is a software that allows a user, without any technical knowledge of 3D mode-
ling, to create a building that can be directly imported into their projects. House Builder
generates, in a few minutes, just as much work as a professional modeler would do in two
weeks. The user enters brief descriptions of the desired design, as could be its contour or
the number of floors, and House Builder automatically creates a complete building with
lots of elements and details.
Among the elements that House Builder generates procedurally we can find the buil-
ding covers or roofs, which may be simple or composite. The composite ones are those
that, because of their irregular shapes, are formed by the intersection of several simple
(rectangular) roofs. In order to generate a composite roof, the algorithm receives the size
of the area that it occupies on the horizontal plane, and divides it into rectangular subareas
that represent the dimensions of the various simple roofs that shape the composite roof.
Once obtained the dimensions of each simple roof, they are individually raised into
3D dimensions, and so the model of the composite roof gets completely built. This al-
gorithm enables the construction of different geometries or types of simple roofs (gable,
hipped, mansard, gambrel, etc). This diversity of forms results in different types of com-
posite roofs, which can be used by House Builder to enrich its models and make them
more attractive and realistic.
2
2 | INTRODUCCION
En 2017, la industria de los videojuegos y de los contenidos digitales movera millones
de dolares. Se trata de un negocio altamente fragmentado debido a la existencia de gran
cantidad de desarrolladores independientes, pequenos estudios y creadores de contenidos
que disenan productos vinculados con el ocio y el entretenimiento. Ademas, en este sec-
tor las tasas de fracaso son muy elevadas. En el caso de los videojuegos, la mitad de los
proyectos no llegan a finalizarse, siendo solo un 5 %, aproximadamente, rentables. Las
razones de estas tasas de fracaso son multiples. Las mas destacadas, en un 20 % de los
casos, son los elevados costes de produccion y desarrollo.
En una produccion del sector digital, el 25 % de los costes se deben al modelado
artıstico. Una forma de reducir estos costes es la automatizacion de los procesos que lle-
van a cabo dicha tarea de modelado.
Lurtis Rules es una empresa dedicada al desarrollo de herramientas basadas en Inte-
ligencia Artificial y Optimizacion cuyo objetivo es dar asistencia y soporte a la industria
de creacion de contenidos digitales (animacion, videojuegos, VFX. . . ) ayudando a mejo-
rar la productividad, acelerando y optimizando las fases de desarrollo de contenidos. Con
esta idea nace House Builder, su primera herramienta.
House Builder es un asistente para el modelado de edificios e interiores destinado a las
industrias de animacion y de videojuegos. Se trata de un servicio alojado en la nube que
permitira a sus usuarios, sin necesidad de conocimientos tecnicos de modelado, crear una
edificacion en 3D que podra ser incluida en sus proyectos directamente. House Builder
ofrece la capacidad de generar, en pocos minutos, el trabajo equivalente a dos semanas
de un modelador profesional. Proporciona una reduccion de hasta el 90 % de las horas de
trabajo necesarias para obtener el mismo modelo de manera tradicional, lo que produce
un ahorro directo del 75 % sobre el gasto derivado de este tipo de desarrollos, que suele
representar el 25-30 % de los costes de produccion.
Con House Builder, el disenador introduce descripciones de diseno de alto nivel, co-
mo el contorno del edificio, el numero de plantas o el numero de niveles subterraneos, y a
continuacion estos datos pasan al optimizador de House Builder, programa encargado de
ajustar y disenar, de forma automatica y dentro de los lımites establecidos, los elementos
interiores, habitaciones y pasillos. El optimizador proporciona como salida un script en
lenguaje Python, que ejecutado sobre la biblioteca de House Builder, implementada igual-
3
mente en Python, dara lugar a un archivo que contendra la representacion 3D del modelo
disenado, listo para ser importado en un programa de modelado y animacion en 3D como
Maya, 3DSMax, y otros.
Figura 2.1: Diagrama Funcionamiento House Builder
House Builder incluye en su librerıa funcionalidad para distintos programas de mode-
lado 3D, con el fin de poder exportar los resultados en un formato de archivo compatible
con el software que prefiera el usuario. La biblioteca de codigo de House Builder se en-
cuentra dividida en dos partes: por un lado encontramos la parte troncal (Librerıa LHB)
y por el otro, basandose en esta ultima, se encuentran las extensiones para los distintos
programas de modelado con los que trabaja House Builder: Maya, 3DsMax y FBX.
Figura 2.2: Partes Librerıa House Builder
Para la construccion de un elemento arquitectonico, se realizan en la Librerıa LHB
todos los calculos basicos que permiten la obtencion de la geometrıa del objeto en forma
de estructura de datos y, posteriormente, en la extension, se realizan las operaciones que
hacen uso de las librerıas propias del software de modelado escogido por el usuario, ope-
raciones que, a partir de los calculos realizados en la parte troncal, daran como resultado
la representacion en 3D del elemento buscado.
4
House Builder crea y disena cada elemento arquitectonico por separado, lo situa en su
posicion exacta y lo texturiza, dando lugar a la edificacion solicitada por el usuario tras
la fusion de todos los elementos. Entre los componentes disenados encontramos paredes,
suelos, techos, puertas, ventanas, escaleras y tejados.
Figura 2.3: Resultado House Builder con cubiertas sencillas
Durante este TFG se ha trabajado sobre la parte troncal (Librerıa LHB), en el diseno e
implementacion de un algoritmo de generacion de cubiertas compuestas. Posteriormente
se ha procedido a la creacion de los modelos 3D generados dentro de la expansion de
codigo para Autodesk Maya.
De forma previa al desarrollo de este algoritmo, las cubiertas utilizadas por House
Builder son las que se muestran en la figura 2.3. El desarrollo de cubiertas compues-
tas proporciona resultados mas realistas, funcionales y arquitectonicamente correctos. La
diferencia entre ambos modelos se puede observar en las siguientes figuras.
Figura 2.4: Esquema cubierta House Builder simple antes algoritmo
5
Figura 2.5: Esquema cubierta House Builder compuesta despues algoritmo
La Figura 2.5 representa uno de los tipos de cubiertas que Lurtis Rules desea poder
generar. Con la implementacion de este nuevo algoritmo, House Builder tendra a su dis-
posicion una nueva variedad de tipos de cubiertas que podra utilizar para la elaboracion
de sus modelos, haciendolos mas atractivos y versatiles.
Los tipos de cubiertas que debe poder proporcionar este nuevo algoritmo son los si-
guientes: Gable Roof, Gambrel Roof, Mansard Roof, Hipped Roof y Shed Roof. El tipo
de tejado Flat Roof, la cubierta de mayor simplicidad, se encuentra ya implementada en
la librerıa de House Builder.
Figura 2.6: Tipos de Cubiertas a Implementar
6
3 | TRABAJOS PREVIOS
La produccion de modelos 3D es un proceso costoso en esfuerzo, dinero, tiempo y
habilidad, los cuales pueden quedar desperdiciados en el caso de producirse un fracaso
en el proyecto. Con el fin de facilitar y abaratar el proceso, han surgido numerosas he-
rramientas que tienen como objetivo automatizar y acelerar la generacion de contenido
digital.
En el proceso de creacion del contenido digital de un videojuego, encontramos diver-
sos tipos de elementos a disenar: personajes, objetos, elementos arquitectonicos, paisajes,
etc. Es posible generar los mismos haciendo uso de herramientas que contribuyen al al-
cance de un flujo de trabajo eficiente y de menor complejidad:
BuildR: Permite a los usuarios crear construcciones en Unity3D sin la necesidad de
utilizar otros programas de modelado 3D externos. La generacion de construcciones
es simple y sencilla de realizar. Los modelos generados pueden ser editados desde
Unity y exportados en un formatos como OBJ o FBX. BuildR permite la inclusion
de elementos adicionales decorativos y disenar el interior de los modelos.[3]
MakeHuman: Es una aplicacion implementada en Python que permite la creacion
de modelos 3D de seres humanos de forma realista, listos para su uso en juegos,
animaciones, ilustraciones o software de diseno grafico como Zbrush o Mudbox.[6]
7
Fuse CC: Sin necesidad de tener conocimientos sobre modelado 3D, Fuse CC hace
posible la creacion de personajes humanos de forma sencilla a partir de un extenso
catalogo de partes del cuerpo, tipos de pelo, prendas y texturas para la ropa.[1]
CityGen: Genera procedimentalmente ambientes urbanos modernos con carreteras,
construcciones, plantas, terrenos y arboles, que puedan ser directamente incorpo-
rados en videojuegos 3D. El usuario puede manipular los elementos geometricos
y especificar diversos aspectos de la generacion procedimental, es decir, tiene un
control sobre el proceso creativo.[2]
8
SketchUp: Es un software de modelado 3D con gran cantidad de aplicaciones, entre
ellas la creacion de viviendas con gran nivel de detalle. El mecanismo de edicion es
muy sencillo y automatico. SketchUp asimismo permite la creacion de modelos 3D
de cualquier tipo de objeto.
Revit: Aporta herramientas para el diseno arquitectonico y la construccion de vi-
viendas y edificios. Permite la adicion de gran cantidad de elementos arquitectoni-
cos y decorativos. Es un software de gran rendimiento que permite modelar de
forma muy eficaz.[5]
9
4 | DESARROLLO
4.1. HERRAMIENTAS UTILIZADASPython: es un lenguaje de programacion interpretado y con una sintaxis que favo-
rece la legibilidad del codigo. Se trata de un lenguaje orientado a objetivos, inter-
pretado y con tipado dinamico. Resulta muy comodo y sencillo de aprender. Entre
las librerıas de Python utilizadas encontramos Sympy, que ofrece numerosos al-
goritmos geometricos que resultan de gran utilidad para el tratamiento de areas y
perımetros[11].
Autodesk Maya 2015: es un software dedicado al desarrollo de graficos 3D, efectos
especiales y animacion. Autodesk Maya se caracteriza por su gran potencia y su
versatilidad para la expansion y personalizacion de sus herramientas y de su inter-
faz. Ha tenido un gran impacto en la industria del cine y de los videojuegos, y su
uso se ha extendido considerablemente en los ultimos anos.
Para la utilizacion de Autodesk Maya sin hacer uso de la interfaz grafica, es decir,
por medio de codigo, ha sido necesario investigar y aprender de forma previa la fun-
cionalidad que ofrece la API de Maya para Python[4]. Las principales herramientas
de esta librerıa que han sido utilizadas para la construccion de los modelos en 3D
de las cubiertas han sido:
• Herramientas de seleccion de objetos, vertices, aristas y caras.
• Herramientas de traslacion de objetos, vertices, aristas y caras.
• Herramientas de rotacion de objetos, vertices, aristas y caras.
• Herramientas para la creacion, edicion y borrado de nodos de jerarquıa.
• Herramientas para la creacion de prismas poligonales.
• Herramientas para la resta booleana entre objetos.
• Herramientas para el duplicado de objetos.
Eclipse Mars: es un IDE, es decir, una herramienta que facilita el trabajo a la hora
de desarrollar aplicaciones, proporcionando ayudas visuales en la sintaxis, plugins,
y programas depuradores de codigo. Eclipse Mars permite tener una vista jerarqui-
ca de los proyectos sobre los que se trabaja, personalizar la interfaz y anadir fun-
cionalidades y atajos para lograr una labor mas eficaz. De igual forma, permite la
10
conexion a Autodesk Maya de forma sencilla. Es por esto ultimo, especialmente,
que se ha elegido este entorno para trabajar.
PyDev: es un plugin que permite utilizar Eclipse como un IDE para Python. Posee
caracterısticas como el autocompletado de codigo, el analisis de codigo, la depu-
racion de codigo, una consola interactiva, refactorizacion, etc. Resulta un entorno
sencillo y comodo de utilizar, ası como perfecto para el manejo de los ficheros y
paquetes de la biblioteca de House Builder.
Eclipse Maya Editor: La consola propia de Autodesk Maya no permite el manejo de
ficheros y resulta algo incomoda, por lo que se ha optado por un entorno de trabajo
mas complejo y con mayores ventajas.
Eclipse Maya Editor es un plugin que permite utilizar Eclipse (PyDev) como un IDE
para Autodesk Maya. Eclipse Maya Editor establece la comunicacion entre Maya y
Eclipse de forma biyectiva. Entre sus principales funcionalidades encontramos:
• Importar el script que esta siendo editado a Maya, es decir, importar o recargar
el script al directorio de trabajo (path) de Maya.
• Enviar la totalidad de los contenidos de los ficheros del editor a Maya.
• Enviar una region de codigo seleccionada a Maya.
• Ver los resultados que devuelve la consola de Maya en la consola de Eclipse.
• Acceder de forma rapida a la documentacion de las librerıas de Maya.
Eclipse Autocompletion for Maya: El autocompletado de comandos en Eclipse se
logra anadiendo los ficheros de formato “.pypredef” del directorio de Maya al path
del IDE. Con esta accion se logra ademas que Eclipse muestre la documentacion
asociada a cada comando (procedente de la documentacion de Maya).
Configuracion de Maya para establecer la conexion con Eclipse: es necesario eje-
cutar una seccion de codigo en Autodesk Maya para establecer la conexion con
Eclipse. Esta accion debe ser realizada cada vez que se abra Autodesk Maya y se
desee que reciba codigo de Eclipse. Una forma rapida de configuracion es crear un
boton en la interfaz de Maya que ejecute la seccion de codigo mencionada.
Configuracion de Eclipse para establecer la conexion con Maya y acceder a las
librerıas de Python y a la API de Maya para Python: es necesario anadir al path
de Eclipse las librerıas de Maya, ası como configurar el interprete que utilizara el
proyecto de House Builder, de modo que este sea el proporcionado por Maya, y no
un interprete de Python como tal. La version de Python que utiliza Autodesk Maya
es la 2.7.
Instalacion de Software de Versionado (Git): La utilizacion de un software de ver-
sionado es fundamental para mantener el codigo ordenado y seguro. Se ha utilizado
un repositorio de Bitbucket para la fusion del codigo desarrollado con el codigo del
11
resto del equipo de House Builder, y para llevar un control del avance de las tareas
a lo largo de los meses de trabajo.
Instalacion de Microsoft Azure (librerıas): La adicion de las librerıas de Azure al
proyecto ha permitido la descarga dinamica de texturas y otros elementos que utiliza
House Builder para la creacion de las edificaciones.
4.2. PLANTEAMIENTO INICIAL PARA LA GENERA-CION DE CUBIERTAS
Durante las primeras semanas de estas practicas, tuvieron lugar varias reuniones con
Lurtis Rules con el fin de definir la metodologıa de trabajo y el modo de alcanzar los
objetivos propuestos.
En dichas reuniones se tomo la decision de utilizar, como algoritmo de generacion de
cubiertas, el Straight Skeleton Algorithm. Se trata de un algoritmo de creacion de tejados
a cuatro aguas a partir de las coordenadas del area que se desea cubrir. Para su aplicacion
en House Builder se hizo uso de la implementacion en Python de Oliver Teboul[9].
Previamente a la incorporacion del codigo de Oliver Teboul a la librerıa de Lurtis
Rules, se realizaron una serie de pruebas con el fin de comprobar que el algoritmo cumplıa
con los requisitos de este proyecto:
1. No presenta problemas con contornos complejos.
2. No presenta problemas con contornos formados por angulos rectos.
3. Contempla la presencia de patios interiores.
4. El tiempo de ejecucion es aceptable.
5. La salida del algoritmo es una estructura de datos util para HouseBuilder.
El codigo de Oliver Teboul posee integrada una interfaz grafica, y la eliminacion de la
misma fue una de las primeras tareas a realizar sobre esta implementacion.
Una vez puesto en ejecucion el codigo de Oliver Teboul junto con la librerıa de House
Builder, se observo que el funcionamiento no era el esperado. Se encontraron los siguien-
tes problemas:
1. Para una entrada muy similar a una entrada con resultado exitoso, devuelve error.
2. Segun el orden de los vertices del contorno, el resultado es exitoso o error.
3. Segun los angulos de que formen las aristas del contorno, el resultado es exitoso o
error.
12
4. Segun la forma de contorno, el resultado es exitoso o error.
Tras haber empleado una cantidad de tiempo considerable en la solventacion de estos
fallos sin la obtencion del funcionamiento perfecto del algoritmo, se comenzo a contem-
plar la posibilidad de buscar una nueva vıa para la generacion de cubiertas. Las razones
para el cambio son las siguientes:
El codigo de Oliver Teboul presenta varios fallos independientes, cuyo origen re-
sulta difıcil de detectar debido a la complejidad de la implementacion.
Proporciona unicamente soluciones para cubiertas a cuatro aguas. HouseBuilder
desea poder ofrecer al usuario distintas variedades y tipologıas de tejados.
El flujo de la implementacion de Oliver Teboul resulta incoherente en muchas sec-
ciones de codigo. Se realizan, de igual forma, instrucciones innecesarias.
Como consecuencia, se ha creado y disenado un nuevo algoritmo para la generacion
de tejados. Recibe la misma entrada y devuelve la misma salida que el algoritmo del
Straight Skeleton, sin embargo, su funcionamiento es completamente distinto.
Este nuevo metodo, posee ademas la ventaja de poder generar tejados de diferentes di-
senos (a cuatro aguas, a dos aguas, etc), e incluso de poder generar cubiertas que combine
distitnos tipos de tejados.
4.3. ALGORITMO DE GENERACION DE CUBIERTAS
4.3.1. FUNDAMENTO Y OBJETIVOEl algoritmo de generacion de cubiertas disenado se basa en la siguiente idea:
Una cubierta compuesta esta formada por la interseccion de cubiertas simples.
Figura 4.1: Cubierta Compuesta
13
Figura 4.2: Descomposicion Cubierta Compuesta en Cubiertas Simples
Figura 4.3: Visualizacion Descomposicion en Cubiertas Simples
Como se puede observar, la cubierta compuesta de la Figura 4.1, esta formada por las
tres cubiertas simples indicadas en las figuras 4.2 y 4.3. Al intersectar las tres cubiertas
simples, se forma la cubierta compuesta.
El objetivo del algoritmo se basa la idea de hallar las dimensiones de cada una de las
cubiertas sencillas, con el fin de que, tras la construccion del modelo 3D de cada una de
ellas, obtengamos el modelo 3D de la cubierta compuesta.
4.3.2. FUNCIONAMIENTOUna vez el optimizador ha elaborado el diseno de la edificacion de acuerdo a las di-
rectrices proporcionadas por usuario en la interfaz grafica, genera un script de Python que
invocara a la creacion de cada elemento arquitectonico de la construccion.
En House Builder, el proceso de creacion de cualquier elemento se divide en dos fa-
ses. En primer lugar se crea la parte logica del elemento, y posteriormente la geometrıa
en 3D del elemento.
En el caso de una cubierta, la construccion de la parte logica consiste en el calculo de
14
los vertices de la cubierta y de los distintos polıgonos que forman sus caras. La geometrıa
en 3D se consigue enviando al programa modelador estos datos para su representacion:
vertices y polıgonos.
Figura 4.4: Vertices y Polıgonos de una Cubierta
Para la parte logica, el optimizador proporciona una lista de rectangulos que cubren
completamente el area sobre la que se desea construir el tejado. No es necesario que la lis-
ta de rectangulos sea una en concreto. La unica condicion necesaria es que los rectangulos
cubran todo el area del tejado.
El algoritmo de creacion de cubiertas se divide en 5 pasos, y en cada uno se aplica un
algoritmo distinto que depende del resultado del anterior:
1. Algoritmo de creacion de contorno.
2. Algoritmo de creacion de rectangulos.
3. Algoritmo de extension de rectangulos.
4. Algoritmo de modificacion de rectangulos.
5. Creacion de geometrıa 3D.
Visualizaremos el funcionamiento del algoritmo utilizando como ejemplo una vivien-
da con un patio interior, para que la aplicacion del proceso resulte mas compleja. Los
algoritmos de cada paso se explican brevemente en este apartado, no obstante, su imple-
mentacion y funcionamiento se desarrollaran con mayor detalle en apartados posteriores.
A continuacion, explicaremos el formato de la entrada del algoritmo de creacion de
cubiertas, siendo las coordenadas de la vivienda las siguientes:
15
Figura 4.5: Ejemplo: Coordenadas de los vertices de una Vivienda
El optimizador, para la construccion de una cubierta, debe proporcionar una lista de
rectangulos que definan, en su conjunto, el area que desea cubrir. El optimizador desco-
noce la sucesion de vertices que forman el contorno de dicha area, es por ello que propor-
ciona una lista de rectangulos. La tarea de hallar el contorno de esta lista de rectangulos
sera la primera labor a realizar por el algoritmo de construccion de cubiertas.
Una posible lista de rectangulos que definen los lımites de la cubierta deseada son:
Figura 4.6: Rectangulos proporcionados por el Optimizador
16
Rectangulo1 = [[0,6],[8,6],[8,10],[0,10]]Rectangulo2 = [[8,6],[12,6],[12,8],[8,8]]Rectangulo3 = [[6,4],[9,4],[9,6],[6,6]]
Rectangulo4 = [[0,0],[10,0],[10,4],[0,4]]Rectangulo5 = [[12,2],[16,2],[16,10],[12,10]]Rectangulo6 = [[10,2],[12,2],[12,4],[10,4]]
A partir de la lista de rectangulos proporcionada por el optimizador, el algoritmo de
construccion de cubiertas halla, en primer lugar, la sucesion de vertices que forman el
contorno del area definida por dicha lista. Tras invocar al algoritmo de construccion del
contorno, la salida obtenida para la vivienda propuesta serıa:
Figura 4.7: Contorno de la Vivienda
[[[16, 2], [16, 10], [12, 10], [12, 8], [8, 8], [8, 10], [0, 10], [0, 6], [6, 6], [6, 4], [0, 4],[0, 0], [10, 0], [10, 2]], [[12, 4], [12, 6], [9, 6], [9, 4]]]
Como se puede observar, el algoritmo ha devuelto dos listas de vertices. La primera
lista es el contorno exterior y la segunda es el contorno del patio interior.
El siguiente paso es la aplicacion del algoritmo de creacion de rectangulos. En base al
contorno hallado, por cada uno de los vertices del mismo se traza una vertical y una hori-
zontal, quedando la vivienda dividida en secciones rectangulares. El algoritmo devolvera
las coordenadas de cada uno de los rectangulos resultantes.
17
Figura 4.8: Division en rectangulos por los ejes de cada vertice
Rectangulo1 = [(0.0, 0.0), (6.0, 0.0), (6.0, 2.0), (0.0, 2.0)]Rectangulo2 = [(6.0, 0.0), (8.0, 0.0), (8.0, 2.0), (6.0, 2.0)]Rectangulo3 = [(8.0, 0.0), (9.0, 0.0), (9.0, 2.0), (8.0, 2.0)]
Rectangulo4 = [(9.0, 0.0), (10.0, 0.0), (10.0, 2.0), (9.0, 2.0)]Rectangulo5 = [(0.0, 2.0), (6.0, 2.0), (6.0, 4.0), (0.0, 4.0)]Rectangulo6 = [(6.0, 2.0), (8.0, 2.0), (8.0, 4.0), (6.0, 4.0)]Rectangulo7 = [(8.0, 2.0), (9.0, 2.0), (9.0, 4.0), (8.0, 4.0)]
Rectangulo8 = [(9.0, 2.0), (10.0, 2.0), (10.0, 4.0), (9.0, 4.0)]Rectangulo9 = [(10.0, 2.0), (12.0, 2.0), (12.0, 4.0), (10.0, 4.0)]Rectangulo10 = [(12.0, 2.0), (16.0, 2.0), (16.0, 4.0), (12.0, 4.0)]
Rectangulo11 = [(6.0, 4.0), (8.0, 4.0), (8.0, 6.0), (6.0, 6.0)]Rectangulo12 = [(8.0, 4.0), (9.0, 4.0), (9.0, 6.0), (8.0, 6.0)]
Rectangulo13 = [(12.0, 4.0), (16.0, 4.0), (16.0, 6.0), (12.0, 6.0)]Rectangulo14 = [(0.0, 6.0), (6.0, 6.0), (6.0, 8.0), (0.0, 8.0)]Rectangulo15 = [(6.0, 6.0), (8.0, 6.0), (8.0, 8.0), (6.0, 8.0)]Rectangulo16 = [(8.0, 6.0), (9.0, 6.0), (9.0, 8.0), (8.0, 8.0)]
Rectangulo17 = [(9.0, 6.0), (10.0, 6.0), (10.0, 8.0), (9.0, 8.0)]Rectangulo18 = [(10.0, 6.0), (12.0, 6.0), (12.0, 8.0), (10.0, 8.0)]Rectangulo19 = [(12.0, 6.0), (16.0, 6.0), (16.0, 8.0), (12.0, 8.0)]Rectangulo20 = [(0.0, 8.0), (6.0, 8.0), (6.0, 10.0), (0.0, 10.0)]Rectangulo21 = [(6.0, 8.0), (8.0, 8.0), (8.0, 10.0), (6.0, 10.0)]
Rectangulo22 = [(12.0, 8.0), (16.0, 8.0), (16.0, 10.0), (12.0, 10.0)]
18
A partir de los rectangulos hallados en el paso anterior, se procedera a la aplicacion
del algoritmo de extension de rectangulos. Este algoritmo consiste en extender/prolongar
hacia arriba, abajo, derecha o izquierda el area ocupada por cada rectangulo de la lista
anterior, tanto como se pueda hasta que colisione con los lımites de la vivienda. Si reali-
zamos la extension el rectangulo 1, se obtendra el siguiente resultado:
Figura 4.9: Ejemplo Extension de Rectangulo
Figura 4.10: Ejemplo Extension de Rectangulo hacia Arriba
19
Como se puede observar,el rectangulo elegido no puede ser extendido hacia la iz-
quierda o hacia abajo, debido a que las aristas que lo forman coinciden con las aristas del
contorno de la vivienda.
Figura 4.11: Ejemplo Extension de Rectangulo hacia la Derecha
La aplicacion del algoritmo de extension de rectangulos consiste en realizar el pro-
ceso descrito con cada rectangulo de la lista proporcionada por el algoritmo anterior. El
resultado es una nueva lista de rectangulos, que para el ejemplo planteado seran:
Figura 4.12: Extension de Rectangulos: Rectangulo 1
20
Rectangulo1 = [[(0.0, 0.0), (10.0, 0.0), (10.0, 4.0), (0.0, 4.0)]
Figura 4.13: Extension de Rectangulos: Rectangulo 2
Rectangulo1 = [[(0.0, 0.0), (10.0, 0.0), (10.0, 4.0), (0.0, 4.0)]Rectangulo2 = [(6.0, 0.0), (8.0, 0.0), (8.0, 10.0), (6.0, 10.0)]
Figura 4.14: Extension de Rectangulos: Rectangulo 3
Rectangulo1 = [[(0.0, 0.0), (10.0, 0.0), (10.0, 4.0), (0.0, 4.0)]Rectangulo2 = [(6.0, 0.0), (8.0, 0.0), (8.0, 10.0), (6.0, 10.0)]
Rectangulo3 = [(6.0, 0.0), (9.0, 0.0), (9.0, 8.0), (6.0, 8.0)]
21
Figura 4.15: Extension de Rectangulos: Rectangulo 4
Rectangulo1 = [[(0.0, 0.0), (10.0, 0.0), (10.0, 4.0), (0.0, 4.0)]Rectangulo2 = [(6.0, 0.0), (8.0, 0.0), (8.0, 10.0), (6.0, 10.0)]
Rectangulo3 = [(6.0, 0.0), (9.0, 0.0), (9.0, 8.0), (6.0, 8.0)]Rectangulo4 = [(0.0, 2.0), (16.0, 2.0), (16.0, 4.0), (0.0, 4.0)]
Figura 4.16: Extension de Rectangulos: Rectangulo 5
22
Figura 4.17: Extension de Rectangulos: Rectangulo 6
Figura 4.18: Extension de Rectangulos: Rectangulo 7
Rectangulo1 = [[(0.0, 0.0), (10.0, 0.0), (10.0, 4.0), (0.0, 4.0)]Rectangulo2 = [(6.0, 0.0), (8.0, 0.0), (8.0, 10.0), (6.0, 10.0)]
Rectangulo3 = [(6.0, 0.0), (9.0, 0.0), (9.0, 8.0), (6.0, 8.0)]Rectangulo4 = [(0.0, 2.0), (16.0, 2.0), (16.0, 4.0), (0.0, 4.0)]
Rectangulo5 = [(12.0, 2.0), (16.0, 2.0), (16.0, 10.0), (12.0, 10.0)]Rectangulo6 = [(0.0, 6.0), (8.0, 6.0), (8.0, 10.0), (0.0, 10.0)]Rectangulo7 = [(0.0, 6.0), (16.0, 6.0), (16.0, 8.0), (0.0, 8.0)]]
23
El siguiente paso del algoritmo es la modificacion de los rectangulos, sin embargo
esto solo es necesario realizarlo para ciertos tipos de cubiertas: gable roof, gambrel roof
y shed roof.
Figura 4.19: Tipos de tejados que requieren Algoritmo Modificacion de Rectangulos
Cada rectangulo se corresponde con el area que ocupa cada cubierta simple. La modi-
ficacion de rectangulos consiste en la reduccion del area de ciertos rectangulos, es decir,
en la reduccion del tamano de ciertas cubiertas simples, con el fin de que no suceda el
fenomeno siguiente.
Figura 4.20: Cubierta con secciones incorrectas
Como podemos observar, esta cubierta compuesta (gable roof), esta formada por tres
cubiertas simples que intersectan entre sı. El area de las intersecciones (area sombreada
en la Figura 4.21) es demasiado extensa, provocando que en la cubierta final aparezcan
las zonas de cubierta simple rodeadas con lıneas discontinuas.
24
Figura 4.21: Cubierta con areas incorrectas de interseccion
Este problema se soluciona disminuyendo el area de las intersecciones a la mitad (dis-
minuyendo el area de una de las cubiertas por abajo y de otra de las cubiertas por la
izquierda), de forma que se eliminen las partes innecesarias.
Figura 4.22: Cubierta con areas correctas de interseccion
La cubierta que se generarıa a partir de los rectangulos obtenidos con la aplicacion del
algoritmo de modificacion de rectangulos es la siguiente:
Figura 4.23: Cubierta correcta tras Algoritmo Modificacion de Rectangulos
25
Para la vivienda utilizada como ejemplo en los pasos anteriores del algoritmo, los
rectangulos devueltos por el algoritmo de modificacion de rectangulos son los siguientes:
Figura 4.24: Modificacion de Rectangulos: Rectangulo 1
Rectangulo1 = [(6.0, 3.0), (8.0, 3.0), (8.0, 7.0), (6.0, 7.0)]
Figura 4.25: Modificacion de Rectangulos: Rectangulo 2
Rectangulo1 = [(6.0, 3.0), (8.0, 3.0), (8.0, 7.0), (6.0, 7.0)]Rectangulo2 = [(6.0, 2.0), (9.0, 2.0), (9.0, 8.0), (6.0, 8.0)]
26
Figura 4.26: Modificacion de Rectangulos: Rectangulo 3
Rectangulo1 = [(6.0, 3.0), (8.0, 3.0), (8.0, 7.0), (6.0, 7.0)]Rectangulo2 = [(6.0, 2.0), (9.0, 2.0), (9.0, 8.0), (6.0, 8.0)]
Rectangulo3 = [(12.0, 2.0), (16.0, 2.0), (16.0, 10.0), (12.0, 10.0)]
Figura 4.27: Modificacion de Rectangulos: Rectangulo 4
Rectangulo1 = [(6.0, 3.0), (8.0, 3.0), (8.0, 7.0), (6.0, 7.0)]Rectangulo2 = [(6.0, 2.0), (9.0, 2.0), (9.0, 8.0), (6.0, 8.0)]
Rectangulo3 = [(12.0, 2.0), (16.0, 2.0), (16.0, 10.0), (12.0, 10.0)]
27
Figura 4.28: Modificacion de Rectangulos: Rectangulo 5
Rectangulo4 = [(0.0, 0.0), (10.0, 0.0), (10.0, 4.0), (0.0, 4.0)]Rectangulo5 = [(0.0, 2.0), (16.0, 2.0), (16.0, 4.0), (0.0, 4.0)]
Figura 4.29: Modificacion de Rectangulos: Rectangulo 6
Rectangulo1 = [(6.0, 3.0), (8.0, 3.0), (8.0, 7.0), (6.0, 7.0)]Rectangulo2 = [(6.0, 2.0), (9.0, 2.0), (9.0, 8.0), (6.0, 8.0)]
Rectangulo3 = [(12.0, 2.0), (16.0, 2.0), (16.0, 10.0), (12.0, 10.0)]Rectangulo4 = [(0.0, 0.0), (10.0, 0.0), (10.0, 4.0), (0.0, 4.0)]
28
Figura 4.30: Modificacion de Rectangulos: Rectangulo 7
Rectangulo5 = [(0.0, 2.0), (16.0, 2.0), (16.0, 4.0), (0.0, 4.0)]Rectangulo6 = [(0.0, 6.0), (8.0, 6.0), (8.0, 10.0), (0.0, 10.0)]Rectangulo7 = [(0.0, 6.0), (16.0, 6.0), (16.0, 8.0), (0.0, 8.0))]
El ultimo paso de este algoritmo es la construccion de la geometrıa 3D de la cubierta
compuesta, lo cual se logra a partir de la construccion de la cubierta que se desee sobre
cada uno de los rectangulos obtenidos en el paso anterior.
El modelo 3D a construir dependera del tipo de cubierta elegido. En las siguientes
figuras se puede visualizar la planta, el perfil y el alzado de cada tipo de cubierta desarro-
llado. Los calculos para la generacion de cada uno de los tipos se explicaran mas adelante.
Figura 4.31: Gambrel Roof Figura 4.32: Hipped Roof
29
Figura 4.33: Shed Roof Figura 4.34: Mansard Roof
Figura 4.35: Gable Roof
4.4. PARAMETROS PARA LA CREACION CUBIER-TAS
Como se ha mencionado, el algoritmo de generacion de cubiertas recibe como entrada
una lista de rectangulos, no obstante, recibe otros parametros que permiten personalizar
el aspecto de la cubierta, como la inclinacion o la orientacion.
A continuacion se describen los parametros con que se invoca a la creacion de cada
tipo de cubierta, de esta manera observaremos la versatilidad del algoritmo y las posibili-
dades que ofrece al usuario.
4.4.1. PARAMETROS GABLE ROOFRectangulos: Lista de rectangulos que definen el area a cubrir.
30
Horizontal: Booleano que indica la orientacion que se desea que tengan las cubiertas
simples del tejado. Si es True estaran orientadas a lo largo del eje y, mientras que si
es False estaran orientadas a lo largo del eje x.
Inclinacion: Grados de inclinacion que se desea que tenga la cubierta con respecto
a la horizontal. A mayor inclinacion, mayor altura.
4.4.2. PARAMETROS HIPPED ROOFRectangulos: Lista de rectangulos que definen el area a cubrir.
Inclinacion: Grados de inclinacion que se desea que tenga la cubierta con respecto
a la horizontal. A mayor inclinacion, mayor altura.
4.4.3. PARAMETROS GAMBREL ROOFRectangulos: Lista de rectangulos que definen el area a cubrir
Horizontal: Booleano que indica la orientacion que se desea que tengan las cubiertas
simples del tejado. Si es True estaran orientadas a lo largo del eje y, mientras que si
es False estaran orientadas a lo largo del eje x.
Inclinacion: Grados de inclinacion que se desea que tenga la cubierta con respecto
a la horizontal. A mayor inclinacion, mayor altura.
4.4.4. PARAMETROS MANSARD ROOFRectangulos: Lista de rectangulos que definen el area a cubrir
Horizontal: Booleano que indica la orientacion que se desea que tengan las cubiertas
simples del tejado. Si es True estaran orientadas a lo largo del eje y, mientras que si
es False estaran orientadas a lo largo del eje x.
Inclinacion: Grados de inclinacion que se desea que tenga la cubierta con respecto
a la horizontal.
Altura: Altura que se desa que tenga la cubierta.
4.4.5. PARAMETROS SHED ROOFRectangulos: Lista de rectangulos que definen el area a cubrir
Inclinacion: Grados de inclinacion que se desea que tenga la cubierta con respecto
a la horizontal. A mayor inclinacion, mayor altura.
Orientacion: Numero entero que indica la orientacion que se desea que tengan las
cubiertas simples del tejado. Si es 1 estaran orientadas hacia el sur, si es 2 hacia el
este, si es 3 al norte, y 4 al oeste.
31
4.5. ALGORITMOS AUXILIARES
4.5.1. ALGORITMO DE CREACION DE CONTORNOEntrada: Lista de rectangulos. Cada rectangulo es una lista de cuatro vertices. Cada
vertice es un par del tipo [x,y], siendo “x” e “y” sus coordenadas en el eje de abscisas y
ordenadas, respectivamente.
Salida: Lista de subcontornos. Cada subcontorno una lista de vertices que definen
el perımetro o parte del perımetro del area que forman los rectangulos recibidos como
parametro de entrada.
El algoritmo de creacion de contorno consiste en la realizacion de un barrido horizon-
tal, de izquierda a derecha, sobre los rectangulos recibidos como argumento. Se halla en
primer lugar las aristas que forman parte del perımetro, descartando las aristas interiores
y, posteriormente, se clasifican estas aristas de contorno dentro de la lista subcontornos,
en la que, conforme se avanza hacia la derecha con el barrido, se construyen los subcon-
tornos que definen el contorno final.
A continuacion se muestra la implementacion del algoritmo escrita en pseudocodigo.
Se incluyen de igual forma algunas funciones auxiliares, unicamente las principales y ne-
cesarias para la comprension del proceso:
Funciones auxiliares:
1. Funcion Aux 1: crear clasificacion coord x(lista rectangulos):
Itera sobre todos los vertices existentes en lista rectangulos y los clasifica en sub-
listas segun su coordenada x. El metodo devuelve una lista con todas las sublistas
construidas. Las sublistas estan ordenadas dentro de la lista padre de menor a mayor
segun la coordenada x que representan.
2. Funcion Aux 2: es punto de contorno(punto):
Devuelve verdadero si el punto se encuentra sobre el perımetro del area de rectangu-
los, y falso si el punto se encuentra en el interior del area de rectangulos. Para deter-
minar la posicion de un punto, se crean cuatro puntos auxiliares alrededor del punto
en cuestion. Si los cuatro puntos se encuentran dentro del area de algun rectangulo,
sera un punto interior, en caso contrario se encontrara en el perımetro.
32
Figura 4.36: Diferencia entre Punto Interior y Punto de Contorno
Figura 4.37: Diferencia entre Punto Interior y Punto de Contorno: Puntos Auxiliares
3. Funcion Aux 3: ordenar por coord y(vertices nuevos):
Devuelve una lista con los vertices de vertices nuevos ordenados de mayor a menor
segun su coordenada y.
4. Funcion Aux 4: crear aristas(vertices nuevos):
Respentando el orden de la lista de vertices nuevos, toma puntos de dos en dos
y crea aristas (pares de vertices) con ellos, y las anade a la lista a devolver.
33
Figura 4.38: Formacion de Aristas a partir de Puntos: Paso 1
Figura 4.39: Formacion de Aristas a partir de Puntos: Paso 2
5. Funcion Aux 5: es arista correcta(arista):
Devolvera verdadero si la arista forma parte del perımetro del area y si no contiene
ningun otro vertice en su interior de los definidos en la lista de rectangulos.
6. Funcion Aux 6: buscar enlace(punto)
Realiza una busqueda por todos los subcontornos, verificando si el punto propor-
cionado enlaza con alguno de ellos por el principio o por el final. Devolvera el par
[principio/final, subcontorno de enlace] en caso de encontrarlo, si no, devolvera nu-
lo. El punto enlaza con un subcontorno cuando la nueva arista que se forma, [punto,
final] o [punto, principio], es correcta (Funcion Aux 5).
34
Figura 4.40: Buscar Enlace para Arista
En la Figura 4.40, observamos la busqueda de enlace para la arista [EXTREMO 0,
EXTREMO 1], con los subcontornos existentes (0 y 1). Si la busqueda se realiza
para el EXTREMO 0 de la arista, se enlazara con el subcontorno 0. Si se realiza
la busqueda para el EXTREMO 1 de la arista, se enlazara con el subcontorno 1.
Supongamos que se busca un enlace para el EXTREMO 0. El vınculo se produce a
traves de la nueva arista, [FIN, EXTREMO 0], con el subcontorno 0, por lo que el
metodo devolvera [FIN,0].
Figura 4.41: Enlace para Arista Encontrado
35
7. Funcion Aux 7: clean subcontours(subcontornos):
Elimina de subcontornos los vertices repetidos y los vertices innecesarios, sien-
do estos ultimos aquellos que se encuentran contenidos en el interior de una arista
definida por la secuencia de vertices de subcontornos, es decir, no son necesarios
para delimitar el perımetro, pues anaden informacion redundante.
Los puntos innecesarios y repetidos aparecen en la lista subcontornos debido a la
existencia de rectangulos que poseen algun vertice en comun. El algoritmo no con-
trola si al anadir los nuevos vertices, estos ya se encuentran en la lista.
Figura 4.42: Vertices Necesarios e Innecesarios en un Contorno
function CREAR CONTORNO (lista rectangulos)
subcontornos=[] � Lista para subcontornos finales
vertices nuevos =[] � Lista para vertices encontrados con cada paso del barrido
aristas nuevas =[] � Lista para aristas encontradas con cada paso del barrido
clasif x = crear clasificacion coord x (lista rectangulos) � Funcion Aux 1
# Se toman todos los vertices de contorno que tienen la misma coordenada x
for clasif x i de clasif x do � Para cada sublista de la lista clasif x
for punto de clasif x i do � Para cada punto de clasif x i
if es punto de contorno(punto) then � Funcion Aux 2
vertices nuevos.anadir(punto)
end ifend for
# Se ordenan los vertices por su coord. ’y’, y se crean aristas con los mismos
36
vertices nuevos = ordenar por coord y(vertices nuevos) � Funcion Aux 3
aristas nuevas = crear aristas(vertices nuevos) � Funcion Aux 4
# Se comprueba que las nuevas aristas formadas son correctas, pues aunque sus
# extremos sean puntos de contorno, pueden no ser aristas de contorno. En caso
# de no ser correctas, se anadiran sus extremos como nuevos subcontornos con
# los que enlazar posteriormente.
for arista de aristas nuevas do � Para cada arista de aristas nuevas
if no es arista correcta(arista) then � Funcion Aux 5
subcontornos.anadir([arista[0]])
subcontornos.anadir([arista[1]])
aristas nuevas.borrar(arista)
end ifend for
# Se busca un enlace para cada nueva arista con los subcontornos existentes
# buscar enlace � Funcion Aux 6
for arista de aristas nuevas do � Para cada arista de aristas nuevas
enl1 = buscar enlace(a[0]) � Buscar enlace extremo 0 de arista
if hay enlace then � Si se ha encontrado un enlace [lugar,subc enlace]
if lugar enlace = cabeza subc enlace thensubc enlace.anadir al principio(a[0])
subc enlace.anadir al principio(a[1])
else if lugar enlace = cola subc enlace thensubc enlace.anadir al final(a[0])
subc enlace.anadir al final(a[1])
end ifelse � Si no hay enlace con extremo 0 de arista
enl2 = buscar enlace(a[1]) � Buscar enlace extremo 1 de arista
if hay enlace then � Si se ha encontrado un enlace [lugar,subc enlace]
if lugar enlace = cabeza subc enlace thensubc enlace.anadir al principio(a[1])
subc enlace.anadir al principio(a[0])
else if lugar enlace = cola subc enlace thensubc enlace.anadir al final(a[1])
subc enlace.anadir al final(a[0])
end ifelse � Si no se ha encontrado un enlace, se crea nuevo subcontorno
subcontornos.anadir(arista)
end ifend if
37
end for
# Comprobar si los subcontornos pueden enlazarse entre sı
i = 0 � Para controlar la iteracion sobre los subcontornos
if hay mas de un subcontorno thenwhile haya mas de un subcontorno & i <longitud(subcontornos) do
# Buscar enlace extremo 0 de subcontorno[i]
enl = buscar enlace(subcontornos[i][0])
if hay enlace then � Si se ha encontrado un enlace [lugar,subc enlace]
if lugar enlace = cabeza subc enlace thensubc enlace.anadir al principio(del reves(subcontornos[i]))
subcontornos.borrar(subcontornos[i])
else if lugar enlace = cola subc enlace thensubc enlace.anadir al final(subcontornos[i])
subcontornos.borrar(subcontornos[i])
end ifelse
# Buscar enlace extremo 1 de subcontorno[i]
enl = buscar enlace(subcontornos[i][final])
if hay enlace thenif lugar enlace = cabeza subc enlace then
subc enlace.anadir al principio(subcontornos[i])
subcontornos.borrar(subcontornos[i])
else if lugar enlace = cola subc enlace thensubc enlace.anadir al final(del reves(subcontornos[i]))
subcontornos.borrar(subcontornos[i])
end ifend if
end ifi = i + 1
end whileend ifvertices nuevos = []
aristas nuevas = []
end forclean subcontours(subcontornos) � Funcion Aux 7
return devolver resultado(subcontornos)
end function
Comportamiento grafico:
En las siguientes figuras se muestra graficamente el comportamiento del algoritmo:
38
Tomamos el primer grupo de coordenadas ‘x’, x=0, y buscamos los puntos de con-
torno. Formamos aristas con los puntos de contorno (las sombreadas). No pueden enla-
zarse con ningun subcontorno anterior (no hay subcontornos aun). Anadimos cada arista
como un nuevo subcontorno. Los contornos no pueden unirse entre sı. Avanzamos a la
siguiente coordenada ‘x’.
Figura 4.43: Construccion de Contorno: Paso 1
Subcontornos = [[[0,0],[0,4]],[[0,6],[0,10]]]
Tomamos el siguiente grupo de coordenadas ‘x’, x=6, y buscamos los puntos de con-
torno. Formamos aristas con los puntos de contorno. La unica arista puede enlazarse con
el subcontorno[0] por el final, usando el extremo 0 de la arista. Se une la arista al subcon-
torno.
Figura 4.44: Construccion de Contorno: Paso 2
39
Figura 4.45: Construccion de Contorno: Paso 3
Subcontornos = [[[0,0],[0,4],[6,4],[6,6]],[[0,6],[0,10]]]
Se pueden unir los dos subcontornos entre sı. El subcontorno 1 enlaza con el 0, por el
principio.
Figura 4.46: Construccion de Contorno: Paso 4
Subcontornos = [[[0,0],[0,4],[6,4],[6,6],[0,6],[0,10]]]
Tomamos el siguiente grupo de coordenadas ‘x’, x=8, y buscamos los puntos de contorno.
Formamos aristas con los puntos de contorno. La unica arista puede enlazarse con el
subcontorno[0] (el unico que hay) por el final, usando el extremo 1 de la arista. Se une la
arista al subcontorno.
40
Figura 4.47: Construccion de Contorno: Paso 5
Figura 4.48: Construccion de Contorno: Paso 6
Subcontornos = [[[8,8],[8,10],[0,0],[0,4],[6,4],[6,6],[0,6],[0,10]]]
Tomamos el siguiente grupo de coordenadas ‘x’, x=9, y buscamos los puntos de con-
torno. Formamos aristas con los puntos de contorno. La unica arista hallada no puede
enlazarse con ningun subcontorno, de modo que se anade como un nuevo subcontorno.
41
Figura 4.49: Construccion de Contorno: Paso 7
Subcontornos = [[[8,8],[8,10],[0,0],[0,4],[6,4],[6,6],[0,6],[0,10]],[[9,4],[9,6]]]
Tomamos el siguiente grupo de coordenadas ‘x’, x=10, y buscamos los puntos de con-
torno. Formamos aristas con los puntos de contorno. Hay dos aristas nuevas, una de las
cuales tiene sus dos extremos iguales (forma un punto). Intentamos unir cada una de la
aristas con los subcontornos.
Figura 4.50: Construccion de Contorno: Paso 8
Continuamos con el proceso hasta finalizar con la construccion del contorno.
42
Figura 4.51: Construccion de Contorno: Paso 9
Figura 4.52: Construccion de Contorno: Paso 10
4.5.2. ALGORITMO DE CREACION DE RECTANGULOSEntrada: Contorno, lista de vertices que definen el perımetro de un area.
Salida: Lista de rectangulos, tantos como el numero de subdivisiones rectangulares
en que queda seccionada el area recibida como argumento tras la aplicacion del algorit-
mo. Cada vertice es un par del tipo [x,y], siendo “x” e “y” sus coordenadas en el eje de
abscisas y ordenadas, respectivamente.
43
El algoritmo de creacion de rectangulos consiste en la division del area (definida por
el contorno y pasada como argumento) en secciones rectangulares, que surgen al trazar
una vertical y una horizontal sobre cada uno de los vertices que constituyen el perımetro
de dicha area.
Figura 4.53: Trazo de una Diagonal por un Vertice de Contorno
Figura 4.54: Trazo de las Diagonales por los Vertices de Contorno
A continuacion se muestra la implementacion del algoritmo escrita en pseudocodigo.
Se incluyen de igual forma algunas funciones auxiliares, unicamente las principales y ne-
cesarias para la comprension del proceso:
Funciones auxiliares:
1. Funcion Aux 1: obtener x e y coordenadas(contorno):
44
Itera sobre todos los vertices de la lista contorno recibida como argumento y crea
dos listas. La primera lista contendra todas las coordenadas ’x’ distintas encontra-
das, y la segunda, analogamente, contendra todas las coordenadas ’y’ distintas.
2. Funcion Aux 2: ordenar(lista):
Devolvera una lista con los elementos de la lista recibida como argumento orde-
nados de menor a mayor.
3. Funcion Aux 3: rectangulo en contorno(rect,contorno):
Devolvera True si el area del rectangulo se encuentra contenida en el area definida
por el contorno recibido como parametro. En caso contrario devolvera False.
Figura 4.55: Diferencia Rectangulo Contenido y No Contenido en Contorno
4. Funcion Aux 4: crear rectangulo(x1,y1,x2,y2):
Devuelve el rectangulo definido por los lımites recibidos como parametros. x1 e
y1 definen la esquina inferior izquierda del rectangulo, mientras que x2 e y2 de-
finen la superior derecha. El rectangulo devuelto sera una lista de cuatro vertices.
Cada vertice es un par del tipo [x,y], siendo “x” e “y” sus coordenadas en el eje de
abscisas y ordenadas, respectivamente.
45
function CREAR RECTANGULOS(contorno):
toReturn=[] � Lista para los rectangulos finales a devolver
[xlista,ylista] = obtener x e y coordenadas(contorno) � Funcion Auxiliar 1
xlista = ordenar(xlista) � Funcion Auxiliar 2
ylista = ordenar(ylista)
i = 0 � Para controlar la iteracion sobre xlista
j = 0 � Para controlar la iteracion sobre ylista
while (j <longitud(ylista)-1): dowhile (i <longitud(xlista)-1): do
# crear rectangulo � Funcion Auxiliar 4
rect = crear rectangulo(xlista[i],ylista[j],xlista[i+1],ylista[j+1])
if rectangulo en contorno(rect,contorno) then � Funcion Auxiliar 3
toReturn.anadir(rect)
end ifi=i+1
end whilej=j+1
i=0
end whiledevolver toReturn
end function
Comportamiento grafico:
En las siguientes figuras se muestra graficamente el comportamiento del algoritmo:
Figura 4.56: Creacion de Rectangulos: Paso 1
46
Figura 4.57: Creacion de Rectangulos: Paso 2
Figura 4.58: Creacion de Rectangulos: Paso 3
Figura 4.59: Creacion de Rectangulos: Paso 4
47
Figura 4.60: Creacion de Rectangulos: Paso 5
Figura 4.61: Creacion de Rectangulos: Paso 6
Los rectangulos con una diagonal en su interior, por no encontrarse dentro del con-
torno, no se anaden a la lista de rectangulos a devolver, son descartados .
4.5.3. ALGORITMO DE EXPANSION DE RECTANGULOSEntrada: Lista de rectangulos. Cada rectangulo es una lista de cuatro vertices. Cada
vertice es un par del tipo [x,y], siendo “x” e “y” sus coordenadas en el eje de abscisas y
ordenadas, respectivamente.
Salida: Lista de rectangulos; los resultantes tras la aplicacion del algoritmo sobre la
lista recibida como argumento. Cada vertice es un par del tipo [x,y], siendo “x” e “y” sus
coordenadas en el eje de abscisas y ordenadas, respectivamente.
El algoritmo de expansion de rectangulos consiste en la aplicacion del proceso de ex-
pansion de rectangulos sobre cada uno de los rectangulos recibidos como argumento. La
expansion debe realizarse en las cuatro direcciones (arriba, abajo, derecha e izquierda)
48
mientras sea posible. De igual forma, estas expansiones deben realizarse secuencialmen-
te en todos los ordenes posibles, es decir, en todas las permutaciones posibles de los
elementos {arriba, abajo, derecha, izquierda}. Al ser cuatro elementos, obtenemos 4! po-
sibilidades de permutacion. La expansion de cada rectangulo debe realizarse 4! veces, una
con cada tipo de permutacion, con el fin de obtener todos los rectangulos necesarios para
la creacion de la cubierta.
En las siguientes Figuras se podran visualizar los diferentes resultados que se obtienen
al cambiar el orden de las direcciones en el proceso de expansion. Pondremos unicamente
4 ejemplos de permutaciones, aunque, como hemos dicho, existen 24 (4!).
Figura 4.62: Expansion Rectangulo: Permutacion {Abajo, Derecha, Arriba, Izquierda}
Figura 4.63: Expansion Rectangulo: Permutacion {Arriba, Izquierda, Abajo, Derecha}
Figura 4.64: Expansion Rectangulo: Permutacion {Izquierda, Abajo, Derecha, Arriba}
49
Figura 4.65: Expansion Rectangulo: Permutacion {Izquierda, Arriba, Derecha, Abajo}
A continuacion se muestra la implementacion del algoritmo escrita en pseudocodigo.
Se incluyen de igual forma algunas funciones auxiliares, unicamente las principales y ne-
cesarias para la comprension del proceso:
Funciones auxiliares:
1. Funcion Aux 1: extender rectangulos eje y(lista rectangulos):
Expande todos los rectangulos de lista rectangulos a lo largo del eje y, es decir,
hacia arriba y hacia abajo.
Figura 4.66: Expansion de Rectangulos a lo largo del eje y
2. Funcion Aux 2: extender rectangulos eje x(lista rectangulos):
Expande todos los rectangulos de lista rectangulos a lo largo del eje x, es decir,
hacia la derecha y hacia la izquierda.
50
Figura 4.67: Expansion de Rectangulos a lo largo del eje x
3. Funcion Aux 3: extender(direccion,rect, rectangulos lista eje x/y):
Extiende el rectangulo rect todo lo posible en la direccion proporcionada. Utili-
zara los rectangulos expandidos con la Funcion Aux 1 si direccion = derecha o
izquierda, y los expandidos con la Funcion Aux 2 si direccion = arriba o abajo
El proceso de expansion se encuentra explicado con mayor detalle en el apartado
4.3.2. de este documento.
4. Funcion Aux 4: buscar rectangulo direccion(rect, rectangulos lista eje x/y, direc-
cion):
Busca un rectangulo colindante a rect en la direccion proporcionada, que pueda
ser utilizado para la expansion, es decir, debe ser mas ancho o igual de ancho que
rect en la direccion de expansion.
Figura 4.68: Expansion de Rectangulos Posible y No Posible
function EXTENDER(direccion,rect, rectangulos lista eje):
# buscar rectangulo direccion - Funcion Aux 4
search r=buscar rectangulo direccion(rect, rectangulos lista eje, direccion)
while se haya encontrado un rectangulo para expansion do
51
modificar rectangulo con nuevos lımites de search r
search r= buscar rectangulo direccion(rect, rectangulos lista eje, direccion)
end whiledevolver rectangulo expandido
end function
function EXPANDIR RECTANGULOS(lista rectangulos):
# rectangulos lista eje x - Funcion Aux 1
rectangulos lista eje x = extender rectangulos eje x(lista rectangulos)
# rectangulos lista eje y - Funcion Aux 2
rectangulos lista eje y = extender rectangulos eje y(lista rectangulos)
toReturn = []
for rect de lista rectangulos do:
for permutacion de {arriba,abajo,derecha,izquierda} do:
for direccion de permutacion doif direccion es arriba o abajo then
# extender - Funcion Aux 3
rect = extender(direccion,rect, rectangulos lista eje x)
else if direccion es izquierda o derecha thenrect = extender(direccion,rect, rectangulos lista eje y)
end ifend for
end forend for
end function
4.5.4. ALGORITMO DE MODIFICACION DE RECTANGULOSEntrada: Lista de rectangulos. Cada rectangulo es una lista de cuatro vertices. Cada
vertice es un par del tipo [x,y], siendo “x” e “y” sus coordenadas en el eje de abscisas y
ordenadas, respectivamente.
Salida: Lista de rectangulos que contendra los modificados (tras la aplicacion del al-
goritmo) de los rectangulos de la lista recibida como argumento. Cada rectangulo devuelto
sera una lista de cuatro vertices. Cada vertice es un par del tipo [x,y], siendo “x” e “y” sus
coordenadas en el eje de abscisas y ordenadas, respectivamente.
El algoritmo de modificacion de rectangulos consiste en la aplicacion del proceso de
modificacion de rectangulos sobre cada uno de los rectangulos recibidos como argumen-
to. Este proceso de modificacion se realiza con el objetivo de evitar la generacion de geo-
metrıa innecesaria en las cubiertas, ası como de mejorar el aspecto y logica de las mismas.
52
Las circunstancias bajo las que debe modificarse un rectangulo se encuentran explica-
das con mayor detalle en el apartado 4.3.2. de este documento.
A continuacion se muestra la implementacion del algoritmo escrita en pseudocodigo.
Se incluyen de igual forma algunas funciones auxiliares, unicamente las principales y ne-
cesarias para la comprension del proceso:
Funciones auxiliares:
1. Funcion Aux 1: clasificar(lista rectangulos):
Itera sobre todos los rectangulos de lista rectangulos. Si rectangulo.largo <rectangu-
lo.ancho, lo anadira a la lista de rectangulos verticales. Si rectangulo.largo >rectangu-
lo.ancho, lo anadira a la lista de rectangulos horizontales. Si rectangulo.largo =
rectangulo.ancho, lo anadira a la lista de rectangulos iguales. Se devuelve una lista
con de las tres listas creadas
Figura 4.69: Rectangulos Verticales, Horizontales e Iguales
2. Funcion Aux 2: modif rect horizontal(rect, inclinacion, lista verticales + lista iguales):
Busca los rectangulos con los que rect interesecta tanto por la izquierda como por la
derecha, si los hay. En el caso de encontrar una interseccion, reduce el area de rect
la mitad del largo del rectangulo con el que intersecta. Puede ocurrir que se reduzca
el area por la derecha, por la izquierda, por ambas, o que no se reduzca. El metodo
devuelve las coordenadas del nuevo rectangulo.
Para conseguir un resultado arquitectonicamente correcto, se reducira el area de rect
unicamente cuando la altura del rectangulo con el que intersecta es mayor que la
altura de rect.
53
Figura 4.70: Interseccion por la Derecha
Figura 4.71: Interseccion por la Derecha Resuelta
Figura 4.72: Interseccion por la Izquierda
54
Figura 4.73: Interseccion por la Izquierda Resuelta
3. Funcion Aux 3: modif rect vertical(rect, inclinacion, lista horizontales + lista iguales):
Busca los rectangulos con los que rect intersecta tanto por arriba como por aba-
jo, si los hay. En el caso de encontrar una interseccion, reduce el area de rect la
mitad del ancho del rectangulo con el que intersecta. Puede ocurrir que se reduzca
el area por arriba por abajo, por ambos, o que no se reduzca. El metodo devuelve
las coordenadas del nuevo rectangulo.
Para conseguir un resultado arquitectonicamente correcto, se reducira el area de rect
unicamente cuando la altura del rectangulo con el que intersecta es mayor que la
altura de rect.
Figura 4.74: Interseccion por la Arriba
55
Figura 4.75: Interseccion por la Arriba Resuelta
Figura 4.76: Interseccion por la Abajo
Figura 4.77: Interseccion por la Abajo Resuelta
56
function MODIFICAR RECTANGULOS(lista rectangulos,horizontal,inclinacion)
toReturn = [] � Lista para los rectangulos finales a devolver
# clasificar - Funcion Aux 1
[lista verticales,lista horizontales,lista iguales] = clasificar(lista rectangulos)
if horizontal = True then � Modificar los rectangulos horizontales
for rect en lista horizontales do � Para cada rectangulo horizontal
# modif rect horizontal - Funcion Aux 2
# Si se modifican los horizontales, se encontrara intereseccion con los
# verticales y los iguales
rect = modif rect horizontal(rect, inclinacion, lista verticales + lista iguales)
toReturn.anadir(rect)
end fortoReturn = toReturn + lista verticales + lista iguales
else � Modificar los rectangulos verticales
for rect en lista verticales do � Para cada rectangulo vertical
# modif rect vertical - Funcion Aux 3
# Si se modifican los horizontales, se encontrara intereseccion con los
# horizontales y los iguales
rect = modif rect vertical(rect, inclinacion, lista horizontales + lista iguales)
toReturn.anadir(rect)
end fortoReturn = toReturn + lista horizontales + lista iguales
end ifdevolver toReturn
end function
4.5.5. CREACION DE GEOMETRIA 3D
4.5.5.1. GEOMETRIA 3D GABLE ROOF
function CALCULAR VERTICES 1(largo,ancho,inclinacion,base,p1,p2,p3,p4)
altura = calcular altura gable roof(largo,inclinacion)
punto medio 1 = punto medio [p1,p2] y subirlo altura
punto medio 2 = punto medio [p3,p4] y subirlo altura
vertices = base + [punto medio 1] + [punto medio 2]
devolver vertices
end function
function CREAR CUBIERTA SIMPLE GABLE ROOF(rectangulo, horizontal, inclinacion)
[largo,ancho] = calcular dimensiones rectangulo(rectangulo)
base = vertices de rectangulo
if largo <ancho then
57
vertices = calcular vertices 1(largo,ancho,inclinacion,base,r[0],r[1],r[2],r[3])
polıgonos = [[0,1,4],[1,2,5,4],[2,3,5],[0,4,5,3]]
else if largo >ancho thenvertices = calcular vertices 1(largo,ancho,inclinacion,base,r[3],r[0],r[1],r[2])
polıgonos = [[0,1,5,4],[1,2,5],[2,3,4,5],[0,4,3]]
else � largo = ancho
if horizontal then: � Poner rectangulos iguales orientacion elegida
vertices = calcular vertices 1(largo,ancho,inclinacion,base,r[0],r[1],r[2],r[3])
polıgonos = [[0,1,4],[1,2,5,4],[2,3,5],[0,4,5,3]]
elsevertices = calcular vertices 1(largo,ancho,inclinacion,base,r[3],r[0],r[1],r[2])
polıgonos = [[0,1,5,4],[1,2,5],[2,3,4,5],[0,4,3]]
end ifend ifdevolver [vertices,polıgonos]
end function
Figura 4.78: Construccion Geometrıa 3D Gable Roof
4.5.5.2. GEOMETRIA 3D HIPPED ROOF
function CALCULAR VERTICES 2(largo,ancho,inclinacion,base,p1,p2,p3,p4)
altura = calcular altura gable roof(largo,inclinacion,eje)
desplazamiento = desplazamiento arista superior(largo)
punto medio 1 = punto medio [p1,p2] y subirlo altura
punto medio 2 = punto medio [p3,p4] y subirlo altura
if eje = y thendesplazar punto medio 1 +desplazamiento sobre eje y
desplazar punto medio 2 -desplazamiento sobre eje y
else if eje = x thendesplazar punto medio 1 +desplazamiento sobre eje x
58
desplazar punto medio 2 -desplazamiento sobre eje x
end ifvertices = base + [punto medio 1] + [punto medio 2]
devolver vertices
end function
function CREAR CUBIERTA SIMPLE HIPPED ROOF(rectangulo, inclinacion)
[largo,ancho] = calcular dimensiones rectangulo(rectangulo)
base = vertices de rectangulo
if largo <ancho thenvertices = calcular vertices 2(largo,ancho,inclinacion,base,r[0],r[1],r[2],r[3])
polıgonos = [[0,1,4],[1,2,5,4],[2,3,5],[0,4,5,3]]
else if largo >ancho thenvertices = calcular vertices 2(largo,ancho,inclinacion,base,r[3],r[0],r[1],r[2])
polıgonos = [[0,1,5,4],[1,2,5],[2,3,4,5],[0,4,3]]
end ifdevolver [vertices,polıgonos]
end function
Figura 4.79: Construccion Geometrıa 3D Hipped Roof
4.5.5.3. GEOMETRIA 3D MANSARD ROOF
function CREAR CUBIERTA SIMPLE MANSARD ROOF(rectangulo,altura,horizontal,inclinacion)
[largo,ancho] = calcular dimensiones rectangulo(rectangulo)
desplazamiento interior = altura / tan(inclinacion)
base = vertices de rectangulo
if largo <ancho thennuevos vertices = desplazar ”desplazamiento interior”vertices rectangulo
59
hacia el interior del rectangulo y subirlos altura
polıgonos = [[0,4,7,3],[4,5,6,7],[1,2,6,5],[0,1,5,4],[2,3,7,6]]
else if largo >ancho thennuevos vertices = desplazar ”desplazamiento interior”vertices rectangulo
hacia el interior del rectangulo y subirlos altura
polıgonos = [[0,1,5,4],[4,5,6,7],[2,3,7,6],[1,2,6,5],[3,0,4,7]]
elseif horizontal then: � Poner rectangulos iguales orientacion elegida
nuevos vertices = desplazar ”desplazamiento interior”vertices rectangulo
hacia el interior del rectangulo y subirlos altura
polıgonos = [[0,4,7,3],[4,5,6,7],[1,2,6,5],[0,1,5,4],[2,3,7,6]]
elsenuevos vertices = desplazar ”desplazamiento interior”vertices rectangulo
hacia el interior del rectangulo y subirlos altura
polıgonos = [[0,1,5,4],[4,5,6,7],[2,3,7,6],[1,2,6,5],[3,0,4,7]]
end ifend ifvertices = vertices rectangulo + nuevos vertices
devolver [vertices,polıgonos]
end function
Figura 4.80: Construccion Geometrıa 3D Mansard Roof
4.5.5.4. GEOMETRIA 3D GAMBREL ROOF
function CALCULAR VERTICES 3(largo,ancho,inclinacion,base,p1,p2,p3,p4)
altura = calcular altura gambrel roof(largo,inclinacion)
punto medio 1 = punto medio [p1,p2] y subirlo altura
punto medio 2 = punto medio [p3,p4] y subirlo altura
60
vertices = base + [punto medio 1] + [punto medio 2]
devolver vertices
end function
function CREAR CUBIERTA SIMPLE GAMBREL ROOF(rectangulo,horizontal,inclinacion)
[largo,ancho] = calcular dimensiones rectangulo(rectangulo)
base = vertices de rectangulo
if largo <ancho thendesplazamiento x = largo/2.5
desplazamiento y = altura/2
vertices = calcular vertices 1(largo,ancho,inclinacion,base,r[0],r[1],r[2],r[3])
nuevos vertices = desplazar ’desplazamiento x’ y ’desplazamiento y’ los
vertices rectangulo hacia el interior del rectangulo y subirlos altura
polıgonos = [[1,2,7,6],[6,7,5,4],[0,8,9,3],[8,4,5,9],[0,1,6,4,8],[3,2,7,5,9]]
else if largo >ancho thendesplazamiento x = ancho/2.5
desplazamiento y = altura/2
vertices = calcular vertices 1(largo,ancho,inclinacion,base,r[3],r[0],r[1],r[2])
nuevos vertices = desplazar ’desplazamiento x’ y ’desplazamiento y’ los
vertices rectangulo hacia el interior del rectangulo y subirlos altura
polıgonos = [[0,1,8,9],[8,4,5,9],[4,6,7,5],[6,2,3,7],[1,2,6,4,8],[0,3,7,5,9]]
elseif horizontal then: � Modificar los rectangulos horizontales
desplazamiento x = largo/2.5
desplazamiento y = altura/2
vertices = calcular vertices 1(largo,ancho,inclinacion,base,r[0],r[1],r[2],r[3])
nuevos vertices = desplazar ’desplazamiento x’ y ’desplazamiento y’ los
vertices rectangulo hacia el interior del rectangulo y subirlos altura
polıgonos = [[1,2,7,6],[6,7,5,4],[0,8,9,3],[8,4,5,9],[0,1,6,4,8],[3,2,7,5,9]]
elsedesplazamiento x = ancho/2.5
desplazamiento y = altura/2
vertices = calcular vertices 1(largo,ancho,inclinacion,base,r[3],r[0],r[1],r[2])
nuevos vertices = desplazar ’desplazamiento x’ y ’desplazamiento y’ los
vertices rectangulo hacia el interior del rectangulo y subirlos altura
polıgonos = [[0,1,8,9],[8,4,5,9],[4,6,7,5],[6,2,3,7],[1,2,6,4,8],[0,3,7,5,9]]
end ifend ifvertices = vertices rectangulo + nuevos vertices
devolver [vertices,polıgonos]
end function
61
Figura 4.81: Construccion Geometrıa 3D Gambrel Roof
4.5.5.5. GEOMETRIA 3D SHED ROOF
function CREAR CUBIERTA SIMPLE SHED ROOF(rectangulo,orientacion,inclinacion)
[largo,ancho] = calcular dimensiones rectangulo(rectangulo)
base = vertices de rectangulo
if orientacion = 0 o orientacion = 2 then altura = calcular altura shed roof(ancho,inclinacion)
elsealtura = calcular altura shed roof(largo,inclinacion)
end ifpunto superior 1 = segun orientacion, subir copia de vertice de rectangulo a altura
punto superior 2 = segun orientacion, subir copia de vertice de rectangulo a altura
vertices = base + [punto superior 1] + [punto superior 2]
if orientacion == 0 then polıgonos = [[0,1,2,3],[0,1,4,5],[1,2,4],[2,3,5,4],[0,5,3]]
else if orientacion == 1 then polıgonos = [[0,1,2,3],[0,1,5],[1,2,4,5],[2,3,5],[0,3,4,5]]
else if orientacion == 2 then polıgonos = [[0,1,2,3],[0,1,5,4],[1,2,5],[2,3,4,5],[0,4,3]]
elsepolıgonos = [[0,1,2,3],[0,1,4],[1,2,5,4],[2,3,5],[0,4,5,3]]
end ifdevolver [vertices,polıgonos]
end function
62
Figura 4.82: Construccion Geometrıa 3D Shed Roof
63
5 | RESULTADOS Y CONCLUSIONES
5.1. RESULTADOS GABLE ROOF
Inclinacion: 30 grados - Orientacion: Eje x
Figura 5.1: Gable Roof Vista 1
Figura 5.2: Gable Roof Vista 2
64
Figura 5.3: Gable Roof Vista 3
Inclinacion: 50 grados - Orientacion: Eje y
Figura 5.4: Gable Roof Vista 4
Figura 5.5: Gable Roof Vista 5
65
Figura 5.6: Gable Roof Vista 6
5.2. RESULTADOS HIPPED ROOF
Inclinacion: 30 grados
Figura 5.7: Hipped Roof Vista 1
Figura 5.8: Hipped Roof Vista 2
66
Figura 5.9: Hipped Roof Vista 3
Inclinacion: 45 grados
Figura 5.10: Hipped Roof Vista 4
Figura 5.11: Hipped Roof Vista 5
67
Figura 5.12: Hipped Roof Vista 6
5.3. RESULTADOS MANSARD ROOF
Inclinacion: 45 grados - Altura: 0.5 m
Figura 5.13: Mansard Roof Vista 1
Figura 5.14: Mansard Roof Vista 2
68
Figura 5.15: Mansard Roof Vista 3
Inclinacion: 45 grados - Altura: 0.5 m
Figura 5.16: Mansard Roof Vista 4
Figura 5.17: Mansard Roof Vista 5
69
Figura 5.18: Mansard Roof Vista 6
5.4. RESULTADOS SHED ROOF
Inclinacion: 15 grados - Orientacion: Norte
Figura 5.19: Shed Roof Vista 1
Figura 5.20: Shed Roof Vista 2
70
Figura 5.21: Shed Roof Vista 3
Inclinacion: 35 grados - Orientacion: Norte
Figura 5.22: Shed Roof Vista 4
Figura 5.23: Shed Roof Vista 5
71
5.5. RESULTADOS GAMBREL ROOF
Inclinacion: 45 grados - Orientacion: Eje x
Figura 5.24: Gambrel Roof Vista 1
Figura 5.25: Gambrel Roof Vista 2
Figura 5.26: Gambrel Roof Vista 3
72
Inclinacion: 45 grados - Orientacion: Eje y
Figura 5.27: Gambrel Roof Vista 4
Figura 5.28: Gambrel Roof Vista 5
Figura 5.29: Gambrel Roof Vista 6
73
5.6. CONCLUSIONESLa realizacion de este Trabajo de Fin de Grado ha resultado ser una experiencia muy
positiva. He adquirido conocimientos ligados a mi campo de interes y habilidades que me
ayudaran a asentarme en el mundo del modelado 3D.
El desarrollo del trabajo se ha llevado de forma tranquila y eficiente, proporcionando-
me a su vez ilusion y entusiasmo por avanzar en mis tareas. El trato que recibo de Lurtis
Rules y la experiencia vivida no puede ser mejor.
La realizacion de estas practicas me han supuesto, en el del ambito de conocimientos
informaticos:
Aprendizaje de un nuevo lenguaje de programacion: Python.
Mejora de las habilidades para la programacion.
Capacidad para establecer prioridades a la hora de implementar unas funcionalida-
des u otras.
Importancia de la documentacion.
Importancia de la refactorizacion.
Aumento del tiempo dedicado al planeamiento y analisis de problemas.
Mejora en el manejo las herramientas basicas de Maya.
Mejora en el conocimiento sobre el funcionamiento y utilizacion de la API de Maya
para Python.
Adquisicion de nuevos conceptos sobre el Modelado 3D.
En el ambito de conocimientos matematicos, el dibujo tecnico y la arquitectura:
Ejercitacion intensa de la vision espacial.
Practica con el calculo matematico, especialmente con la trigonometrıa.
Adquisicion de conocimientos sobre el dimensionado y medidas de las cubiertas de
una vivienda.
En el ambito personal:
Capacidad de adaptacion.
Capacidad de identificacion de problemas.
74
Capacidad de resolucion de problemas.
Capacidad de toma de decisiones.
75
6 | BIBLIOGRAFIA
[1]Adobe.com. (2016). Funciones de Fuse CC (Preview) — Usa Adobe Fuse CC (Pre-
view). [online] Disponible: http://www.adobe.com/es/products/fuse/features.html [Acce-
so 14 de abril de 2016].
[2]George Kelly, Hugh McCabe () Citygen— An Interactive System for Procedu-
ral City Generation [online]. Disponible: http://www.citygen.net/files/citygen gdtw07.pdf
[Acceso 29 de abril de 2016].
[3]Forum.unity3d.com. (2016). BuildR - Create buildings within Unity — Unity Com-
munity. [online] Disponible: http://forum.unity3d.com/threads/buildr-create-buildings-within-
unity.174456/ [Acceso 14 de abril 2016].
[4]Docs.autodesk.com. (2016). Autodesk Maya API Documentation. [online] Availa-
ble at: http://docs.autodesk.com/MAYAUL/2014/ENU/Maya-API-Documentation/index.html
[Accessed 10 Feb. 2016].
[5]Autodesk.es. (2016). Familia Revit — Programas BIM — Autodesk. [online] Dis-
ponible: http://www.autodesk.es/products/revit-family/overview [Acceso 14 de abril 2016].
[6]Makehuman.org. (2016). MakeHuman — Open source tool for making 3d charac-
ters. [online] Disponible: http://www.makehuman.org/ [Acceso 14 de abril 2016].
[7]Sciencedirect.com. (2016). State of research in automatic as-built modelling. [onli-
ne] Disponible: http://www.sciencedirect.com/science/article/pii/S1474034615000026 [Ac-
ceso 14 de abril de 2016].
[8]Bentley.com. (2016). 3D Reality Modeling Software - ContextCapture. [online]
Disponible: https://www.bentley.com/en/products/product-line/reality-modeling-software
/contextcapture [Acceso 6 de mayo de 2016].
[9]Teboul, O. (2016). Olivier Teboul’s homepage. [online] Vision.mas.ecp.fr. Disponi-
ble: http://vision.mas.ecp.fr/Personnel/teboul/software.php [Acceso 10 de febrero 2016].
[10]Pypi.python.org. (2016). MeshPy 2014.1 : Python Package Index. [online] Dispo-
nible: https://pypi.python.org/pypi/MeshPy [Acceso 14 de febrero 2016].
76
[11]Docs.sympy.org. (2016). Geometry Module — SymPy 0.7.2 documentation. [on-
line] Disponible: http://docs.sympy.org/0.7.2/modules/geometry.html [Acceso 13 de ma-
yo de 2016].
[12]Web3d.org. (2016). Automatic Construction of 3D Cities — Web3D Consortium.
[online] Disponible: http://www.web3d.org/case-studies/automatic-construction-3d-cities/automatic-
construction-3d-cities [Acceso 14 de mayo de 2016].
77
Este documento esta firmado porFirmante CN=tfgm.fi.upm.es, OU=CCFI, O=Facultad de Informatica - UPM,
C=ES
Fecha/Hora Mon Jun 06 23:19:04 CEST 2016
Emisor delCertificado
[email protected], CN=CA Facultad deInformatica, O=Facultad de Informatica - UPM, C=ES
Numero de Serie 630
Metodo urn:adobe.com:Adobe.PPKLite:adbe.pkcs7.sha1 (AdobeSignature)
Recommended