Skip to content

Changelog

2.0.0 - 2026-10-21

XRTracker 2.0 changes how a body finds its object and when it lets go of it. The quality number now reads on one 0 to 1 scale, a lost body recovers on its own, and a stationary object under AR holds steadier. This release also changes some public API, so the Removed list shows what to update in a project that is on 1.0.3.

New

  • Start search — An edge body now looks in a window around its guide for its own shape before the first start, within a cone of 5 degrees around the guide's view. The search takes over only when the guide is out of reach of what it found, and it has its own settings under Search Before Start. It is on by default. See Starting & Recovery.
  • The guide follows the camera under AR — With AR pose fusion on a live camera, the guide of a body that starts from a viewpoint stays in front of the camera until the first start, and XRTracker draws it on every frame. The person lines the object up with an outline that moves with the device.
  • Automatic recovery after a loss — A body keeps the views it tracked well in and tries them against the camera image after a loss. A candidate becomes tracking only through the ordinary start, so a recovery never shows a pose the tracker has not verified. The Saved View Recovery Capacity setting on the Tracked Body Manager sets the number of kept views (8 by default, and 0 turns recovery off).
  • Tracking confidence — TrackedBody.Confidence reports Tracked, Degraded or Lost with a reason, and OnConfidenceChanged fires when either changes. Lost is a report, so your application decides what to do about it.
  • Start Score and Hold Confidence — Under AR pose fusion, the Runtime Status of the Tracked Body inspector shows the score the start reads and the score that keeps the lock, each with its bar. The new TrackedBody.StartScore property returns the score the start reads.
  • Recording and playback with AR data — A recording now carries the camera poses, and playing it back replays AR pose fusion as it ran live. When a phone recording plays in the editor with pose fusion, the camera follows the recorded poses. See Recording & Playback.
  • Assembly parts that attach on your word — A part in assembly mode can join its parent's solve only when your application calls Attach(). A part can also settle a few millimeters around its seat (Free Check), and a Check View gives a Presence reading of Present, Absent or Unknown. See Parent-Child Bodies.
  • Reset and forget — ResetTracking, ResetBody and ResetAll take a forgetLearned parameter, and the Tracked Body inspector shows a Reset button and a Reset and forget button.
  • macOS editor support (experimental) — XRTracker now includes a plugin for Apple Silicon Macs. It is not yet verified on all hardware, and tracking in the macOS editor may not work yet. Building for iOS from a Mac is unaffected. See macOS.
  • Depth tracking on Android (experimental) — The AR Foundation camera feeder now passes the depth image of an Android device that has one to the tracker, as it already did for LiDAR on iOS, so Depth Tracking on a body takes effect on Android. It needs an AROcclusionManager on the AR Camera. Android gives depth only once the camera has moved a little, so when a body in the scene uses depth the feeder waits at start for the first depth image, for up to Depth Wait Seconds (3 by default), and tracking starts without depth when none arrives. The depth image covers a centered crop of the color image that matches the camera texture, and the feeder logs the crop it uses once at start. Android depth is experimental in 2.0. See Android.
  • Recovery without AR pose fusion — On desktop and in any setup without pose fusion, a lost body also tries the camera-relative poses it was accepted at before, through the same verified start.
  • One toggle for each hold of a stationary object — Hold During View Dips, Hold During Fast Motion and First Accept Guard sit under Accept Steady Fits in the Tracked Body inspector, and each one switches off one hold on its own. All three are on by default and act only while Accept Steady Fits is on, so a scene that was saved before the toggles tracks as it did. TrackedBody.HoldDuringViewDip, HoldDuringFastMotion and FirstAcceptGuard set them from code. See AR Foundation.
  • Reset Edge Settings to Defaults — A button in the Edge Tracking section of the Tracked Body inspector, which is also an item in the context menu of the component, puts every edge setting of the body back to the package default. The change can be undone, and it works on an instance of a prefab, where the values become overrides of the instance. The silhouette, score and confirm settings stay as they are.
  • A confirm score for each body — A body that tracks by the edge method can set its own confirm score, which is the score the last frame of a start must reach. When none is set, the confirm score is the start score, so a start needs the start score on five frames in a row and nothing more.
  • Standard deviations of the depth correspondences — DepthTrackingSettings.StandardDeviations sets the measurement noise of the depth correspondences in meters, one value for each correspondence iteration from coarse to fine. The defaults are 0.05, 0.03 and 0.02, which are the values the plugin used before they could be set, so nothing changes until you set them. A change while the scene plays reaches the tracker at its next step. See Depth Tracking.
  • Hold Start Frame on the Sequence Player Feeder — It repeats the start frame of the range on every step and loops on it, so the tracker refines the pose on that one image again and again until it settles. Every field the feeder had before keeps its name and its meaning, so a saved scene plays as it did. See Recording & Playback.
  • Use Current Pose as Initial Viewpoint — In Play mode, while a body that starts from a Viewpoint is tracking, this button of the Tracked Body inspector keeps the pose the body is shown at, seen from the camera. When Play mode ends, the Viewpoint moves to the place from which the body starts at that pose, with an undo step, and the scene is marked as changed so that you can save it. See Starting & Recovery.
  • Third-party notices — The package carries a Third Party Notices file and links to the Third-Party Notices page, and both list every component that the plugins link, with its license.

