COMPONENT-BASED MODELING OF COMPLETE BUILDINGS Luc Leblanc - - PowerPoint PPT Presentation

component based modeling of complete buildings
SMART_READER_LITE
LIVE PREVIEW

COMPONENT-BASED MODELING OF COMPLETE BUILDINGS Luc Leblanc - - PowerPoint PPT Presentation

COMPONENT-BASED MODELING OF COMPLETE BUILDINGS Luc Leblanc Jocelyn Houle Pierre Poulin Dept. I.R.O. Graphics Interface St. Johns, May25-27, 2011 GOALS Procedural generation of buildings Exteriors and interiors Complete


slide-1
SLIDE 1

Graphics Interface

  • St. John’s, May25-27, 2011

COMPONENT-BASED MODELING OF COMPLETE BUILDINGS

Luc Leblanc Jocelyn Houle Pierre Poulin

  • Dept. I.R.O.
slide-2
SLIDE 2

GOALS

  • Procedural generation of buildings
  • Exteriors and interiors
  • Complete control over the results
  • High quality geometry
slide-3
SLIDE 3

WHAT IT IS NOT

  • Not a system for architects
  • although if they can program...
  • Not a system to explore designs
  • although if they like looking at some random aspects...
  • Not a library of functionalities
  • more like a special language with regular language concepts

(variables, loops, randomness, etc.)

slide-4
SLIDE 4

PREVIOUS WORK

  • Mostly façades and buildind shapes
  • Shape/split grammars
  • 3D Reconstruction
  • photos
  • Floor plans
  • optimization

from Müller et al. from Aliaga et al. from Merrell et al.

slide-5
SLIDE 5

CHANGES

  • Linear order of execution of rules
  • Rules become statements with queries
  • A symbol becomes a component
  • persistency
  • inheritance
  • Operation execution
  • applied on any subset of components
  • applied individually or on all components
slide-6
SLIDE 6

CONCEPTS

  • Components
  • spatially and semantically define elements
  • organized in tree(s)
  • Program
  • statements formed by queries and operations
  • Geometry
  • attached to some components
  • created from some components
slide-7
SLIDE 7

COMPONENT

  • 2D or 3D boundary with a bounding box
  • Labels
  • User attributes
  • Child components
  • Regions
  • Connector
slide-8
SLIDE 8

PROGRAM

  • List of statements
  • queries
  • conditions
  • operations
  • for c in query (« label1 ») do
  • peration1 (c, ...)
  • peration2 (c, ...)

... end

  • operation (query ( « label1 »), ... )
  • for c in query (« label1 ») do
  • peration (c, query (« label2»), ...)

end

slide-9
SLIDE 9

QUERY

  • Subset of elements
  • components
  • faces
  • regions
  • Conditions
  • labels
  • attributes
  • visibility
slide-10
SLIDE 10

OPERATIONS

  • Creation
  • Split and slice
  • Boolean
  • Extrusion
  • Connection
  • Geometry
slide-11
SLIDE 11

OPERATIONS

  • Creation
  • Split and slice
  • Boolean
  • Extrusion
  • Connection
  • Geometry
slide-12
SLIDE 12

OPERATIONS

  • Creation
  • Split and slice
  • Boolean
  • Extrusion
  • Connection
  • Geometry
slide-13
SLIDE 13

OPERATIONS

  • Creation
  • Split and slice
  • Boolean
  • Extrusion
  • Connection
  • Geometry
slide-14
SLIDE 14

OPERATIONS

  • Creation
  • Split and slice
  • Boolean
  • Extrusion
  • Connection
  • Geometry
slide-15
SLIDE 15

OPERATIONS

  • Creation
  • Split and slice
  • Boolean
  • Extrusion
  • Connection
  • Geometry
slide-16
SLIDE 16

BUILDINGS

  • Space partitioning
  • building shape
  • subdivision into rooms
  • Base geometry
  • walls, floors and ceilings
  • Architectural elements
  • doors, windows, staircases, balconies, ...
  • Furniture, decorations
slide-17
SLIDE 17
  • - Main subdivision.

component{ label="main", size={10,5,10}, color=1 } for c in query( "main" ) do slice( c, "Y", { label="story", 2.5, level=count() } ) end for c in query( "story" ) do split( c, "Z", { label="living space", rel=2 }, { label="corridor", color=2, abs=2 }, { label="living space", rel=2 } ) end for c in query( "living space" ) do split( c, "X", { label="apartment", rel=1 }, { label="apartment", rel=1 } ) end component{ label={"elevator", "room"}, size={2,5,2}, position={4,0,2}, color=3 }

  • - Priorities.

for c in query( "apartment" or "corridor" ) do subtract( c, query( "elevator" ), { label="room" } ) end

  • - Frames

