Stream Restoration in CityEngine

03-11-2020 11:43 AM
Occasional Contributor II
2 1 341

Updated May 6, 2020 - scroll down

Had City Engine for close to 3 months now, and one of my early CityEngine ideas was to create a procedural stream restoration code.  With just a few hours of work, I have been able to figure out some code that gives me a lot of promise that City Engine can in fact be of major use to stream restoration project planning.   Just would like to share and maybe gather some ideas from those interested.   I do intend to share my code at some point, minus the textures and assets because they are not mine.

Just to preface this work, Cincinnati, Ohio had the Army Corps come through and destroy our Mill Creek in the name of flood control.  My version of stream restoration is an intervention to this:

Concrete Channelized Mill Creek

To start,  I envisioned that the street creation tools could simply be transformed into stream creation tools.   And to my delight they can.

Using Street Creation tools for Stream Creation

The sloped stream banks are handled quite effectively by a CGA roofshed operation.

The next important step was seeing how the street handled the variations in street widths and sidewalk widths.  I've had to adjust the street junction precision between 0.1 and 1 to get the best results depending on the connection.  The image below shows a precision of 0.1, which equals one shape per intersection. 

Stream Width and Riparian Width Tests

I also wondered how the street tools would look when using them to merge streams:

Streams merging in CityEngine

It's kinda clunky, just like the streets are but I think I might be able to play around with the "freeway merge" to get more natural looking stream merges.   

Another important step towards getting the stream and riparian corridor interventions I would like to incorporate was seeing how the sidewalk splits would work.    I took a quick look at the Complete Streets sidewalk code and a simple split(v,unitSpace,0) was all that was necessary to get some divisions between the stream bank and a riparian corridor (and a second bank and riparian area).

Stream Bank UV splits

The scatter tool is quite effective for creation of stream boulders and stream-side vegetation instances.  For the boulders it sort of simulates the riffle --> pool --> riffle --> pool patterns of streams.  And for the plants it can be used to put them at streams edge (like a surbmersed plant) or top of stream bank.

Stream Restoration image

Where I envision spending a lot more time is on finding textures and 3D models that  represent the local stream bank conditions (plants, stream hydrology, infrastructure).   We have vertical crib walls and other unique stream bank conditions that could be modeled and textured.  I also have a list of about 20 stream interventions that I plan to model:  j-hooks, cross-vanes, canopy structures, live stake plantings, rip-rap, log/brush shelters, wetlands, vegetated gabions, etc.    Also, I want to add some color coded themes for riparian invasive species scenarios  (red plants = bad invasives / green plants = natives).   So much to do...

Textures representing Wood Slatted Crib Wall

Another quick trick I learned, put a little water caustic texture in your waters "material.bumpmap" to get a slightly better looking water in City Engine.  That's probably 3D "class 101" to some, but not to an urban planner like myself.

Lastly,  I haven't exported anything to Unreal Engine yet, but I fully expect to and to use the vegetation and rock instances so they can be replaced with higher quality models and textures.  At some point, I also hope to figure out the water mechanics of UE4 to simulate a flowing stream with the particle effects of water hitting the rocks. 

 I'll update this blog at some point to feature my progress.

Thanks for looking!  Your thoughts are appreciated.


May 6, 2020 Update:

Made a few updates to my vision of a Stream Restoration CE Code that I felt like sharing...

Before Covid hit I was planning to meet with some stream restoration experts to go through this program as a tool for their work.   Collaboration with them will make this even better and give me more direction for modeling and metrics.

Rip Rap Banks

Rip-rap banks were kind of a breeze using CityEngine.   Just did a uniform scatter operation based on the shapes geometric area to fill the space. 

Purpose:  reducing flow velocity, stabilizing bank, providing spaces for sedimentation deposition, etc.

Potential metrics for Dashboard:   number of rocks needed to fill area, total cost of rocks, increased roughage of stream bank, other?

Rip Rap Bank in CE

Vegetated Geogrids

Vegetated geogrids in CE required me to model a shape in Blender that could be repeated.   I imported the model into CE as a textured fbx.

Purpose: stabilizing the stream bank, re-establishing bank vegetation, reducing flow velocity, etc.

Potential metrics for Dashboard:  area of Geogrid,  costs of Geogrid for project, increased roughage of stream bank, habitat index improvement,  other?

Vegetated Geogrid in CE

Vegetated Geogrid Image

Brush Mattress

Brush mattresses required some outside modeling for insert objects. 

Purpose: stabilizing bank, re-establishing bank vegetation, reducing flow velocity, etc.

Potential metrics for Dashboard:  number and cost of live branches,  number and cost of dead log toe or rock toe, roughage of stream, habitat index improvement, other?.

Brush Mattress

Brush Mattress Example

(still want to animate the change over time on this one and create a toe rock variant)


Purpose: J-Hooks used to deflect flow away from eroded banks and creates a pooling featuring behind the hook for fish habitat.

Potential metrics for Dashboard:  number of j-hooks per section of stream, number and cost of rocks, habitat index improvement, other?



Purpose: cross vanes channel water toward the center of the stream and create a pool feature.

Potential metrics for Dashboard:  number of cross-hooks per section of stream, number and cost of rocks, habitat index improvement,  pool-riffle pattern change, other?

Cross Vane Example CE

Stream Bank Regrading

Purpose:  increase cross-section stream capacity and regrade stream banks to prevent erosion.

Potential metrics for Dashboard:  difference between current and project stream cross section volume capacity, created spaces for bio-engineering (new vegetation).

Overflow Wetland

Purpose:  engineered high flow spill over in heavily hydro-modified stream.

Potential metrics for Dashboard:  volume capacity (diverted flood flows), spill over height, number and cost of vegetation, other? 

Overflow Wetland

I might have a few other things to share but I'll end it here for now.    

Things I am working on or curious about still in relation to Stream Restoration Code:

  • riparian corridors - basing their widths on local stream protection codes or protected status for modeling starting point
  • riparian corridors - basing the canopy on an existing canopy study in infrared and planimetric formats and how best to import or program that data into something CE can use (maybe just as a % canopy per section).
  • riparian corridors - incorporating a prominent invasive plant species (honeysuckle) and modeling its impact by section and across the entire stream.  Incorporating its removal into a habitat improvement index.
  • starting point - what stream data would be the best starting point for a wide audience (to base this code on)
  • stream access - modeling stream access locations for water recreation use - to include canoe and kayak ramps

 I'll update this blog at some point to feature my progress.

Thanks for looking!  Your thoughts are appreciated.

1 Comment
Occasional Contributor II

May 6, 2020 update half-way down.