autoplay
theme
2024 · Installation · Interactive · Tool

Functionless

An authoring tool for household objects that have lost their function. Visitors drive a Houdini generator from a panel of sliders, and the result renders to a poster while they wait.

Ars Electronica Festival 2024 Campus Exhibition · V&A Digital Design Weekend 2024
Functionless

What would household items be like if they were freed from their function?

Functionless is the tool that answers it. A visitor works a panel of sliders, builds a household object that has stopped being useful, and it comes back on the wall beside them as a poster named after a star.

What happens when you turn a knob

There are no menus and no mouse. Sliders, switches and two rotary knobs change the object on screen as they move. Render sends it to the gallery wall with a QR code to take it home.

Underneath, that is five programs in a line. An Arduino Mega reads the panel and writes serial. Unreal owns the session state and the interface. Houdini does the actual generating, driven from inside Unreal through the Houdini Engine API. Python moves the finished render to S3 and makes the QR code. TouchDesigner drives the two gallery displays.

Block diagram: an Arduino controller sending serial to a computer running Unreal, Houdini, Python and TouchDesigner, with outputs to a controller display, two gallery displays and a QR code
The system as designed. The naming model at the bottom was tested and never shipped.

The authoring model is the hardware

The tool has six steps: choose an object, edit it, set an effect, simulate it, stage it, then name and render. The panel presents three. Each stage holds the steps that belong together, and only one stage is live at a time.

Sliders 1 to 5 build the form. The second group distorts it: which effect, how big, how far offset. The third group stages it for the camera, with background, object material, light colour and light rotation. Next commits a stage, Home starts over, and Render is a physical button, which is the moment the visitor stops editing and starts waiting.

The tool on its own, start to finish. Object, shape, effect, material, stage, light, name.
Line drawing of the controller with fifteen numbered callouts grouped into Stage 1 sliders, Stage 2 effects controls and Stage 3 environment controls, plus Home, Rotation, Next and Render
The console, labelled. Fifteen controls, grouped by stage.

That collapse is what made the piece usable by someone who had just walked in.

Five other inputs were tried first:

PathWhat it was
MIDI to UnrealA MIDI Mix bound through a Remote Control preset
MIDI to HoudiniThe same, via a virtual MIDI device
OSC from TouchDesignerAn iPad camera through MediaPipe, hands as input
JSON and OSC via ZigSimA phone's sensors straight into Houdini
Web UIA browser page driving both

MIDI got closest and failed in the one place that mattered. A Remote Control preset binds happily to Blueprint variables, and reaching through one to an HDA parameter crashed the editor. Everything a visitor touches is an HDA parameter, so that was the end of it. The rest ask for a phone, a browser or a camera, which a gallery console cannot rely on.

Serial shipped.

A visitor at the console with the interface reading Build Your Object, You are in STAGE 1
Stage 1. Bare form, no material, no set.
The same visitor later, with the interface reading Edit the Environment, You are at STAGE 3
Stage 3, same visitor. Material, light and background.

It ran on cardboard and exposed wire for months before it was a console.

A hand on the prototype control panel, sliders and knobs in cardboard with wiring exposed and stage labels written by hand
The prototype. Stage labels written on by hand, in the same three groups.

Houdini inside Unreal

The generator is a Houdini digital asset running inside the Unreal editor rather than beside it, through the Houdini Engine API. Unreal holds the parameters, HAPI cooks the asset, the geometry comes back into the level. One application, one process owning session state, no files handed between programs at show time.

The editor tool the console was built against. Leg count, effect size, material.

HAPI is a good road in and a poor road back out, because a cook returns geometry and these objects need a cache: the inflation is a simulation, so what is worth keeping is several hundred frames of moving mesh.

Vertex animation textures are the real-time answer and I tried them first. They need vertex count and order to hold still for the whole take. An RBD fracture creates and destroys geometry by definition, so the bake had nothing stable to write into and the pieces came back interpenetrating.

Import test. The stools are Alembic caches. The shattered figure between them is the VAT bake, reading back wrong.