for c in query( "room" ) do for f in fquery( c, "SIDE" ) do component{ c, label="wall", boundary=f } end for f in fquery( c, "BOTTOM" ) do component{ c, label="floor", boundary=f } end extrude( query( c, "wall" or “floor” ), -0.1, { label="iwall" } ) end for c in query( "main" ) do for f in fquery( c, "SIDE" ) do component{ c, label="facade", boundary=f } end end extrude( query( "facade" ), 0.2, { label="ewall", color=0 } )

  • - Regions

for c in query( "wall" and parent("apartment") and occlusion("corridor") > 0 ) do region{ c, label="door" } end for c in query( "wall" and parent(“elevator”) ) do slice( c, "Y", { id="elwall", 2.5 } ) end for c in query( "elwall" and occlusion(“corridor”) > 0 ) do region{ c, id="door" } end

  • --- Doors

for r in rquery( "door" ) do connect( componentFromFile("door"), r ) end

  • - Create actual geometry.

for c in query( "iwall", "ewall" ) do solidGeometry( c, c.color ) end

component{ label="main", size={10,5,10}, color=1 }

main

slide-18
SLIDE 18
  • - Main subdivision.

component{ label="main", size={10,5,10}, color=1 } for c in query( "main" ) do slice( c, "Y", { label="story", 2.5, level=count() } ) end for c in query( "story" ) do split( c, "Z", { label="living space", rel=2 }, { label="corridor", color=2, abs=2 }, { label="living space", rel=2 } ) end for c in query( "living space" ) do split( c, "X", { label="apartment", rel=1 }, { label="apartment", rel=1 } ) end component{ label={"elevator", "room"}, size={2,5,2}, position={4,0,2}, color=3 }

  • - Priorities.

for c in query( "apartment" or "corridor" ) do subtract( c, query( "elevator" ), { label="room" } ) end

  • - Frames

for c in query( "room" ) do for f in fquery( c, "SIDE" ) do component{ c, label="wall", boundary=f } end for f in fquery( c, "BOTTOM" ) do component{ c, label="floor", boundary=f } end extrude( query( c, "wall" or “floor” ), -0.1, { label="iwall" } ) end for c in query( "main" ) do for f in fquery( c, "SIDE" ) do component{ c, label="facade", boundary=f } end end extrude( query( "facade" ), 0.2, { label="ewall", color=0 } )

  • - Regions

for c in query( "wall" and parent("apartment") and occlusion("corridor") > 0 ) do region{ c, label="door" } end for c in query( "wall" and parent(“elevator”) ) do slice( c, "Y", { id="elwall", 2.5 } ) end for c in query( "elwall" and occlusion(“corridor”) > 0 ) do region{ c, id="door" } end

  • --- Doors

for r in rquery( "door" ) do connect( componentFromFile("door"), r ) end

  • - Create actual geometry.

for c in query( "iwall", "ewall" ) do solidGeometry( c, c.color ) end

for c in query( "main" ) do slice( c, "Y", { label="story", 2.5, level=count() } ) end

main story story

slide-19
SLIDE 19
  • - Main subdivision.

component{ label="main", size={10,5,10}, color=1 } for c in query( "main" ) do slice( c, "Y", { label="story", 2.5, level=count() } ) end for c in query( "story" ) do split( c, "Z", { label="living space", rel=2 }, { label="corridor", color=2, abs=2 }, { label="living space", rel=2 } ) end for c in query( "living space" ) do split( c, "X", { label="apartment", rel=1 }, { label="apartment", rel=1 } ) end component{ label={"elevator", "room"}, size={2,5,2}, position={4,0,2}, color=3 }

  • - Priorities.

for c in query( "apartment" or "corridor" ) do subtract( c, query( "elevator" ), { label="room" } ) end

  • - Frames

for c in query( "room" ) do for f in fquery( c, "SIDE" ) do component{ c, label="wall", boundary=f } end for f in fquery( c, "BOTTOM" ) do component{ c, label="floor", boundary=f } end extrude( query( c, "wall" or “floor” ), -0.1, { label="iwall" } ) end for c in query( "main" ) do for f in fquery( c, "SIDE" ) do component{ c, label="facade", boundary=f } end end extrude( query( "facade" ), 0.2, { label="ewall", color=0 } )

  • - Regions

for c in query( "wall" and parent("apartment") and occlusion("corridor") > 0 ) do region{ c, label="door" } end for c in query( "wall" and parent(“elevator”) ) do slice( c, "Y", { id="elwall", 2.5 } ) end for c in query( "elwall" and occlusion(“corridor”) > 0 ) do region{ c, id="door" } end

  • --- Doors

for r in rquery( "door" ) do connect( componentFromFile("door"), r ) end

  • - Create actual geometry.

for c in query( "iwall", "ewall" ) do solidGeometry( c, c.color ) end

for c in query( "story" ) do split( c, "Z", { label="living space", rel=2 }, { label="corridor", color=2, abs=2 }, { label="living space", rel=2 } ) end

main story story living space corridor living space

slide-20
SLIDE 20
  • - Main subdivision.

