Got a dusty Xbox 360 Kinect in a drawer? A modern Mac with no Windows in sight? This is the bridge: a Custom POP plugin + TouchDesigner component that pulls a live point cloud from the Kinect 360 straight into TD on arm64 macOS. No Windows VM, no Syphon hop, no OSC bridge. Native points, 60 fps capable, runs on your M-series Mac.
What's in the download:
- KinectPOP.plugin — the C++ plugin (statically links libfreenect + libusb, zero non-system dependencies)
- Kinect360.tox — drop-in TouchDesigner component with a custom parameter tab and three outputs
- install.sh — one-line installer
- Full source if you want to rebuild or hack on it
Hardware you need
- An Xbox 360 Kinect — model 1414 or 1473
- The 12V power adapter cable for the Kinect (the bare cable that came with the Xbox 360 console will not work; you need the version with the AC brick that gives the Kinect 12V on top of USB)
- Apple Silicon Mac (M1 / M2 / M3 / M4) — Intel users would need to rebuild the plugin from source for x86_64
- macOS 12 or later
- TouchDesigner 2025.x or newer (the new POP system was introduced in that release; the plugin compiles against the POP API)
Setup (5 minutes)
1. Install the plugin
Unzip the download. In Terminal:
cd Kinect360-TouchDesigner-macOS-arm64 ./install.sh
That copies KinectPOP.plugin to ~/Library/Application Support/Derivative/TouchDesigner099/Plugins/ and ad-hoc signs it so macOS lets TD load it.
2. Plug in the Kinect
USB into your Mac, and the 12V wall brick into power. The little green LED on the Kinect should be blinking.
3. Open TouchDesigner
Start TD with a fresh empty project.
4. Drop the TOX
Drag Kinect360.tox from the unzipped folder into your network. You'll see a kinect360_full Base COMP appear with a black preview.
5. Hit Active
In the COMP's parameter tab Kinect360, toggle Active to ON.
Within a second or two the Kinect's IR projector should fire (you'll see a bunch of dim red dots if you point a phone camera at the front of the unit) and the COMP preview will show the live point cloud.
If Active doesn't open the device the first time, press Reset (or power-cycle the Kinect's 12V brick), wait two seconds, try again.
Everything you need is on the Kinect360 tab:
ParameterWhat it does
HelpQuick reminder text — don't forget to Active=OFF before quitting
ActiveOpen or close the Kinect USB device
Mirror HorizontalFlip the X axis — useful for selfie-cam style framing
QuantizationSubsample the depth grid. 1 = full 307K points (heavy), 2 = 76K, 8 = 4.8K (default), 16 = 1.2K. Always toggle Active OFF before changing this — see "Gotchas" below.
Camera DistanceBuilt-in render camera Z position in meters
Render ResolutionOutput TOP size
Reset / Restart DeviceToggles Active OFF then ON with a 2-second gap. Use this if the Kinect goes into a stuck state
The three outputs
The TOX has three plugs you can wire to your own network:
- out_pop — the raw POP. Position attribute P is XYZ in meters in Kinect camera space (camera at origin looking down −Z, +Y up). Feed this into your own popRender, poptoSOP, instancing, GLSL POP, etc.
- out_render — the built-in render TOP. The point cloud already rendered, ready to composite or feed downstream as a TOP.
- out_info — diagnostic CHOP. Channels: device_open, depth_frames, emitted_points, execute_count. Wire to a CHOP-to-DAT for an HUD, or use it to drive a Reset trigger if depth_frames stops incrementing.
The Kinect 360 on macOS is genuinely flaky — these aren't bugs in the plugin, they're the cost of using a 14-year-old USB device through libusb on Apple Silicon.
Always toggle Active=OFF before quitting TD
If TD crashes or quits while the device is open, the macOS USB stack leaves the Kinect's interfaces in a stuck state. The only fix is to power-cycle the Kinect — unplug the 12V brick for 5 seconds, plug back in. So save yourself the dance: flip Active OFF, wait for the IR projector to go dark, then quit.
The number of emitted points must stay constant between cooks or TD's POP renderer will crash trying to read past its cached buffer size. The right sequence is:
- Active = OFF
- Change Quantization
- Active = ON
One Kinect per TD process
The plugin is single-instance. Don't drop two Kinect360.toxs into one project — only the first will claim the device, and weird things happen.
macOS audio kext fight
macOS automatically attaches its USB Audio Class kernel driver to the Kinect's audio interface. The plugin asks libfreenect to skip the audio subdevice, but the kernel grab still happens transiently. In rare cases this can panic the Mac. Power-cycle and restart if you see Console warnings about the Xbox NUI Audio.
The plugin is a TouchDesigner Custom POP written in C++. POPs (Point Operators) are the new geometry primitive in TD 2025+ — instead of producing a SOP or a TOP, the plugin emits a point cloud directly into TD's render pipeline.
Each cook, the plugin:
- Snapshots the latest depth frame from libfreenect (640×480 11-bit raw depth, refreshed at 30 fps on a worker thread)
- Subsamples by Step to keep point counts manageable
- Reprojects each valid pixel to XYZ in meters using the Kinect's well-known intrinsics:
- fx, fy = 594.21, 591.04
- cx, cy = 339.5, 242.7
- z = 1 / (raw * -0.0030711016 + 3.3309495161)
- Emits the points with a P attribute via TD's POP_Output API
The device thread is opt-in — it doesn't claim the Kinect until you toggle Active=ON, which is why dropping the TOX into a project is safe and instant.
The Apple Silicon binary statically links libfreenect and libusb, so there's nothing to install systemwide and no dylib hunting.
added in V2:
- RGB Cam support
- Motor support in TOX
- Point Cloud Stabilization
Credits
- libfreenect by the OpenKinect community — Apache 2.0 / GPL2 dual license. Years of open-source love going into this driver.
- libusb — LGPL 2.1.
- This wrapper plugin: do whatever you want with it. Credit appreciated if you ship a project using it.
Support
This release exists because Patreon supporters made it possible. If you hit a snag during setup, post in the comments — I read them all and try to help. Common issues are usually one of: wrong cable (no 12V), need to power-cycle the Kinect, or didn't toggle Active OFF before last quit.
Happy point-clouding