So it shipped on Alembic, which stores geometry per frame and does not care how it was made. Houdini writes the cache, Unreal imports it and binds it onto the timeline, nobody touches the editor. The one trap is the coordinate change: Houdini is Y-up and right-handed, Unreal is Z-up, left-handed and in centimetres, and getting that wrong gives you a model that looks perfectly correct until it turns around.

Alembic is the heavier format and the cost lands on import. A RAM disk for the working directory, tried to buy that cost back, saved 1.1s on the simulate and lost 1.6s on the import. It is not in the show build.

For a folder of takes, the settings became a plugin with a Transform from Houdini Space? checkbox that defaults to exactly that conversion. Released as unreal-alembic-batch-importer, and it is the part of this project I still use on work that has nothing to do with it.

Telling the visitor it is working

The render takes long enough that a frozen screen looks broken.

Houdini rendering in the background has no opinion about Unreal's interface, so the render reports on itself: a callback fires after every frame and sends its position to Unreal over OSC, which drives the progress dialog. The bar the visitor watches is the frame Houdini is actually on, not an animation of a bar.

One-way, so neither side waits on the other.

Running with nobody in the room

The piece runs in the Unreal editor, not a packaged build, and every operational decision follows from that.

Nobody launches anything. Every program starts on boot and the machine shuts itself down at 18:00, so opening is three lines for a gallery attendant: screens on, turntable on, press the power button. Unreal or TouchDesigner dying is survivable because one restart script brings the whole stack back, and a known defect that left error text on the interface was made clearable from the console itself, so Home returns a visitor to a clean Stage 1. Both keep the piece running when I am not in the building.

What did not ship

Each piece is auto-named after a star. A vision model that read the finished object and wrote its name, or a line about what it had become, worked in tests and was cut for schedule.

The other was bigger. Houdini Engine runs in the Unreal editor, not in a packaged build, so a piece that generates geometry at runtime is stuck inside the editor forever. The way out is to build your own integration against HAPI in C++, and I started one (CustomHEnginePlugin) before stopping: months of C++ to get back to where I already was, against a thesis deadline.

345 pieces

345
pieces generated
168
stools
92
brooms
85
buckets

Every one made by a visitor, across the two runs where the machine was live: the SVA thesis exhibition and Ars Electronica.

One design was taken out of the machine and fabricated at full size by CNC routing and 3D printing, bringing a forgotten household object from the screen into the room. It sits on a turntable at the end of the room, and it is the only object in the show you could actually sit on.

Installation view: a wall-mounted screen showing a rendered piece, the console with its interface screen, the gallery display, and the fabricated blue and yellow stool on a plinth
The room. Render, console, gallery, and the fabricated stool on its turntable.
Role
Technical director and engineer. The Houdini-to-Unreal generation pipeline, the serial layer that turns the console into parameters, the render-to-gallery service, and the unattended runtime
Built with
Unreal Engine 5.2 · Houdini 19.5 with Houdini Engine · Arduino Mega · Python 3.10 · TouchDesigner · Redshift
Ran on
Intel NUC13RNGi9, i9-13900K, 64GB, one 27in interface display and two gallery displays
Shown at
SVA MFA Computer Arts thesis exhibition · Ars Electronica Festival 2024, Campus Exhibition · V&A Digital Design Weekend 2024, screening only
Context
MFA thesis project
Documentation
Full walkthrough video
Team
Creative direction, art direction, the offline renders and the console build, Andres Salazar · Music, Javier Cruz · Ambient music, Daniel Finn · Branding, Jimena Martinez
Faculty
Instructors, Anney Bonney · Javier Cruz · India Lombardi-Bello · Adam Meyers. Advisors, Paul Esteves · Daniel Finn · Ben Forest · Michael Gold
Thanks
Manuel Casasola · Michael Dondero · Mark Ingle · Christopher Kopic · Luis Navarro · Milos Paripovic · Mortiz Schwind · Jose Vargas · Mike Wang
Tools
Houdini · Unreal Engine 5 · Arduino · Python · Redshift