component{ label="main", size={10,5,10}, color=1 } for c in query( "main" ) do slice( c, "Y", { label="story", 2.5, level=count() } ) end for c in query( "story" ) do split( c, "Z", { label="living space", rel=2 }, { label="corridor", color=2, abs=2 }, { label="living space", rel=2 } ) end for c in query( "living space" ) do split( c, "X", { label="apartment", rel=1 }, { label="apartment", rel=1 } ) end component{ label={"elevator", "room"}, size={2,5,2}, position={4,0,2}, color=3 }

  • - Priorities.

for c in query( "apartment" or "corridor" ) do subtract( c, query( "elevator" ), { label="room" } ) end

  • - Frames

for c in query( "room" ) do for f in fquery( c, "SIDE" ) do component{ c, label="wall", boundary=f } end for f in fquery( c, "BOTTOM" ) do component{ c, label="floor", boundary=f } end extrude( query( c, "wall" or “floor” ), -0.1, { label="iwall" } ) end for c in query( "main" ) do for f in fquery( c, "SIDE" ) do component{ c, label="facade", boundary=f } end end extrude( query( "facade" ), 0.2, { label="ewall", color=0 } )

  • - Regions

for c in query( "wall" and parent("apartment") and occlusion("corridor") > 0 ) do region{ c, label="door" } end for c in query( "wall" and parent(“elevator”) ) do slice( c, "Y", { id="elwall", 2.5 } ) end for c in query( "elwall" and occlusion(“corridor”) > 0 ) do region{ c, id="door" } end

  • --- Doors

for r in rquery( "door" ) do connect( componentFromFile("door"), r ) end

  • - Create actual geometry.

for c in query( "iwall", "ewall" ) do solidGeometry( c, c.color ) end

for c in query( "living space" ) do split( c, "X", { label="apartment", rel=1 }, { label="apartment", rel=1 } ) end

main story story living space corridor living space apartment apartment apartment apartment

slide-21
SLIDE 21

main story story living space corridor living space apartment apartment apartment apartment elevator, room

  • - Main subdivision.

component{ label="main", size={10,5,10}, color=1 } for c in query( "main" ) do slice( c, "Y", { label="story", 2.5, level=count() } ) end for c in query( "story" ) do split( c, "Z", { label="living space", rel=2 }, { label="corridor", color=2, abs=2 }, { label="living space", rel=2 } ) end for c in query( "living space" ) do split( c, "X", { label="apartment", rel=1 }, { label="apartment", rel=1 } ) end component{ label={"elevator", "room"}, size={2,5,2}, position={4,0,2}, color=3 }

  • - Priorities.

for c in query( "apartment" or "corridor" ) do subtract( c, query( "elevator" ), { label="room" } ) end

  • - Frames

for c in query( "room" ) do for f in fquery( c, "SIDE" ) do component{ c, label="wall", boundary=f } end for f in fquery( c, "BOTTOM" ) do component{ c, label="floor", boundary=f } end extrude( query( c, "wall" or “floor” ), -0.1, { label="iwall" } ) end for c in query( "main" ) do for f in fquery( c, "SIDE" ) do component{ c, label="facade", boundary=f } end end extrude( query( "facade" ), 0.2, { label="ewall", color=0 } )

  • - Regions

for c in query( "wall" and parent("apartment") and occlusion("corridor") > 0 ) do region{ c, label="door" } end for c in query( "wall" and parent(“elevator”) ) do slice( c, "Y", { id="elwall", 2.5 } ) end for c in query( "elwall" and occlusion(“corridor”) > 0 ) do region{ c, id="door" } end

  • --- Doors

for r in rquery( "door" ) do connect( componentFromFile("door"), r ) end

  • - Create actual geometry.

for c in query( "iwall", "ewall" ) do solidGeometry( c, c.color ) end

component{ label={"elevator", "room"}, size={2,5,2}, position={4,0,2}, color=3 }

slide-22
SLIDE 22
  • - Main subdivision.

component{ label="main", size={10,5,10}, color=1 } for c in query( "main" ) do slice( c, "Y", { label="story", 2.5, level=count() } ) end for c in query( "story" ) do split( c, "Z", { label="living space", rel=2 }, { label="corridor", color=2, abs=2 }, { label="living space", rel=2 } ) end for c in query( "living space" ) do split( c, "X", { label="apartment", rel=1 }, { label="apartment", rel=1 } ) end component{ label={"elevator", "room"}, size={2,5,2}, position={4,0,2}, color=3 }

  • - Priorities.

for c in query( "apartment" or "corridor" ) do subtract( c, query( "elevator" ), { label="room" } ) end

  • - Frames

for c in query( "room" ) do for f in fquery( c, "SIDE" ) do component{ c, label="wall", boundary=f } end for f in fquery( c, "BOTTOM" ) do component{ c, label="floor", boundary=f } end extrude( query( c, "wall" or “floor” ), -0.1, { label="iwall" } ) end for c in query( "main" ) do for f in fquery( c, "SIDE" ) do component{ c, label="facade", boundary=f } end end extrude( query( "facade" ), 0.2, { label="ewall", color=0 } )

  • - Regions

