Go back

H.U.R.B.A.N. Selector

Experimental procedural geometry modeling and morphing tool

H.U.R.B.A.N Selector is a software experiment initially funded by the Slovak Design Center I worked on with Ján Pernecký (Subdigital) and Ondrej Slinták. It is meant to test the hypothesis that creating new designs and shapes is subconsciously inspired by our previous experience. There is a trial and error phase in the design process where many variations on the same shape are prototyped and chosen from.

The software currently has many rough edges (mostly on the usability side), but it strives to be a tool for simple parametric modeling, containing implementations of various morphing strategies for mesh models, allowing designers to smoothly interpolate between multiple mesh geometries and select the result with the most desired features.

Following the explicit history lineage of Grasshopper, we decided that every decision the user makes in the editor should not only be undo-able, but also modifiable at any point. The geometry displayed in the viewport is just the result of applying operations on the initially empty world. These operations can create or import geometry, or transform existing geometries in some way, e.g. perform iterative Laplace Relaxation.

Screenshot of a model morph in H.U.R.B.A.N. Selector

Exposing the declarative nature of editing to the user freed us to utilize a well specified thought model of having an interpreter that evaluates a directed acyclic graph of possibly interdependent operations. Naturally, we didn't want to execute the whole graph of possibly heavy operations on every change to its definition. Simple tricks such as ID-ing the operations instances by their operation type and parameter values allowed us to preserve sub-graphs of computation from previous interactions and only recompute the minimal necessary set of operations.

I was surprised to learn that the UI of some 3D modeling tools (e.g. Rhino, Blender) can freeze up when performing computations on heavy geometries. We knew from the start that some of the topology traversal algorithms necessary to implement the strategy of morphing we initially wanted to do won't have great time complexity, and therefore opted to run the graph interpreter in its own thread and design the UI around this asynchrony from the get-go. As these things usually go, we did't implement the topology based approach to morphing in the end, but at least as a positive side effect the editor doesn't freeze up. Mostly.

The editor itself is written in the Rust programming language, with the use of a few libraries (Cargo.toml). This certainly proved to be a lot of work, but has paid of in some areas - for instance our implementation of some geometry algorithms already outperforms Rhino. Overall the balance between using existing solutions and making something from scratch is tough to strike.

H.U.R.B.A.N. Selector proved to be a lot of work and as our funding was nearing end, we had to sacrifice some of the things we wanted to do. Most notably, we are really unhappy with the current user interface. One of the first things we would do when working on the project again would be to openly admit to and promote the graph structure of the geometry definition, and allow the user to model geometry via a node-based programming environment similar to Grasshopper or Unreal Blueprints.

Screenshot of Simplex Noise generated scalar field materialized via Marching Cubes and smoothed by Loop Subdivision in H.U.R.B.A.N. Selector