Changed

  • One quality score from 0 to 1 — TrackingQuality and InstantQuality read on a 0 to 1 scale for every method, and the bars QualityToStartTracking, QualityToConfirmStart and QualityToStopTracking read on the same scale. The edge defaults are 0.65 to start and 0.50 to stop, and the silhouette defaults stay at 0.3 and 0.4 as in 1.0.3.
  • A body keeps one custom start and stop value for each method — The edge method and the silhouette method each have their own custom start and stop values now, and the Tracked Body inspector shows the pair of the method the body tracks by. A silhouette body that was saved with a custom value keeps it, as in 1.0.3.
  • A simpler start — The confirm score now equals the start score by default, and the margin gate is removed from the default start without AR. A start needs the start score on five frames in a row and nothing more.
  • The start under AR reads the coverage score — An edge body under AR pose fusion now starts on the coverage score, while the registration margin keeps deciding whether the body holds its lock. Bodies now start on soft phone camera pictures that the margin refused to start.
  • A body that is not stationary holds its placed pose before its start under AR — It no longer walks its guide onto whatever fits and starts there.
  • A stationary object catches up at once when it is moved — The displayed pose still averages the scatter of the solve, and it now jumps onto the solve as soon as the solve shows that the object moved. See AR Foundation.
  • A stationary object no longer wanders off — XRTracker puts the tracker back at the held pose when a solve that is not verified stands farther from it than the AR pose can explain. The safeguard works from the first accepted fit on.
  • An edge setting changed on a prefab instance in a scene is applied — In every 1.x release the scene ignored such a change when it loaded, for example a Depth Edge Threshold of 0.1 on an instance of a prefab that holds 0.01, and the tracker registered with the value of the prefab. The change is applied now, so a scene that carried such a change tracks with it after the upgrade.
  • The first fit settles before it is accepted — With AR, a stationary object accepts its first fit only after the fit has settled, which takes a few frames, so a fit that is still moving is not locked in.
  • Accept Steady Fits — A stationary object on a soft or cluttered camera picture now reads Tracked, because XRTracker also accepts a fit that the coverage score verifies. The toggle is on by default. It sits in the Edge Tracking section of the Tracked Body inspector and applies, with AR, to a stationary body that tracks by the edge method. With AR, a stationary body now accepts a fit by the same coverage score and the same bars that decide Tracked without AR, so the outline keeps correcting on soft or low-contrast pictures. A body that is not stationary reads Tracked and stops on the coverage score as it does without AR, so it keeps tracking under AR instead of stopping. Turning Accept Steady Fits off returns a stationary body to the strict check.
  • A stationary object keeps its pose still while its view dips — With AR, a stationary object that tracks by the edge method also keeps its shown pose still while part of the object is hidden or the view is clearly weaker than usual, and it takes new fits again once the view recovers. The Accept Steady Fits toggle controls it.
  • A stationary object keeps its pose still while it moves fast on screen — With AR, a stationary object that tracks by the edge method also keeps its shown pose while the object moves fast on screen, and it takes new fits again once the motion slows. The Accept Steady Fits toggle controls it.
  • Pose fusion needs no AR anchor — XRTracker holds the pose in the AR session's world frame, so a scene needs no ARAnchorManager. The AR Tracker menu entry no longer adds an anchor, plane or raycast manager.
  • A child is part of its parent — A child never starts, stops or recovers on its own. It is tracked exactly while its parent is tracked, and in assembly mode a part attaches after its confirmation and never pulls the parent before that.
  • Depth edge threshold up to 0.5 meters — The Depth Edge Threshold of the Edge Tracking settings now accepts values up to 0.5 meters. A large object seen from far away needs a few centimeters. See Edge Tracking.
  • Keyframe spacing — The default keyframe camera spacing is 0.03 meters, as in 1.0.3, and the rotation limit now runs from 10 to 20 degrees with a default of 20 where it was 3. A scene or prefab keeps the values it stored, except that a rotation limit below 10 degrees is read as 10.
  • Reset returns to the placed pose — A reset now returns the body to the pose it was placed at, and the body keeps what it learned unless you pass true.
  • The world-frame coast is on by default — A stationary object that leaves the camera's view is held in the world frame and no longer counts as a tracking failure.
  • An edge body without AR starts, holds and recovers on the coverage score — Coverage decides start, stop and recovery, with a start bar of 0.65 and a stop bar of 0.50, and nothing has to be set. The coverage map reads one at a coverage share of 0.70, so a right pose needs 45.5 percent of the sites to find an agreeing edge to clear the start bar. The placed pose stays where it is while the body searches, each step refines a copy of it, and the body starts from the copy only when it clears the start bar for five steps in a row.
  • A body that lost tracking keeps trying to recover — It tries the poses it was accepted at and judges a candidate on its refined coverage score, and it never returns to the placed pose by itself. Your application calls ResetTracking when it decides that recovery will not succeed, and passing true makes the body forget what it learned. While recovery tries a candidate, the body is drawn where it stood, and it moves only when tracking starts again.
  • QualityToStartTracking reports the start bar that is enforced — An edge body that is configured with a start bar below its stop bar is raised to the stop bar, so it reads the stop bar. A silhouette body is not raised and starts on its own bar of 0.3, as it did in 1.0.3.
  • A body that tracks by the silhouette method keeps its 1.0.3 behavior — It starts on a bar of 0.3 and stops when the average score stays under 0.4 for five steps, and the stop returns the tracker to the guide. It is judged at the pose it is placed at and is never refined before its start. It has no recovery, no confirm score, no hold release and no world-frame coast.
  • An edge body decides on its edge score alone — With depth tracking on, the start, hold and stop of an edge body used to read the larger of its edge score and its depth score. They read the edge score now, so depth only helps the fit. A silhouette body keeps the larger of its silhouette score and its depth score, because a body can have a depth model and no usable silhouette.
  • Under AR, an edge body accepts and holds on a registration score — The score measures how well the model's edges line up with the image, so a pose that covers the object but sits in the wrong place no longer counts as found. The body also checks the pose it holds against the image every few steps, and it takes the lock back only after five steps in a row that each clear the start bar and the registration check.
  • A stationary object lets go of a solve that has left it — The body is held at its last verified pose and takes the lock back only after the image confirms it again, so the augmentation no longer follows the tracker onto the background.
  • The Tracking Model Asset menu entry moved — The Tracking Model Asset entry of the Create menu is under XRTracker, where it was under FormulaTracker.
  • A tidier Tracked Body inspector — The Tracked Body inspector no longer shows the experimental edge rows and debug readings.