for c in query( "wall" and parent("apartment") and occlusion("corridor") > 0 ) do region{ c, label="door" } end for c in query( "wall" and parent(“elevator”) ) do slice( c, "Y", { id="elwall", 2.5 } ) end for c in query( "elwall" and occlusion(“corridor”) > 0 ) do region{ c, id="door" } end

  • --- Doors

for r in rquery( "door" ) do connect( componentFromFile("door"), r ) end

  • - Create actual geometry.

for c in query( "iwall", "ewall" ) do solidGeometry( c, c.color ) end

for c in query( "apartment" or "corridor" ) do subtract( c, query( "elevator" ), { label="room" } ) end

main story story living space living space corridor apartment apartment apartment apartment elevator, room room room room room room

slide-23
SLIDE 23
  • - Main subdivision.

component{ label="main", size={10,5,10}, color=1 } for c in query( "main" ) do slice( c, "Y", { label="story", 2.5, level=count() } ) end for c in query( "story" ) do split( c, "Z", { label="living space", rel=2 }, { label="corridor", color=2, abs=2 }, { label="living space", rel=2 } ) end for c in query( "living space" ) do split( c, "X", { label="apartment", rel=1 }, { label="apartment", rel=1 } ) end component{ label={"elevator", "room"}, size={2,5,2}, position={4,0,2}, color=3 }

  • - Priorities.

for c in query( "apartment" or "corridor" ) do subtract( c, query( "elevator" ), { label="room" } ) end

  • - Frames

for c in query( "room" ) do for f in fquery( c, "SIDE" ) do component{ c, label="wall", boundary=f } end for f in fquery( c, "BOTTOM" ) do component{ c, label="floor", boundary=f } end extrude( query( c, "wall" or “floor” ), -0.05, { label="iwall" } ) end for c in query( "main" ) do for f in fquery( c, "SIDE" ) do component{ c, label="facade", boundary=f } end end extrude( query( "facade" ), 0.2, { label="ewall", color=0 } )

  • - Regions

for c in query( "wall" and parent("apartment") and occlusion("corridor") > 0 ) do region{ c, label="door" } end for c in query( "wall" and parent(“elevator”) ) do slice( c, "Y", { id="elwall", 2.5 } ) end for c in query( "elwall" and occlusion(“corridor”) > 0 ) do region{ c, id="door" } end

  • --- Doors

for r in rquery( "door" ) do connect( componentFromFile("door"), r ) end

  • - Create actual geometry.

for c in query( "iwall", "ewall" ) do solidGeometry( c, c.color ) end

for c in query( "room" ) do for f in fquery( c, "SIDE" ) do component{ c, label="wall", boundary=f } end for f in fquery( c, "BOTTOM" ) do component{ c, label="floor", boundary=f } end extrude( query( c, "wall" or “floor” ), -0.1, { label="iwall" } ) end

main story story living space living space corridor apartment apartment apartment apartment elevator, room room room room room room floor wall wall floor wall wall iwall iwall iwall iwall iwall iwall

slide-24
SLIDE 24
  • - Main subdivision.

component{ label="main", size={10,5,10}, color=1 } for c in query( "main" ) do slice( c, "Y", { label="story", 2.5, level=count() } ) end for c in query( "story" ) do split( c, "Z", { label="living space", rel=2 }, { label="corridor", color=2, abs=2 }, { label="living space", rel=2 } ) end for c in query( "living space" ) do split( c, "X", { label="apartment", rel=1 }, { label="apartment", rel=1 } ) end component{ label={"elevator", "room"}, size={2,5,2}, position={4,0,2}, color=3 }

  • - Priorities.

for c in query( "apartment" or "corridor" ) do subtract( c, query( "elevator" ), { label="room" } ) end

  • - Frames

for c in query( "room" ) do for f in fquery( c, "SIDE" ) do component{ c, label="wall", boundary=f } end for f in fquery( c, "BOTTOM" ) do component{ c, label="floor", boundary=f } end extrude( query( c, "wall" or “floor” ), -0.05, { label="iwall" } ) end for c in query( "main" ) do for f in fquery( c, "SIDE" ) do component{ c, label="facade", boundary=f } end end extrude( query( "facade" ), 0.05, { label="ewall", color=0 } )

  • - Regions

for c in query( "wall" and parent("apartment") and occlusion("corridor") > 0 ) do region{ c, label="door" } end for c in query( "wall" and parent(“elevator”) ) do slice( c, "Y", { id="elwall", 2.5 } ) end for c in query( "elwall" and occlusion(“corridor”) > 0 ) do region{ c, id="door" } end

  • --- Doors

for r in rquery( "door" ) do connect( componentFromFile("door"), r ) end

  • - Create actual geometry.

for c in query( "iwall", "ewall" ) do solidGeometry( c, c.color ) end

