Armin Tajik

Game Developer

A procedural solution to a procedural problem Infinite River is an educational casual video game about the Métis people of Canada and the York Factory Express. I worked on it as a CDM industry project with a team of six people. The visuals of the game heavily rely on the…

A procedural solution to a procedural problem

Infinite River is an educational casual video game about the Métis people of Canada and the York Factory Express. I worked on it as a CDM industry project with a team of six people.

The visuals of the game heavily rely on the cliffs and trees that line the river’s banks, making them significant 3D elements. These assets, along with the systems that generated them, underwent multiple iterations during the production phase.

Since the river was procedurally generated using numerous preconstructed tiles, manual asset creation became impractical. The procedural approach also made it impossible to accomplish in a single pass, and the sheer number of possible tiles made individual handling too time-consuming.

Consequently, the initial iterations were entirely based on procedural techniques. The first concept involved extruding a mesh along the splines that defined the shorelines during runtime. However, the transitions between tiles and the unpredictable curves in the river resulted in frequent self-intersections and undesirable visual outcomes.

Initial mesh of the banks (solid green area)

During our problem-solving process, we evaluated three potential solutions to address the challenge at hand. The first option involved developing a real-time mesh generator, but we quickly realized that it would be time-consuming and didn’t align with our project timeline. The second approach entailed manually placing river tiles and creating individual river shore assets, such as cliffs and trees, for the entire river. While feasible, this solution would have compromised our procedural system and consumed a significant amount of time. The third alternative was to place shore assets in each tile, but with nearly 40 tiles to work with, this too presented a daunting task.

We ultimately chose the third solution but aimed to optimize the process. Instead of manually placing cliffs, I leveraged SideFX Houdini to generate cliffs procedurally, generate basic texture maps, and place trees accordingly. Though the generated cliffs required some texture adjustments and precise placement, this approach proved to be a time-saving method that allowed us to move forward with our intelligent river-generating system.

Initially, I designed the tool to use curves, and later adapted it to utilize flow maps as the input.

In our game prototype, we generated rivers using flowmap textures, and I used the same flowmap textures to create cliffs along its path. While the results weren’t perfect, we found them acceptable, given the prototype state of the game.

Afterwards, I proceeded to apply UV mapping and baked the grass texture on the geometry, that had the normal vector faced upward. To streamline the process for all the flowmap textures, I utilized a TOP network.

River tile with added mesh

Lastly, I used Houdini Unity Engine to effortlessly place the vegetation atop the land. The engine automatically selected the appropriate prefabs and positioned them on the cliffs, making use of the random scattered points calculated in Houdini.

Comparing the concept art and the result (Concept art done by Ziyi Gao)

Having successfully generated cliffs along the river path, we proceeded to make further adjustments to the cliff generator. These modifications were aimed at facilitating the creation of river banks for a different camera view.

Leave a Reply

Your email address will not be published. Required fields are marked *

+