Removed

  • The Force Start Tracking button at the bottom of the Runtime Status is gone. The Force Start button in the Lifecycle row stays, and ForceStartTracking() is unchanged.
  • Public API that 1.0.3 had — TrackingStatus is replaced by Confidence. SmoothingSettings and the unused smoothing types are removed, and output smoothing is TrackedBody.SmoothTime. XRTrackerManager.UseAnchor is removed. TrackedBody.Visibility is renamed SilhouetteVisibility. TrackedBody.EdgeTrackingQuality and InstantEdgeQuality are replaced by TrackingQuality and InstantQuality. The package CHANGELOG.md lists every removed or changed member with what to use instead.
  • More members of 1.0.3 that left the public surface — TrackedBody.NiceQualityThreshold, UseCustomNiceQuality and CustomNiceQualityThreshold are removed, so read Confidence or compare TrackingQuality with QualityToStartTracking and QualityToStopTracking. TrackedBodyManager.TryGetBodyFusionInfo, BodyFusionInfo and BodyFusionState are removed, so read Confidence, ConfidenceReason and TrackingQuality. XRTrackerManager.AfterTrackingStep() is removed, and BeforeTrackingStep() returns bool where it returned void, so a custom camera feeder that calls either has to be updated. The serialized events _onBecomeValid and _onBecomeInvalid of TrackedBody are removed, and a scene that stores them keeps working. TrackingDiagnosticsPanel is removed, and a scene that holds it shows a missing script that you can delete. The per-frame evidence and health read-backs, the development switches and the edge diagnostics are internal now, and none of them is needed to track an object.
  • Settings and helpers that are internal now — EdgeTrackingSettings.ProbeSearchRadiusScale, ProbeMaxProjectionErrorDeg, ProbeMaxResidualPx and UsePerSiteThreshold are no longer serialized, the per-site contrast threshold is always on, and the Per-Site Contrast Threshold row of the inspector is gone. TrackedBody.EdgeResidualQuality and EdgeProjectionQuality are internal, so read TrackingQuality. TrackedBody.EdgeCoverageAverage, EdgeResidualAverage, ProjectionErrorAverage and LastStatus, and TrackedBodyManager.GlobalHistogramPeak, BodiesInARMode, IsBodyInARMode and ManagedBodyCount, are hidden from the public surface and have no replacement, and IsARPoseFusionActive says whether pose fusion is in play. TrackedBodyUtils, MeshCombiner with CombinedMeshData, ConversionUtils, SilhouetteModelGeneratorCore, TrackedBody.BeforeTrackingStep() and TrackedBody.AfterTrackingStep() are internal too, and nothing in them is needed to track an object.
  • The other calls of FTBridge and every call of ValidationBridge are internal now. The four pose calls (FT_SetBodyPose, FT_SetDetectorPose, FT_SetOccluderPose and FT_SetCameraWorldPose), FT_SetStabilityParameters and the four recording calls (FT_StartRecording, FT_StopRecording, FT_IsRecording and FT_GetRecordedFrameCount) stay public. Use XRTrackerManager, TrackedBody, OccluderBody and ValidationZone instead, which call the plugin at the right moment of the tracking step. The first three pose calls return int where they returned bool, and FT_SetCameraWorldPose returns int where it returned void, so a caller that uses the plugin directly has to read the result.
  • Renamed plugin fields — The FTBodyConfig fields tikhonov_rotation and tikhonov_translation are now rotation_regularization and translation_regularization with the same layout, and FTHistogramCompareMethod.Bhattacharyya is now HistogramOverlap with the same value (3), so a saved validation zone keeps its metric.
  • The Use Keyframe toggle of the Edge Tracking settings is gone, and the edge keyframe is always on. A scene or prefab that saved it off now tracks with it on, and the edge points refresh after the translation or rotation threshold or when too few of them still find an edge. The EdgeTrackingSettings.UseKeyframe property stays so that a script still compiles, but it is obsolete and its setter does nothing.