for c in query( "main" ) do for f in fquery( c, "SIDE" ) do component{ c, label="facade", boundary=f } end end extrude( query( "facade" ), 0.2, { label="ewall", color=0 } )

main story story living space living space corridor apartment apartment apartment apartment elevator, room room room room room room floor wall wall floor wall wall iwall iwall iwall iwall iwall iwall facade facade ewall ewall

slide-25
SLIDE 25
  • - Main subdivision.

component{ label="main", size={10,5,10}, color=1 } for c in query( "main" ) do slice( c, "Y", { label="story", 2.5, level=count() } ) end for c in query( "story" ) do split( c, "Z", { label="living space", rel=2 }, { label="corridor", color=2, abs=2 }, { label="living space", rel=2 } ) end for c in query( "living space" ) do split( c, "X", { label="apartment", rel=1 }, { label="apartment", rel=1 } ) end component{ label={"elevator", "room"}, size={2,5,2}, position={4,0,2}, color=3 }

  • - Priorities.

for c in query( "apartment" or "corridor" ) do subtract( c, query( "elevator" ), { label="room" } ) end

  • - Frames

for c in query( "room" ) do for f in fquery( c, "SIDE" ) do component{ c, label="wall", boundary=f } end for f in fquery( c, "BOTTOM" ) do component{ c, label="floor", boundary=f } end extrude( query( c, "wall" or “floor” ), -0.1, { label="iwall" } ) end for c in query( "main" ) do for f in fquery( c, "SIDE" ) do component{ c, label="facade", boundary=f } end end extrude( query( "facade" ), 0.05, { label="ewall", color=0 } )

  • - Regions

for c in query( "wall" and parent("apartment") and occlusion("corridor") > 0 ) do region{ c, label="door" } end for c in query( "wall" and parent(“elevator”) ) do slice( c, "Y", { id="elwall", 2.5 } ) end for c in query( "elwall" and occlusion(“corridor”) > 0 ) do region{ c, id="door" } end

  • --- Doors

for r in rquery( "door" ) do connect( componentFromFile("door"), r ) end

  • - Create actual geometry.

for c in query( "iwall", "ewall" ) do solidGeometry( c, c.color ) end

for c in query( "wall" and parent("apartment") and occlusion("corridor") > 0 ) do region{ c, label="door" } end

main story story living space living space corridor apartment apartment apartment apartment elevator, room room room room room room floor wall wall floor wall wall iwall iwall iwall iwall iwall iwall facade facade ewall ewall door

slide-26
SLIDE 26
  • - Main subdivision.

component{ label="main", size={10,5,10}, color=1 } for c in query( "main" ) do slice( c, "Y", { label="story", 2.5, level=count() } ) end for c in query( "story" ) do split( c, "Z", { label="living space", rel=2 }, { label="corridor", color=2, abs=2 }, { label="living space", rel=2 } ) end for c in query( "living space" ) do split( c, "X", { label="apartment", rel=1 }, { label="apartment", rel=1 } ) end component{ label={"elevator", "room"}, size={2,5,2}, position={4,0,2}, color=3 }

  • - Priorities.

for c in query( "apartment" or "corridor" ) do subtract( c, query( "elevator" ), { label="room" } ) end

  • - Frames

for c in query( "room" ) do for f in fquery( c, "SIDE" ) do component{ c, label="wall", boundary=f } end for f in fquery( c, "BOTTOM" ) do component{ c, label="floor", boundary=f } end extrude( query( c, "wall" or “floor” ), -0.1, { label="iwall" } ) end for c in query( "main" ) do for f in fquery( c, "SIDE" ) do component{ c, label="facade", boundary=f } end end extrude( query( "facade" ), 0.2, { label="ewall", color=0 } )

  • - Regions

for c in query( "wall" and parent("apartment") and occlusion("corridor") > 0 ) do region{ c, label="door" } end for c in query( "wall" and parent(“elevator”) ) do slice( c, "Y", { id="elwall", 2.5 } ) end for c in query( "elwall" and occlusion(“corridor”) > 0 ) do region{ c, id="door" } end

  • --- Doors

for r in rquery( "door" ) do connect( componentFromFile("door"), r ) end

  • - Create actual geometry.

for c in query( "iwall", "ewall" ) do solidGeometry( c, c.color ) end

for c in query( "wall" and parent(“elevator”) ) do slice( c, "Y", { id="elwall", 2.5 } ) end for c in query( "elwall" and occlusion(“corridor”) > 0 ) do region{ c, id="door" } end

main story story living space living space corridor apartment apartment apartment apartment elevator, room room room room room room floor wall wall floor wall wall iwall iwall iwall iwall iwall iwall facade facade ewall ewall door elwall door

slide-27
SLIDE 27
  • - Main subdivision.

