Setup
Select the provider
Open LABO → Windows → Data Capture → Body and set a tracking row's provider to Composite (multi-source). Expand the row with the foldout on its left to reach the settings.
Use Fusion is the separate upper/lower mode described in Fusion. Composite is a provider, so it goes in a normal tracking row and does its own combining. The two are independent — turning on Use Fusion does not make Composite do more, it just adds a second row you are not using.
Settings
| Setting | What it does |
|---|---|
| Base source | The source that decides where the body is in the room and how long its bones are. Must be a source with real world positions — a headset, or a suit that tracks position. Not an orientation-only IMU set. |
| Soft-pin hands | Pull a hand driven by another source back toward the base's tracked wrist. Off by default — see the joint map. |
| Pin weight | How far toward the base's wrist to pull, from 0 (not at all) to 1 (exactly onto it). |
| Sources | The providers feeding this composite. Each has a name you choose, and a provider. |
| Joint sources | Which joints are driven by a source other than the base. Everything not listed stays on the base. |
Adding sources
A new Composite row starts with two sources already set up, which is the arrangement most setups want:
| Index | Name | Provider |
|---|---|---|
| 0 | Headset (base) | Meta |
| 1 | IMU | UDP |
Rename them to whatever makes sense for your study — the names are what appear in the joint map's dropdowns, so "Right arm sensors" reads better than "Source 1" when you come back to it in six months. Add appends a source; Remove deletes one.
Selecting UDP for a source expands the full set of UDP options underneath it, the same ones documented in The UDP stream.
The UDP options nested inside a Composite source are a separate set from the ones on a standalone UDP row. Whatever you configured and tested on a UDP row does not carry over — port, heading offset, quaternion order and the rest all start at their defaults here and have to be set again.
Practically: get your sender working on a plain UDP row first, write the working values down, then re-enter them in the composite.
A Composite source cannot itself be a Composite. There is no reason to nest them — another layer of arbitration is just another entry in the same source list.
Assigning joints
By default the four right-arm segments come from source 1 and everything else from the base:
| Joint | Source |
|---|---|
| RightScapula | 1 |
| RightArmUpper | 1 |
| RightArmLower | 1 |
| RightHandWrist | 1 |
Change a row's dropdown to move that joint to a different source. Add creates a new assignment; Remove hands the joint back to the base. Which joints to pick, and why the trunk is not in that list, is the joint map.
Order of operations
- Get the base source tracking. The composite produces nothing until its base has a frame — that is deliberate, since there is nowhere to put the other sources' joints until the body has a position. Put the headset on and confirm body tracking is live.
- Turn on Gizmos → Joints and Bones on the composite row, so you can see the result without needing an avatar wired up.
- Enter Play mode.
- Then start your sender. If a source is a UDP stream that uses a neutral-pose reference, it captures that reference from the first second of packets it receives. Starting the sender before Play means the reference lands somewhere in the middle of the recording and every frame after it carries the error.
- Assign an Avatar Prefab if you want a character rather than gizmos.
Checking it actually works
The clearest confirmation is to watch a joint change hands. While still in Play mode, take the joints you assigned to the override source and switch them back to the base.
The limb should visibly change behaviour — it stops following the override source and goes back to what the base thinks that limb is doing. Switch back and it returns. If nothing changes when you do that, the override source is not reaching the composite, and the troubleshooting page starts there.
Three other things worth confirming on the first run:
- The body moves around the room with the participant. That is the base doing its job.
- Joints you did not assign still follow the participant. The arbitration is per joint, not wholesale.
- Overridden limbs stay attached and correctly proportioned. The override contributes angles; limb lengths still come from the base. A limb that is detached or the wrong size means the base is not supplying what it should.
Recording
Turn on Data Capture on the composite row to write the combined pose to a CSV. It is written like any other provider's, at frame rate.
Everything in the Body CSV is sampled once per rendered frame. If your override source runs faster than that — inertial sensors commonly log at 100 Hz or well above — the CSV keeps one sample per frame and the rest are not recorded.
That is fine for the avatar, for checking the setup, and for anything at the timescale of a reaching movement. It is not the record to use if the temporal resolution of the sensors is the reason you are using them.