Advanced Procedural Modeling of Architecture

  • Esri R&D Center Zurich
Our grammar language CGA++ enables many advanced procedural modeling scenarios, including various forms of multi-shape coordination and interaction. For example, in the shown building design, CGA++ makes it possible to distribute a given gross floor area (GFA) among the tower footprints, determine residual roof surfaces via Boolean operations for establishing terraces hosting roof gardens, and create skybridges connecting randomly shifted floors of the two towers.


We present the novel grammar language CGA++ for the procedural modeling of architecture. While existing grammar-based approaches can produce stunning results, they are limited in what modeling scenarios can be realized. In particular, many context-sensitive tasks are precluded, not least because within the rules specifying how one shape is refined, the necessary knowledge about other shapes is not available. Transcending such limitations, CGA++ significantly raises the expressiveness and offers a generic and integrated solution for many advanced procedural modeling problems. Pivotally, CGA++ grants first-class citizenship to shapes, enabling, within a grammar, directly accessing shapes and shape trees, operations on multiple shapes, rewriting shape (sub)trees, and spawning new trees (e.g., to explore multiple alternatives). The new linguistic device of events allows coordination across multiple shapes, featuring powerful dynamic grouping and synchronization. Various examples illustrate CGA++, demonstrating solutions to previously infeasible modeling challenges.


Schwarz, M., Müller, P. 2015. Advanced procedural modeling of architecture. ACM Transactions on Graphics, 34, 4 (Proceedings of SIGGRAPH 2015), Article 107
    author  = {Michael Schwarz and Pascal M{\"u}ller},
    title   = {Advanced Procedural Modeling of Architecture},
    journal = {ACM Transactions on Graphics},
    volume  = {34},
    number  = {4} # { (Proceedings of SIGGRAPH 2015)},
    year    = {2015},
    month   = aug,
    pages   = {107:1-107:12}