component{ label="main", size={10,5,10}, color=1 } for c in query( "main" ) do slice( c, "Y", { label="story", 2.5, level=count() } ) end for c in query( "story" ) do split( c, "Z", { label="living space", rel=2 }, { label="corridor", color=2, abs=2 }, { label="living space", rel=2 } ) end for c in query( "living space" ) do split( c, "X", { label="apartment", rel=1 }, { label="apartment", rel=1 } ) end component{ label={"elevator", "room"}, size={2,5,2}, position={4,0,2}, color=3 }

  • - Priorities.

for c in query( "apartment" or "corridor" ) do subtract( c, query( "elevator" ), { label="room" } ) end

  • - Frames

for c in query( "room" ) do for f in fquery( c, "SIDE" ) do component{ c, label="wall", boundary=f } end for f in fquery( c, "BOTTOM" ) do component{ c, label="floor", boundary=f } end extrude( query( c, "wall" or “floor” ), -0.1, { label="iwall" } ) end for c in query( "main" ) do for f in fquery( c, "SIDE" ) do component{ c, label="facade", boundary=f } end end extrude( query( "facade" ), 0.2, { label="ewall", color=0 } )

  • - Regions

for c in query( "wall" and parent("apartment") and occlusion("corridor") > 0 ) do region{ c, label="door" } end for c in query( "wall" and parent(“elevator”) ) do slice( c, "Y", { id="elwall", 2.5 } ) end for c in query( "elwall" and occlusion(“corridor”) > 0 ) do region{ c, id="door" } end

  • --- Doors

for r in rquery( "door" ) do connect( componentFromFile("door"), r ) end

  • - Create actual geometry.

for c in query( "iwall", "ewall" ) do solidGeometry( c, c.color ) end

for r in rquery( "door" ) do connect( componentFromFile("door"), r ) end

main story story living space living space corridor apartment apartment apartment apartment elevator, room room room room room room floor wall wall floor wall wall iwall iwall iwall iwall iwall iwall facade facade ewall ewall door elwall door door door

slide-28
SLIDE 28
  • - Main subdivision.

component{ label="main", size={10,5,10}, color=1 } for c in query( "main" ) do slice( c, "Y", { label="story", 2.5, level=count() } ) end for c in query( "story" ) do split( c, "Z", { label="living space", rel=2 }, { label="corridor", color=2, abs=2 }, { label="living space", rel=2 } ) end for c in query( "living space" ) do split( c, "X", { label="apartment", rel=1 }, { label="apartment", rel=1 } ) end component{ label={"elevator", "room"}, size={2,5,2}, position={4,0,2}, color=3 }

  • - Priorities.

for c in query( "apartment" or "corridor" ) do subtract( c, query( "elevator" ), { label="room" } ) end

  • - Frames

for c in query( "room" ) do for f in fquery( c, "SIDE" ) do component{ c, label="wall", boundary=f } end for f in fquery( c, "BOTTOM" ) do component{ c, label="floor", boundary=f } end extrude( query( c, "wall" or “floor” ), -0.1, { label="iwall" } ) end for c in query( "main" ) do for f in fquery( c, "SIDE" ) do component{ c, label="facade", boundary=f } end end extrude( query( "facade" ), 0.2, { label="ewall", color=0 } )

  • - Regions

for c in query( "wall" and parent("apartment") and occlusion("corridor") > 0 ) do region{ c, label="door" } end for c in query( "wall" and parent(“elevator”) ) do slice( c, "Y", { id="elwall", 2.5 } ) end for c in query( "elwall" and occlusion(“corridor”) > 0 ) do region{ c, id="door" } end

  • --- Doors

for r in rquery( "door" ) do connect( componentFromFile("door"), r ) end

  • - Create actual geometry.

for c in query( "iwall", "ewall" ) do solidGeometry( c, c.color ) end

for c in query( "iwall", "ewall" ) do solidGeometry( c, c.color ) end

main story story living space living space corridor apartment apartment apartment apartment elevator, room room room room room room floor wall wall floor wall wall iwall iwall iwall iwall iwall iwall facade facade ewall ewall door elwall door door door

slide-29
SLIDE 29
  • - Main subdivision.

component{ label="main", size={10,5,10}, color=1 } for c in query( "main" ) do slice( c, "Y", { label="story", 2.5, level=count() } ) end for c in query( "story" ) do split( c, "Z", { label="living space", rel=2 }, { label="corridor", color=2, abs=2 }, { label="living space", rel=2 } ) end for c in query( "living space" ) do split( c, "X", { label="apartment", rel=1 }, { label="apartment", rel=1 } ) end component{ label={"elevator", "room"}, size={2,5,2}, position={4,0,2}, color=3 }

  • - Priorities.

for c in query( "apartment" or "corridor" ) do subtract( c, query( "elevator" ), { label="room" } ) end

  • - Frames

for c in query( "room" ) do for f in fquery( c, "SIDE" ) do component{ c, label="wall", boundary=f } end for f in fquery( c, "BOTTOM" ) do component{ c, label="floor", boundary=f } end extrude( query( c, "wall" or “floor” ), -0.1, { label="iwall" } ) end for c in query( "main" ) do for f in fquery( c, "SIDE" ) do component{ c, label="facade", boundary=f } end end extrude( query( "facade" ), 0.2, { label="ewall", color=0 } )

  • - Regions

