Skip to content

procedural city

Kiryha edited this page Oct 20, 2024 · 19 revisions

Intro

This project aims to design and implement procedural workflow for city modeling.

Workflow

Building profile.

The Building Profile is a starting point for building creation that defines building shape. If we extrude the Building Profile on a certain distance (building height) we get the building "Mass Model".

Building Profile example:

Facades

We split the building mass model into facades. A facade is a part of a building between two corners.

In Houdini, we split Building Profile into primitives (see Building Profile example image above that has 4 primitives: 0, 1, 2, 3) and each primitive will be a facade base. Extruding the facade base will give us a facade.

Shape Grammar

We split the facade into levels. Each level design is defined by shape grammar stored in a "BDF" JSON file. Level can contain one or more floors.

BDF stands for Building Definition File and contains building style and assembly data:

{
"levels": 
    "0": {
        "Level_index": 0,
        "Level_height": 3.2,
        "Level_rule": {
            "F0": ["C|(A)|C", "C|(B)|(C-D)*|(B)|C"],
            "S0": ["C|(W)|C", "(A)"]
            }
    },
"modules": {
    "A": {
        "width": 2.4
    }
  }
}

Solaris and USD

Import USD to Solaris

  • From "Geo" context: Scene Import (All) node.
  • From USD File: Sublayer or Asset Reference nodes

Unpack USD

  • The SOP Modify node, Unpack USD Primitives to Polygons check box
  • The SOP Modify node, go inside, and create the Unpack USD node.

Export USD from Solaris

The USD ROP node, set Save Style to Flatten Stage

Material assignment

Add node Name to geometry nodes to get different objects in USD

USD/Solaris geometry prep: define material assignment by Houdini groups (create a group for each material on geometry), then if you add a "Name" node after groups, USD file will contain mesh divided by groups and in Solaris, you will be able to assign materials by those groups.

Remove internal edges of a polygon: Divide SOP > Remove Shared Edges

Clone this wiki locally