/* * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * Licensed under the Oculus SDK License Agreement (the "License"); * you may not use the Oculus SDK except in compliance with the License, * which is provided at the time of installation or download, or which * otherwise accompanies this software in either electronic or hard copy form. * * You may obtain a copy of the License at * * https://developer.oculus.com/licenses/oculussdk/ * * Unless required by applicable law or agreed to in writing, the Oculus SDK * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using UnityEngine; using System; namespace Oculus.Interaction.Input { /// /// The Interaction SDK's fundamental concept of a tracked hand, exposing data such as wrist and tracked joint poses. This /// interface encapsulates the core capabilities common to all hand tracking solutions supported by the Interaction SDK. Where /// possible, you should use this interface instead of concrete alternatives such as , which are less /// general and portable. /// public interface IHand { /// /// Indicates whether the tracked hand is - or -handed. /// Handedness Handedness { get; } /// /// Indicates whether hand tracking is available and has valid data. Note that, because this reflects both the general /// availability and present validity of hand tracking data, this value can vary from frame to frame depending on whether /// the system is currently able to track the hand. This is a valid API to check in order to determine whether up-to-date /// hand tracking is available at a given moment. /// bool IsConnected { get; } /// /// Indicates whether the system has high confidence in the validity of its most recent hand tracking data. In order for this /// value to be true, and must also be true. /// bool IsHighConfidence { get; } /// /// Indicates whether the current hand is the dominant hand. The availability of this feature depends on whether or not the /// platform provides a way to determine whether the user is left- or right-handed. /// bool IsDominantHand { get; } /// /// Indicates the detected scale of the tracked hand relative to the default tracked hand size. /// float Scale { get; } /// /// Checks whether a particular finger is considered to be pinching. How a given finger is determined to be pinching is an /// implementation detail which can vary by finger/platform and is not part of the contract of this method, which merely /// provides a unified way to query for the semantic concept of a "pinch". /// /// The finger to check for pinching behavior /// Whether or not the requested finger is considered to be pinching bool GetFingerIsPinching(HandFinger finger); /// /// A convenience method to check for the most commonly-desired pinching behavior. Calling this method is equivalent to /// calling with the argument . /// /// Whether or not the index finger is considered to be pinching bool GetIndexFingerIsPinching(); /// /// Checks whether a valid "pointer pose" is currently available. See for details /// on what a pointer pose is. /// bool IsPointerPoseValid { get; } /// /// Attempts to return a valid "pointer pose" for the hand. A "pointer pose" is a world-space pose (position and orientation) /// intended to be used as a directional input, conceptually comparable to "pointing at something." However, the nature of /// this pose and its relationship to the hand are not part of the contract of this method; it may or may not correspond to /// a "direction of pointing," and in many implementations it corresponds more closely to a "direction of reaching out." /// These details can vary, but in all cases this method provides a unified way to query for the semantic concept of a /// "pointer." /// /// A valid world-space pointer pose if one could be calculated, identity otherwise /// True if the pose argument was populated with a valid pointer pose, false otherwise bool GetPointerPose(out Pose pose); /// /// Attempts to return the world-space pose of the requested hand joint. /// /// The joint for which the pose is being requested /// A valid world-space joint pose if one is available, identity otherwise /// True if the pose argument was populated with a valid joint pose, false otherwise bool GetJointPose(HandJointId handJointId, out Pose pose); /// /// Attempts to return the pose of the requested hand joint in "local" space. This "local" space is loosely defined and can /// vary by platform (in some implementations, each joint is relative to a given parent joint), so the exact nature of what is /// returned by this method is not guaranteed. In general, it is recommended to use /// or instead /// where possible. /// /// The joint for which the pose is being requested /// A valid "local" space joint pose if one is available, identity otherwise /// True if the pose argument was populated with a valid joint pose, false otherwise bool GetJointPoseLocal(HandJointId handJointId, out Pose pose); /// /// Retrieves all "local" space joint poses for this hand. The values returned by this method are the same as those returned /// by calling repeatedly, but as a batched query this method can be /// more efficient if many joint poses are needed. /// /// The array of all "local" joint poses if available, or an empty array otherwise /// True if the poses collection was correctly populated, false otherwise bool GetJointPosesLocal(out ReadOnlyHandJointPoses localJointPoses); /// /// Attempts to return the pose of the requested hand joint in wrist space. Wrist space is strongly defined as a transform /// space located and oriented according to . This space is of uniform scale across /// hand sizes, meaning all tracked hands are the same size in wrist space, and wrist space itself must be multipled by /// in order to correctly reflect the observed size of the tracked hands in world space. /// /// The joint for which the pose is being requested /// A valid wrist space joint pose if available, false otherwise /// True if the pose argument was populated with a valid joint pose, false otherwise bool GetJointPoseFromWrist(HandJointId handJointId, out Pose pose); /// /// Retrieves all wrist space joint poses for this hand. The values returned by this method are the same as those returned /// by calling repeatedly, but as a batched query this method can /// be more efficient if many joint poses are needed. /// /// The array of all wrist space joint poses if available, or an empty array otherwise /// True if the poses collection was correctly populated, false otherwise bool GetJointPosesFromWrist(out ReadOnlyHandJointPoses jointPosesFromWrist); /// /// Attempts to return the pose of the palm in "local" space. This "local" space is loosely defined and can vary by platform; /// in some implementations, it can be considered for this method in particular to be synonymous with wrist space. /// /// The "local" palm position and orientation if available, identity otherwise /// True if the pose argument was populated with a valid palm pose, false otherwise bool GetPalmPoseLocal(out Pose pose); /// /// Queries whether the tracking data for a particular finger is high- or low-confidence. /// /// The finger to be checked for high-confidence tracking data /// True if the system is confident in its tracking data for the requested finger, false otherwise bool GetFingerIsHighConfidence(HandFinger finger); /// /// Queries the strength with which a particular finger is considered to be pinching. "Strength" in this case is an /// indication of how similar or different the finger's pose is to what could be considered a pinch; a finger with its /// tip far from the thumb will likely have a pinch strength at or near 0, while a finger with its tip touching the thumb /// will likely have a pinch strength at or near 1. /// /// The finger to be checked for pinch strength /// A number from 0 to 1 indicating how far or close, respectively, the finger is from pinching float GetFingerPinchStrength(HandFinger finger); /// /// Indicates whether the hand is currently tracked such that tracking poses are available for the hand root and finger /// joints. Note that this property being true does not necessarily mean that a valid pointer pose is available; /// may be false while valid tracking data is available. /// bool IsTrackedDataValid { get; } /// /// Attempts to retrieve the pose of the wrist joint in world space. This is a convenience method and is identical to calling /// with the argument . /// /// A void world space pose for the wrist joint if available, identity otherwise /// True if the pose argument was populated with a valid joint pose, false otherwise bool GetRootPose(out Pose pose); /// /// Indicator which is incremented every time new tracked hand data becomes available. /// int CurrentDataVersion { get; } /// /// Event indicating that has been incremented and thus the hand can be queried for /// potentially new data. /// event Action WhenHandUpdated; } }