for c in query( "wall" and parent("apartment") and occlusion("corridor") > 0 ) do region{ c, label="door" } end for c in query( "wall" and parent(“elevator”) ) do slice( c, "Y", { id="elwall", 2.5 } ) end for c in query( "elwall" and occlusion(“corridor”) > 0 ) do region{ c, id="door" } end

  • --- Doors

for r in rquery( "door" and parent(“wall”) ) do connect( componentFromFile("door"), r ) end for r in rquery( "door" and parent(“elwall”) ) do connect( componentFromFile("door2"), r ) end

  • - Create actual geometry.

for c in query( "iwall", "ewall" ) do solidGeometry( c, c.color )

for r in rquery( "door" and parent(“wall”) ) do connect( componentFromFile("door"), r ) end for r in rquery( "door" and parent(“elwall”) ) do connect( componentFromFile("door2"), r ) end

main story story living space living space corridor apartment apartment apartment apartment elevator, room room room room room room floor wall wall floor wall wall iwall iwall iwall iwall iwall iwall facade facade ewall ewall door elwall door door door2

slide-30
SLIDE 30
  • - Main subdivision.

component{ label="main", size={10,5,10}, color=1 } for c in query( "main" ) do slice( c, "Y", { label="story", 2.5, level=count() } ) end for c in query( "story" ) do split( c, "Z", { label="living space", rel=2 }, { label="corridor", color=2, abs=2 }, { label="living space", rel=2 } ) end for c in query( "living space" ) do split( c, "X", { label="apartment", rel=1 }, { label="apartment", rel=1 } ) end component{ label={"elevator", "room"}, size={2,5,2}, position={4,0,2}, color=3 }

  • - Priorities.

for c in query( "apartment" or "corridor" ) do subtract( c, query( "elevator" ), { label="room" } ) end

  • - Frames

for c in query( "room" ) do for f in fquery( c, "SIDE" ) do component{ c, label="wall", boundary=f } end for f in fquery( c, "BOTTOM" ) do component{ c, label="floor", boundary=f } end extrude( query( c, "wall" or “floor” ), -0.1, { label="iwall" } ) end for c in query( "story" ) do for f in fquery( c, "SIDE" ) do component{ c, label="facade", boundary=f } end end for c in query( "facade" ) do split( c, "Y", { label="f1", rel=1 }, { label="ledge", 0.2 } ) end extrude( query( “f1” ), 0.2, { label="ewall", color=0 } ) extrude( query( “ledge” ), 0.3, { label="ewall", color=0 } )

  • - Regions

for c in query( "wall" and parent("apartment") and occlusion("corridor") > 0 ) do region{ c, label="door" } end for c in query( "wall" and parent(“elevator”) ) do slice( c, "Y", { id="elwall", 2.5 } ) end for c in query( "elwall" and occlusion(“corridor”) > 0 ) do region{ c, id="door" } end

  • --- Doors

for r in rquery( "door" and parent(“wall”) ) do connect( componentFromFile("door"), r ) end for r in rquery( "door" and parent(“elwall”) ) do connect( componentFromFile("door2"), r ) end

for c in query( "story" ) do for f in fquery( c, "SIDE" ) do component{ c, label="facade", boundary=f } end end for c in query( "facade" ) do split( c, "Y", { label="f1", rel=1 }, { label="ledge", 0.2 } ) end extrude( query( “f1” ), 0.2, { label="ewall", color=0 } ) extrude( query( “ledge” ), 0.3, { label="ewall", color=0 } )

main story story living space living space corridor apartment apartment apartment apartment elevator, room room room room room room floor wall wall floor wall wall iwall iwall iwall iwall iwall iwall facade facade ledge f1 ewall ewall door elwall door door door2

slide-31
SLIDE 31
  • - Main subdivision.

component{ label="main", size={10,5,10}, color=1 } for c in query( "main" ) do slice( c, "Y", { label="story", 2.5, level=count() } ) end for c in query( "story" ) do split( c, "Z", { label="living space", rel=2 }, { label="corridor", color=2, abs=2 }, { label="living space", rel=2 } ) end for c in query( "living space" ) do split( c, "X", { label="apartment", rel=1 }, { label="apartment", rel=1 } ) end component{ label={"elevator", "room"}, size={2,5,2}, position={4,0,2}, color=3 }

  • - Priorities.

for c in query( "apartment" or "corridor" ) do subtract( c, query( "elevator" ), { label="room" } ) end

  • - Frames

