A tracking sensor knows where it is; your Unreal Engine scene needs to know it too, every frame, whether the sensor rides a camera crane, a head rig, a robot arm or a prop. You do not need the vendor's own engine integration to get there. You need the tracker's raw pose — position, orientation quaternion and timestamp — carried into the engine over VRPN or Live Link. This guide gives you the decision between the two paths, the byte and latency arithmetic that shows the network is never the bottleneck, step-by-step set-ups for each, the platform checks that decide macOS and ARM64 support, and the point at which a depth camera serves you better than a pose tracker.
Can you feed a tracking sensor into Unreal Engine without writing engine code?
Yes — VRPN and Live Link both move only the tracker's pose, a position, an orientation quaternion and a timestamp. A small server program and a client plugin replace any deep engine integration, on Windows, Linux and macOS alike. What you cannot avoid is the sensor SDK: something must talk to the tracker over its cable and turn fused output into those seven numbers. That something has to build on the machine the tracker is plugged into. Everything else — protocol, transport, engine — is portable.
Images never travel on this path. If you want the tracker's own video inside Unreal, that is a second, heavier stream with its own pipeline; the pose bridge stays as light as the numbers below.
What actually travels between the tracker and the engine?
Seven four-byte numbers per sample — three of position and four of orientation quaternion — make 28 bytes. A 200 Hz stream is 200 × 28 = 5,600 bytes per second, about 45 kbit/s: the network is never the bottleneck.
Compare transport needs. An uncompressed HD feed at 30 FPS runs 1920 × 1080 × 3 B × 30 × 8 ≈ 1.5 Gbit/s, and tens of megabits per second even compressed, against 45 kbit/s of pose. That is why one office switch carries pose alongside everything else, and why trouble later is almost never bandwidth — it is timing, units or filters.
VRPN or Live Link: which path do you pick?
Pick VRPN when the vendor has no Unreal support, because the server runs wherever the SDK builds and Unreal connects to it over the network. Pick Live Link when you can add a message-source plugin, because the engine then timestamps and interpolates for you.
| VRPN | Live Link | |
|---|---|---|
| Server runs | any machine the SDK builds on; Unreal connects over the network | inside Unreal's process, pulling from your source |
| Who interpolates | whoever writes the client plugin | the engine, from your per-sample timestamps |
| Extra install | the open VRPN library plus a client plugin | a plugin project you build once |
| Transport | TCP/UDP, standard port 3883 | Unreal's Live Link message protocol |
| Best for | vendor-agnostic rigs; server and client on different machines | native-rate pose with engine-side smoothing |
For a first rig, VRPN is the safer default: the reference library is small, many outside-in optical tracking systems already ship VRPN servers, and you can prove the stream with a print utility before the engine is involved. Move to Live Link when jitter at camera cuts bothers you — engine-side interpolation is the cleaner fix than hand-rolled smoothing.
How do you stand up the VRPN path, step by step?
Four steps cover it: confirm the SDK builds on the tracker's host machine, write a short server that publishes each sample as a tracker report, run it under a stable device name, and point a VRPN client plugin in Unreal at that server.
- Check the SDK's platform list on the manufacturer's release page. The server goes on the machine the tracker is attached to, and the SDK comes from the manufacturer or its distributors.
- Write the server: read a pose from the tracker's SDK, send it as a tracker report — position plus unit quaternion, with the SDK's own timestamp — then pump the VRPN library's main loop. About a hundred lines.
- Name and run it. Give the server a machine name and the device a stable name, and leave it on the standard VRPN port 3883 so any client can find it.
- Add a VRPN client plugin to your project, from the engine's plugin marketplace or built from the library's sources, and set its address to the server's IP, port and device name.
- Bind the pose: position drives the component's location and the quaternion drives its rotation, scaled into the engine's centimetre world.
Verify before the engine loads: run one of the library's sample print clients on a second machine. Seven numbers per line should arrive at the tracker's rated rate — 200 lines per second at 200 Hz, about 2,000 lines in a ten-second count.
How do you stand up the Live Link path, step by step?
Three steps: confirm the SDK hands you raw pose with its own timestamp at its native rate, implement the message-source interface Live Link defines so each sample arrives as a subject transform with that timestamp, and attach a Live Link controller to your camera Blueprint.
- Confirm raw export. Log the SDK's pose stream directly — not the viewer's smoothed readout — and check the per-sample timestamps arrive at the tracker's native rate.
- Create a small plugin implementing a Live Link message source: start the SDK in the source's setup, and push one subject transform per sample — position, quaternion, the SDK's timestamp.
- Enable the plugin, add the source in the engine's Live Link settings, and check the monitor lists your subject.
- Add a Live Link controller to the camera Blueprint, bind it to the subject, and leave its smoothing off.
The monitor's sample-age readout is the health check. At 200 Hz one sample period is 5 ms, so an age idling near 5 ms is healthy. An age that climbs past it means your source stopped pumping or the SDK throttled the stream.
How fast must the pose stream and the render run?
Run the tracker at its native rate — 200-300 Hz is the range typical SLAM trackers publish at, and your tracker's rated rate governs — and hold the render at 75 FPS. That frame rate is the usual interactive target for pose-driven camera rigs: below about 60 FPS, the lag between your motion and the rendered view becomes visible and the illusion breaks.
One sample of interpolation buffer plus one render frame is the honest floor: about 18 ms at 200 Hz and 75 FPS. Dropping the render to 60 FPS adds 3.4 ms; raising the tracker to 300 Hz gives back 1.7 ms. Render rate dominates, which is why the 75 FPS target matters more than tracker hertz. Do not downsample the pose stream to save work: the engine interpolates between samples, and it cannot interpolate samples it never received. The tracker's own sensing-to-pose latency is device-specific — add whatever its datasheet lists to the 18 ms budget.
Does the bridge work on macOS and ARM64 machines?
The engine side is portable — VRPN libraries and Live Link plugin code compile on Windows, Linux and macOS, in x86-64 and ARM64 builds — and support is decided entirely by whether the tracker SDK exists for the OS of the machine the tracker is plugged into.
If that build is missing, split the roles: run the VRPN server on a Windows or Linux box beside the tracker and point Unreal's client at its IP. VRPN is a network protocol first, so server and client never need to share a machine, and the pose stream crosses an ordinary switch unnoticed.
Building the SDK itself on ARM64 can fail before any engine code runs — undefined CMake targets and missing Boost imports are the usual suspects, and the SDK-on-ARM fix for 3D cameras walks through that class of failure. Match SDK, firmware and OS deliberately, the way you would for any 3D camera robot integration. So the practical Mac answer: if the release list shows your macOS and CPU line, everything above runs unchanged; if not, the network-split VRPN rig is the supported workaround.
Why does the pose look right in the viewer but lag or jitter in Unreal?
Most of it is double smoothing: the SDK filters, your code filters and the engine interpolates on top, stacking tens of milliseconds of lag. Feed raw samples to exactly one interpolator and the lag collapses to the 18 ms budget above.
- Polling per tick instead of per callback. Reading pose once per engine tick from a 200 Hz stream discards 140 of 200 samples every second at 60 FPS and adds up to a full frame of staleness. Subscribe to the SDK's callback and queue samples instead.
- Units and frames. Metres against centimetres, Z-up against Y-up, right-handed against left-handed quaternions — convert once at ingest; the marker pose units article shows how a unit slips through a pose API untouched.
- Viewer-side smoothing warping your baseline. The vendor viewer averages samples for display, so "looks perfect there" is not raw performance. Compare against a raw log from your server; the capture-time article diagnoses the same viewer-versus-API gap for 3D cameras, and the viewer-versus-ROS case is the same disease in a different client.
- Leftover state. A stale map or a half-closed SDK session makes runs flaky; start every run from a known state, as you would for a flaky 3D camera test.
When is a depth camera the better buy than a pose tracker?
Choose a depth camera when the engine needs the scene rather than your own position — a stage, a prop, a pallet, a workcell. Pose trackers and depth cameras answer different questions, and the depth side streams calibrated 3D your code can mesh straight into the level.
Room scale is ToF territory: a ToF sensing camera streams per-frame depth that places virtual objects inside a real room, and you can read one pixel's distance in your own code as the depth-image pixel article shows.
- Type
- Depth / ToF camera
Bench scale with a static subject belongs to structured light: a projected structured-light camera captures the dense mesh of a prop or part that becomes a static asset in the level, and the height-map-to-point-cloud article walks the pixels-to-XYZ step. If the job is closer to presence detection than to meshing, the person detection with a depth camera guide is the decision aid.
- Type
- Stereo / structured light
The 3D sensors category holds the depth side of this decision — laser profilers, stereo and structured-light cameras, ToF and logistics volume models — and the camera finder filters it by type. The 3D topic page gathers the rest of the depth-camera guides, and free expert support comes with every order when you are weighing a tracker against a depth camera — or reach us through the contact page.
Questions
Can VRPN and Live Link run side by side in one project?
Yes. VRPN and Live Link load as separate plugins and listen on separate transports, so both can feed one level. Give each system its own subject and its own component to drive: if a VRPN tracker and a Live Link source both write the same camera transform, the two fight every tick and the pose oscillates. Driving one camera from VRPN while Live Link animates a secondary prop works with no conflict.
How much bandwidth does a 300 Hz pose stream need, and can many trackers share one link?
At 300 Hz one tracker is 300 × 28 B = 8.4 kB/s, about 67 kbit/s with framing. Ten of them together run roughly 0.7 Mbit/s, under a tenth of one percent of a GigE link, so pose coexists with video and control traffic without priority rules. Images are the opposite: even a compressed HD stream takes tens of megabits per second, so give cameras their own link or VLAN.
What units and scale does Unreal expect for pose data?
Unreal's world unit is the centimetre, Z up, left-handed. VRPN trackers conventionally report metres in a right-handed frame, so scale positions ×100 at ingest and convert the quaternion's handedness once — most client plugins expose that conversion. Prove the whole chain with one known move: translate the tracker exactly 100 cm and read exactly 100 Unreal units of travel.
Can one Unreal project track two sensors at once?
Yes. VRPN addresses a tracker as server plus device, so a client opens one connection per device and a plugin exposes each as its own subject; Live Link does the same through subject names. The constraint is the rig rather than the link: every tracker wants its own SDK session and USB bandwidth, and each keeps its own map, so treat them as independent subjects in the level.
Is a SLAM tracker accurate enough for virtual production camera tracking?
For previz and rehearsal, yes — the rates and the ~18 ms budget above are what those workflows tolerate. For final-pixel compositing, SLAM pose is relative to a map the tracker builds, so it drifts over long moves; surveyed absolute position comes from outside-in optical systems, and many of those publish VRPN servers, so the same client path carries them into Unreal. The bridge adds delay, never position error; accuracy is the tracking system's datasheet number.

