Changelog
All notable changes to this package will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
[1.1.0] - 2023-03-16
Added
- Added
isTracked
toXRHand
. - Added
trackingAcquired
andtrackingLost
toXRHandSubsystem
. - Added
XRHandDevice
and automatic managing of it if the Input System is enabled and hand-tracking is enabled in the target platform's build settings. - The
HandVisualizer
sample now opts into using optimized controls in the Input System if you enable the Use Optimized Controls option. You must be on at least version 1.5.0 of the Input System package for this to have an effect. - Added
handedness
getter property toXRHandJoint
. - Added
updateSuccessFlags
property toXRHandSubsystem
to allow the most recentUpdateSuccessFlags
to be polled. This value matches the argument to theupdatedHands
callback.
The OpenXR package must be installed and enabled for these to work:
- Added OpenXR support through
HandTracking
andOpenXRHandProvider
types. - Added support for Meta Hand Tracking Aim extension in OpenXR through
MetaHandTrackingAim
.
Changed
MetaAimHand
andMetaAimFlags
have been moved outside of theMetaHandTrackingAim
type and moved from theUnityEngine.XR.Hands.OpenXR
namespace toUnityEngine.XR.Hands
. The same input bindings will work the same as before.- The HandVisualizer sample meshes has been updated.
- Changed Hand Visualizer component so it skips setting the shared material on the instantiated hand mesh prefabs when the Hand Mesh Material property is not set.
- Providers must now create joints with a known
Handedness
duringTryUpdateHands
when callingXRHandProviderUtility.CreateJoint
. - Changed Meta Aim Hand input devices that are added to the Input System to continue updating the
devicePosition
anddeviceRotation
controls even when theMetaAimFlags.Valid
bit flag is not set. Instead it uses whether the hand root is valid. In practice, theMetaAimFlags.Valid
flag currently does not necessarily indicate whether the pose is valid but instead is based on whether the user is in a natural orientation for distant UI panel selection. - Changed HandVisualizer sample by adding an Assembly Definition file (
.asmdef
).
Fixed
- Fixed issue where OpenXR would incorrectly report joints as having updated when they weren't actually tracked that frame.
XRHandSubsystem
'strackingAcquired
andtrackingLost
, as well asXRHand.isTracked
, will now work as expected. - Fixed issue where
<XRHandDevice>/isTracked
and<XRHandDevice>/trackingState
controls would never clear. - Fixed
XRHandDevice
andMetaAimHand
to also includeInputDeviceCharacteristics.TrackedDevice
in theXRDeviceDescriptor
. - Fixed lifetime of GameObjects in
HandVisualizer
sample. - Fixed
HandVisualizer
so it uses theXROrigin.Origin
property instead of the Transform of theXROrigin
itself when transforming joints. - Reinstated the validation rule that the Meta Touch Interaction Profile is required in the OpenXR Interaction Profiles list.
- OpenXR hand root poses now match the wrist, not the palm.
[1.0.0-pre.2] - 2022-10-26
Added
Added subsystem for cross-platform hand-tracking and accompanying types.
Types you might care about as a user:
XRHandSubsystemDescriptor
, which you can retrieve aList
of withSubsystemManager.GetSubsystemDescriptors
.XRHandSubsystem
, which can be created with a call toCreate
on the above descriptor type.XRHand
, which you can retrieve fromXRHandSubsystem
with itsleftHand
andrightHand
properties. These contain joints androotPose
data, as well as itsHandedness
.XRHandJoint
, which you can retrieve from eachXRHand
usingGetJoint
to query for joint tracking state, pose, radius, and velocity data on a per-joint basis.XRHandJointIDUtility
, which contains extension methods for certainenum
s listed below and also housesFromIndex
, which you can use when looping over an array to get the correspondingXRHandJointID
(useful when callingXRHand.GetJoint
).
As well as these enum
s:
XRHandJointTrackingState
, a flags-enum
used to denote which fields are valid and can be retrieved via theirTryGet...
methods onXRHandJoint
.XRHandJointID
, used to identify each joint, and required when accessing joint data usingXRHand.GetJoint
. If looping over an array of joint data, useXRHandJointIDUtility.FromIndex
to convert your index toXRHandJointID
, which is required forXRHand.GetJoint
.Handedness
, used to identify which hand is referred to by anXRHand
using itshandedness
property.XRHandFingerID
, not used anywhere else in the API surfaced in this package besides its extension methods inXRHandJointIDUtility
:GetFrontJointID
andGetBackJointID
, which together provider an inclusive range forXRHandJointID
s spanned by the finger represented byXRHandFingerID
.
Additional types you may need to interact with if writing a provider (not a common use case):
XRHandSubsystemProvider
, which the subsystem asks for data whenever itsTryUpdateHands
is called (built-in Unity setup calls this each frame) and is also queried when the subsystem and provider are created for which common joints are in the provider's layout usingGetHandLayout
.XRHandProviderUtility
, which providers should call into usingCreateJoint
during theTryUpdateHands
per-frame call to fill out the left- and right-hand joint arrays. This same type also has a nestedSubsystemUpdater
type to be used for automatically updating the subsystem each frame. Users can respond to updates by subscribing to the subsystem'shandsUpdated
callback.
Also added a visualizer sample, which demonstrates drawing using both meshes and per-joint prefabs. You can add this sample to your project through the Samples tab of this package's view in the Package Manager window. This sample has a mesh and script that assume OpenXR layout, so it is recommended you either use that plug-in or another one that conforms to the OpenXR hand joint layout.