Fixed

  • A child stays on its free directions — A child that moves along only some directions of its parent is drawn at its parent's pose moved by its own solve along those directions. It no longer turns or moves in other directions against its parent.
  • A silhouette body starts tracking — A body tracked by its silhouette alone previously never reached the start threshold.
  • Display smoothing runs once per rendered frame — SmoothTime now means what its tooltip says, regardless of the tracker's throughput.
  • OnStopTracking fires once — It previously fired twice when quality caused the loss.
  • A second edge outline no longer changes how the first one draws.
  • A desktop recording plays with pose fusion on — XRTracker now ignores pose fusion for a recording without a usable camera pose and logs one line, where it previously rejected every frame with an error.
  • A body that the start search started is put back at its AR-carried pose — A body that the start search started is now put back at its AR-carried pose like any other body once its first fit is accepted.
  • A call that changes the tracker no longer runs in the middle of a tracking step — The plugin now holds a lock around the tracking step and around every call that changes the tracker, and the package waits for a step in flight before such a call, so a change made on the main thread can no longer crash a silhouette body on Android. The Correspondence Visualizer and a Validation Zone wait for a step in flight in the same way.
  • An AR session that moves its world no longer leaves the tracked bodies behind — After a relocalization, the camera pose of the AR session can jump by far more than a hand can cover in one frame, and a body under pose fusion used to stay in the old world, project behind the camera and read Degraded for the rest of the session. XRTracker now carries every tracked body into the new world on such a jump (more than 25 centimeters and faster than 5 meters per second, or more than 45 degrees and faster than 900 degrees per second), so each body keeps its place relative to the camera. The Follow AR World Jumps setting on the XRTracker Manager controls it, it is on by default, and turning it off lets a body lose the object after a jump. See AR Foundation.
  • A sequence that loops keeps tracking at the end of its range — Under pose fusion, a looping sequence used to stop tracking for the rest of the play when the recorded time went back to the first frame, and a range of one frame was refused in the same way. The tracker now treats the start of every pass of the loop as a seek to the start of the range, so tracking goes on.
  • The camera image of the Sequence Alignment window lines up with the Scene view on a display with scaling above 100 percent — It was drawn too large there, because the window sized it from the camera size in pixels while the Scene view draws in points.
  • Depth lines up with the color image in every screen orientation — The plugin turned the color image to the screen before tracking but fed the depth image as the sensor gives it, so with the device in portrait or in landscape right the depth points were measured a quarter or a half turn away from the image. The depth camera now turns about its optical axis whenever the screen rotation changes.
  • The depth camera follows the AR camera — Under pose fusion the plugin used to move the color camera with each AR pose and leave the depth camera where it started, so the depth correspondences were measured from a camera that no longer stood where the real one did.
  • A frame without depth no longer reuses old depth — A frame whose depth image was missing was tracked against depth taken from an earlier camera pose. The feeder now sends an empty depth image for such a frame, and zero reads as no measurement.
  • An edge setting changed while the scene plays is no longer silently ignored — The depth edge threshold, the search radius, the minimum gradient, the sample step and the crease edges reach the tracker at its next step. Every other edge setting is read when the body registers, so it takes effect after the component is disabled and enabled again, and a warning in the console says so. The console also states the edge settings each body registered with.
  • Generating a depth model no longer overloads the graphics card — The depth model generator now runs on one graphics device with at most four threads, so a large model no longer risks a graphics driver reset. It writes the same file as before.
  • Generating a silhouette model no longer overloads the graphics card — The silhouette model generator now runs on one graphics device with at most four threads as well, like the depth one, and it writes the same file as before.
  • A stationary body under pose fusion no longer copies its mesh every frame — The view check used to read the bounds of the model by copying every vertex of every mesh on each tracking step, which made garbage in proportion to the size of the model. The bounds are now computed once and again only when the geometry changes.
  • The camera background of the webcam setup draws in a built player — It used a built-in shader that a player build leaves out unless something else uses it. The package now ships its own background shader.
  • The 64-bit Windows plugin is no longer included in Linux and 32-bit Windows builds — The 32-bit Windows player uses the plugin in Plugins/x86.
  • The usage metrics report the package version 2.0.0, where they reported 1.0.0.
  • A frame is dropped when the tracker refuses a required write — A refused write used to let a tracking step run on a new image with the previous frame's camera pose.
  • Display smoothing runs on the object's pose in the AR session's frame — The composition to the world happens after it. Smoothing used to run on the composed world pose and had to snap whenever the session moved its anchor.
  • A tracking session no longer starts against a mismatched native plugin — The package checks the native status and configuration layout before it initializes, and it refuses to start with an error that names both sizes.
  • A rotation written to the tracker is read as the rotation it names — A rotation whose length is not one previously entered the tracker as a rotation combined with a scale.
  • A coverage map whose full-scale share is not above its floor reads zero — It could read a perfect score for a coverage of zero.
  • The Android, iOS and macOS plugins are rebuilt from the current source, and a Windows x86 plugin is added — Those plugins had been built before the live edge and depth setting calls, the child guard, the depth camera that follows the AR camera and the single device model generators, so those changes did not reach those platforms. Every plugin, the Windows x86_64 one included, now exports the same 162 FT_ functions. The plugin in Plugins/x86 is the same source built for 32-bit Windows standalone players, and the editor never loads it.