for c in query( "room" ) do for f in fquery( c, "SIDE" ) do component{ c, label="wall", boundary=f } end for f in fquery( c, "BOTTOM" ) do component{ c, label="floor", boundary=f } end extrude( query( c, "wall" or “floor” ), -0.1, { label="iwall" } ) end for c in query( "story" ) do for f in fquery( c, "SIDE" ) do component{ c, label="facade", boundary=f } end end for c in query( "facade" ) do split( c, "Y", { label="f1", rel=1 }, { label="ledge", 0.2 } ) end extrude( query( “f1” ), 0.2, { label="ewall", color=0 } ) extrude( query( “ledge” ), 0.3, { label="ewall", color=0 } )

  • - Regions

for c in query( "wall" and parent("apartment") and occlusion("corridor") > 0 ) do region{ c, label="door" } end for c in query( "wall" and parent(“elevator”) ) do slice( c, "Y", { id="elwall", 2.5 } ) end for c in query( "elwall" and occlusion(“corridor”) > 0 ) do region{ c, id="door" } end for c in query( "f1" ) do slice( c, "X", { label="f2", 4 } ) end for c in query( "f2" ) do region{ c, label="window" } end for r in rquery( "window" ) do connect( componentFromFile("window"), r )

for c in query( "f1" ) do slice( c, "X", { label="f2", 4 } ) end for c in query( "f2" ) do region{ c, label="window" } end for r in rquery( "window" ) do connect( componentFromFile("window"), r ) end

main story story living space living space corridor apartment apartment apartment apartment elevator, room room room room room room floor wall wall floor wall wall iwall iwall iwall iwall iwall iwall facade facade ledge f1 f2 f2 ewall ewall door elwall door door door2 win window

slide-32
SLIDE 32
  • - Main subdivision.

component{ label="main", size={10,5,10}, color=1 } for c in query( "main" ) do slice( c, "Y", { label="story", 2.5, level=count() } ) end for c in query( "story" ) do split( c, "Z", { label="living space", rel=2 }, { label="corridor", color=2, abs=2 }, { label="living space", rel=2 } ) end for c in query( "living space" ) do split( c, "X", { label="apartment", rel=1 }, { label="apartment", rel=1 } ) end component{ label={"elevator", "room"}, size={2,5,2}, position={4,0,2}, color=3 }

  • - Priorities.

for c in query( "apartment" or "corridor" ) do subtract( c, query( "elevator" ), { label="room" } ) end

  • - Frames

for c in query( "room" ) do for f in fquery( c, "SIDE" ) do component{ c, label="wall", boundary=f } end for f in fquery( c, "BOTTOM" ) do component{ c, label="floor", boundary=f } end extrude( query( c, "wall" or “floor” ), -0.1, { label="iwall" } ) end for c in query( "story" ) do for f in fquery( c, "SIDE" ) do component{ c, label="facade", boundary=f } end end for c in query( "facade" ) do split( c, "Y", { label="f1", rel=1 }, { label="ledge", 0.2 } ) end extrude( query( “f1” ), 0.2, { label="ewall", color=0 } ) extrude( query( “ledge” ), 0.3, { label="ewall", color=0 } )

  • - Regions

for c in query( "wall" and parent("apartment") and occlusion("corridor") > 0 ) do region{ c, label="door" } end for c in query( "wall" and parent(“elevator”) ) do slice( c, "Y", { id="elwall", 2.5 } ) end for c in query( "elwall" and occlusion(“corridor”) > 0 ) do region{ c, id="door" } end for c in query( "f1" ) do slice( c, "X", { label="f2", 4 } ) end for c in query( "f2" ) do region{ c, label="window" } end for r in rquery( "window" ) do connect( componentFromFile("window"), r )

for r in rquery( "window" and level==1 ) do connect( componentFromFile("window"), r ) end for r in rquery( "window" and level>1 ) do connect( componentFromFile("window2"), r ) end

main story story living space living space corridor apartment apartment apartment apartment elevator, room room room room room room floor wall wall floor wall wall iwall iwall iwall iwall iwall iwall facade facade ledge f1 f2 f2 ewall ewall door elwall door door door2 win window2

slide-33
SLIDE 33

RESULTS

slide-34
SLIDE 34
slide-35
SLIDE 35
slide-36
SLIDE 36
slide-37
SLIDE 37
slide-38
SLIDE 38
slide-39
SLIDE 39
slide-40
SLIDE 40

INTERIOR VARIATION

slide-41
SLIDE 41

INTERIOR VARIATION

slide-42
SLIDE 42

EXTERIOR VARIATION

slide-43
SLIDE 43

EXTERIOR VARIATION

slide-44
SLIDE 44
slide-45
SLIDE 45

CONCLUSION

  • Interiors and exteriors
  • Programming environment
  • code reuse (libraries)
  • Flexible and powerful
  • Complex task
slide-46
SLIDE 46

FUTURE WORK

  • Optimization operation for high level space partitioning
  • Higher level coding
  • interface
  • photos
  • Lazy generation
slide-47
SLIDE 47

QUESTIONS

  • www.iro.umontreal.ca/labs/infographie/papers/Leblanc-2011-CMCB/
  • paper
  • videos
  • slides