Interactive Art

Open3D Inside TouchDesigner Gives You Registration, Meshing and Segmentation for Free

TouchDesigner is excellent at displaying point clouds and limited at processing them. Open3D is the opposite — and TouchDesigner has Python.

Anyone who has put a depth sensor into TouchDesigner has hit the same wall. Getting a point cloud in and rendering it is straightforward and looks great. Doing anything structural with it — aligning two captures, fitting a surface, separating the floor from the visitor — is where you start writing your own GLSL and questioning your choices.

The Interactive & Immersive HQ published a guide on 27 September to using the Open3D Python library inside TouchDesigner, and the pairing is worth understanding even before you read the how-to.

What each side is good at

TouchDesigner is a real-time display and interaction environment. Its strengths are the GPU pipeline, the operator graph, instancing, and getting something on a projector at frame rate. Its point-cloud handling is fundamentally about moving and drawing points.

Open3D is an open-source library for 3D data processing, and its documented feature set is precisely the list of things TouchDesigner lacks:

  • Registration — aligning point clouds, including ICP (iterative closest point) and global registration
  • Downsampling — voxel grids and uniform sampling, to get a capture down to a workable size
  • Normal estimation — which you need for lighting, meshing and most surface operations
  • Surface reconstruction — Poisson and ball-pivoting, turning points into meshes
  • Segmentation and clustering — plane segmentation (find the floor, find the wall), DBSCAN clustering (separate the objects)
  • Outlier removal — statistical and radius-based, for the noise every real sensor produces

And TouchDesigner has Python, which is the whole reason this works.

Why the combination matters for installation work

The practical shape of a lot of interactive work is: sensor in, something computed, visuals out. The middle step is where projects stall.

Concrete things this unlocks:

Multi-sensor alignment. Two depth cameras covering one space produce two point clouds in two coordinate systems. Registration is how they become one. Doing it by hand with transform matrices and patience is the traditional approach; ICP is the correct one.

Reliable floor and background removal. Plane segmentation finds the dominant plane and lets you discard it. That’s a far more robust way to isolate visitors than depth thresholding, which breaks the moment someone stands near a wall.

Separating people from each other. Clustering turns a cloud of points into discrete objects you can count and track. It’s the difference between “there is stuff in the room” and “there are three visitors, here.”

Scan-to-mesh in the same document. Capture, clean, reconstruct and display without exporting to another application and back.

The honest caveats

Open3D is CPU-bound and not built for frame rate. Registration and surface reconstruction are not per-frame operations. The realistic architecture is: Open3D does the heavy work occasionally or on demand — at startup, on a trigger, on a background thread — and TouchDesigner renders continuously from the result. Trying to run ICP every frame will simply stall your timeline.

Python in TouchDesigner runs on the main thread by default, so a long Open3D call will freeze the UI and drop frames. Anything slow needs to be threaded or externalised.

Installing third-party Python packages into TouchDesigner is its own small ordeal involving matching the bundled interpreter version. This is the part the tutorial is genuinely useful for, and the reason it exists.

For anyone doing depth-sensor work, the takeaway is that the processing problem is solved and has been for years — it just lives in a library nobody told you to import.