Known limitations

  • Texture tracking — Texture tracking works only when the camera is farther from the object than about 1.5 times the object's radius, so it does nothing for a large object seen up close. It suits small and medium objects with visible surface detail, its influence is small compared with edge tracking, and it does not enter the quality score. It is experimental for large objects. See Tracking Overview.
  • Depth tracking on Android — It is experimental in 2.0. See Android.

1.0.2

Changes

  • AR Pose Fusion improvements — anchor-based reference frame replaces world-origin approach. ARKit + LiDAR now holds the object's real-world position when tracking is interrupted (look away, fast motion, occlusion). Instant recovery when the camera returns to the object
  • Quality gate — prevents pose drift during camera motion. Accepts optimizer results only when quality is near peak and stable, holds last known good pose otherwise
  • AR anchor placement — screen-space raycast against ARKit planes/meshes to find feature-rich anchor positions near the tracked object
  • Quality drop rejection — immediate rejection of single-frame pose poisoning before it can commit

1.0.1

Changes

  • Free Developer license — Developer license is now free (1-year, renewable). Register directly from the Unity Editor via Tools > XRTracker > License Registration
  • Registration window — new Editor window for license registration with in-Editor API call, auto-saves and assigns license to XRTrackerManager
  • First-run prompt — prompts for registration on first project open and Play Mode entry when no license is found
  • Persistent watermark — Developer license watermark is now always visible in a fixed corner position (similar to Unity's "DEVELOPMENT BUILD" overlay)
  • Removed Free/Trial tiers — the 60-second Free tier and 15-day Trial tier are no longer active. Existing Free .lic files will be rejected
  • Privacy policy updated — now covers registration data (name, email) collected during license registration

1.0.0

Initial public release.

Features

  • Silhouette tracking — silhouette-based foreground/background separation
  • Edge tracking — contour-based geometric edge matching with GPU compute pipeline
  • Depth tracking — complementary modality using LiDAR, ToF, or RealSense depth sensors
  • Texture tracking — complementary feature-based tracking
  • AR Foundation integration — ARKit (iOS) and ARCore (Android) camera and depth feeds
  • AR Pose Fusion — combines SLAM world tracking with object tracking for stable stationary objects
  • Multi-body tracking — track multiple objects simultaneously with mutual occlusion handling
  • Parent-child bodies — constrained assemblies with per-axis motion flags
  • In-Editor model generation — generate tracking models from any Unity mesh
  • Viewpoint coverage control — vertical/horizontal filtering, presets (Full Sphere, Upper Hemisphere, Side Ring)
  • Quality metrics — per-modality quality, shape quality, depth correspondence distance
  • Recording & playback — capture and replay tracking sessions for debugging
  • Tiered licensing — Developer (free, 1-year renewable), Commercial (node-locked)

Supported Platforms

  • Windows (x86_64) — Native capture, Intel RealSense, recorded sequences
  • iOS (ARM64) — AR Foundation with ARKit, LiDAR depth
  • Android (ARM64) — AR Foundation with ARCore