XRHandTracker
Данные суставов руки и отдельные флаги валидности.
XRHandTracker хранит 26 суставов руки. Отдельно проверяйте наличие tracker, HasTrackingData всей руки и флаги конкретных суставов. VALID и TRACKED различаются; пригодная оценка не обязательно непосредственно отслеживается. Новая рука имеет Type=Hand и Hand=Left, но не подключает устройство.
Подтверждён дефект конструктора: начальные флаги суставов не инициализированы. Собственный поставщик должен заполнить их до включения HasTrackingData. Игровой код читает данные реального поставщика и не меняет флаги для обхода проверки. При потере данных сохранённые трансформы и скорости не очищаются.
В OpenXR трансформы суставов заданы в tracking space с поправкой ориентации Humanoid, а не относительно предыдущей кости. Радиус — метры при PositionValid. Getter не проверяет пригодность данных за вас. HandTrackingSource=Unknown не доказывает оптический источник; выбор источника не создаёт жесты или действия.
Проверены искусственные данные и пример pinch, не реальное tracking или анимация модели. Полный пример, настройки и диагностика: отслеживание рук.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы1
XRHandTrackerКонструктор
public XRHandTracker();Создаёт контейнер руки: Type=Hand, Hand=Left, HasTrackingData=false, источник Unknown. Дефект: массив флагов суставов не инициализирован. Новая рука не является валидным поставщиком: до включения данных собственный provider должен заполнить флаги и значения. Не регистрирует устройство автоматически.
Свойства2
HandTrackingSourceСвойство
public XRHandTracker.HandTrackingSourceEnum HandTrackingSource { get; set; }Источник данных, изначально Unknown. Unobstructed и Controller описывают сообщённый тип, NotTracked — отсутствие tracking; доступность зависит от поставщика. Unknown не доказывает оптическое tracking. Setter не меняет HasTrackingData или флаги суставов.
HasTrackingDataСвойство
public bool HasTrackingData { get; set; }Флаг данных всей руки, изначально false. Setter меняет только его: не заполняет флаги/трансформы суставов и не создаёт pose default. При false суставные данные сохраняются, но использовать их для взаимодействий нельзя. Состоянием реальной руки управляет поставщик, не игровой код.
Методы14
GetHandJointAngularVelocityVector3
public Vector3 GetHandJointAngularVelocity(XRHandTracker.HandJoint joint);Возвращает сохранённую угловую скорость. Для использования нужен AngularVelocityValid; сам getter не применяет reference frame или WorldScale.
| Имя | Тип | По умолчанию |
|---|---|---|
joint | XRHandTracker.HandJoint | — |
jointОдин из 26 HandJoint: Palm…PinkyFingerTip. Max — граница, не допустимый сустав.
Vector3Сохранённая угловая скорость; проверяйте флаг.
GetHandJointFlagsXRHandTracker.HandJointFlags
public XRHandTracker.HandJointFlags GetHandJointFlags(XRHandTracker.HandJoint joint);Читает битовую маску валидности и tracking сустава. До инициализации поставщиком возможны случайные значения из-за дефекта конструктора. VALID не равен TRACKED. Проверяйте HasTrackingData и нужные биты; для скоростей есть отдельные биты.
| Имя | Тип | По умолчанию |
|---|---|---|
joint | XRHandTracker.HandJoint | — |
jointОдин из 26 HandJoint: Palm…PinkyFingerTip. Max — граница, не допустимый сустав.
XRHandTracker.HandJointFlagsМаска сустава; до инициализации значения не гарантированы.
GetHandJointLinearVelocityVector3
public Vector3 GetHandJointLinearVelocity(XRHandTracker.HandJoint joint);Возвращает сохранённую линейную скорость без проверки LinearVelocityValid и без преобразования в игровой мир. Не используйте оставшееся значение после потери tracking.
| Имя | Тип | По умолчанию |
|---|---|---|
joint | XRHandTracker.HandJoint | — |
jointОдин из 26 HandJoint: Palm…PinkyFingerTip. Max — граница, не допустимый сустав.
Vector3Сохранённая линейная скорость; проверяйте флаг.
GetHandJointRadiusfloat
public float GetHandJointRadius(XRHandTracker.HandJoint joint);Читает сохранённый радиус, изначально 0. Для OpenXR единицы — метры и радиус имеет смысл только при PositionValid. Getter не проверяет флаг и не переводит значение через WorldScale.
| Имя | Тип | По умолчанию |
|---|---|---|
joint | XRHandTracker.HandJoint | — |
jointОдин из 26 HandJoint: Palm…PinkyFingerTip. Max — граница, не допустимый сустав.
floatСохранённый float радиуса; не проверка PositionValid.
GetHandJointTransformTransform3D
public Transform3D GetHandJointTransform(XRHandTracker.HandJoint joint);Возвращает Transform3D по значению без проверки флагов. В OpenXR это пространство tracking с поправкой ориентации для Humanoid, не локальный трансформ кости и не мир. Для позиции проверяйте PositionValid, для вращения OrientationValid. Сохранённые данные могут быть неактуальны.
| Имя | Тип | По умолчанию |
|---|---|---|
joint | XRHandTracker.HandJoint | — |
jointОдин из 26 HandJoint: Palm…PinkyFingerTip. Max — граница, не допустимый сустав.
Transform3DКопия трансформа сустава, не локальная pose кости модели.
GetHandTrackingSourceXRHandTracker.HandTrackingSourceEnum
public XRHandTracker.HandTrackingSourceEnum GetHandTrackingSource();Возвращает сохранённый источник. Не определяйте его по имени runtime; Unknown оставляйте неизвестным.
XRHandTracker.HandTrackingSourceEnumСохранённый источник, изначально Unknown.
GetHasTrackingDatabool
public bool GetHasTrackingData();Читает флаг всей руки. Дополнительно нужны флаги конкретного сустава; одно true не подтверждает валидность всех 26 суставов.
boolФлаг всей руки; не подтверждает каждый сустав.
SetHandJointAngularVelocityvoid
public void SetHandJointAngularVelocity(XRHandTracker.HandJoint joint, Vector3 angularVelocity);Сохраняет угловую скорость без вычисления из вращения и без изменения AngularVelocityValid. Соглашения пространства задаёт поставщик.
| Имя | Тип | По умолчанию |
|---|---|---|
joint | XRHandTracker.HandJoint | — |
angularVelocity | Vector3 | — |
jointОдин из 26 HandJoint: Palm…PinkyFingerTip. Max — граница, не допустимый сустав.
angularVelocityУгловая скорость в соглашениях поставщика; флаг задаётся отдельно.
SetHandJointFlagsvoid
public void SetHandJointFlags(XRHandTracker.HandJoint joint, XRHandTracker.HandJointFlags flags);Записывает маску одного сустава; не меняет трансформ, скорости или HasTrackingData. Для собственного поставщика явно инициализируйте все нужные суставы до публикации данных. Не исправляйте этим состояние настоящей руки из игрового кода.
| Имя | Тип | По умолчанию |
|---|---|---|
joint | XRHandTracker.HandJoint | — |
flags | XRHandTracker.HandJointFlags | — |
jointОдин из 26 HandJoint: Palm…PinkyFingerTip. Max — граница, не допустимый сустав.
flagsМаска HandJointFlags для одного сустава; передавайте точные биты пригодности данных.
SetHandJointLinearVelocityvoid
public void SetHandJointLinearVelocity(XRHandTracker.HandJoint joint, Vector3 linearVelocity);Сохраняет линейную скорость отдельно от трансформа и флагов. Не вычисляет её по предыдущему кадру и не включает LinearVelocityValid.
| Имя | Тип | По умолчанию |
|---|---|---|
joint | XRHandTracker.HandJoint | — |
linearVelocity | Vector3 | — |
jointОдин из 26 HandJoint: Palm…PinkyFingerTip. Max — граница, не допустимый сустав.
linearVelocityЛинейная скорость в соглашениях поставщика; флаг задаётся отдельно.
SetHandJointRadiusvoid
public void SetHandJointRadius(XRHandTracker.HandJoint joint, float radius);Сохраняет float радиуса без проверки диапазона или изменения флагов. Поставщик должен передать конечное физически корректное значение; getter не подтверждает его пригодность.
| Имя | Тип | По умолчанию |
|---|---|---|
joint | XRHandTracker.HandJoint | — |
radius | float | — |
jointОдин из 26 HandJoint: Palm…PinkyFingerTip. Max — граница, не допустимый сустав.
radiusКонечный физический радиус; в OpenXR метры. Setter сам не проверяет диапазон.
SetHandJointTransformvoid
public void SetHandJointTransform(XRHandTracker.HandJoint joint, Transform3D transform);Сохраняет трансформ сустава без пересчёта флагов или скоростей. Это API поставщика, не команда перемещения кости модели.
| Имя | Тип | По умолчанию |
|---|---|---|
joint | XRHandTracker.HandJoint | — |
transform | Transform3D | — |
jointОдин из 26 HandJoint: Palm…PinkyFingerTip. Max — граница, не допустимый сустав.
transformТрансформ в пространстве поставщика; не применяйте игровой origin заранее.
SetHandTrackingSourcevoid
public void SetHandTrackingSource(XRHandTracker.HandTrackingSourceEnum source);Источник данных, изначально Unknown. Unobstructed и Controller описывают сообщённый тип, NotTracked — отсутствие tracking; доступность зависит от поставщика. Unknown не доказывает оптическое tracking. Setter не меняет HasTrackingData или флаги суставов.
| Имя | Тип | По умолчанию |
|---|---|---|
source | XRHandTracker.HandTrackingSourceEnum | — |
sourceСообщённый источник; не способ включить устройство или tracking.
SetHasTrackingDatavoid
public void SetHasTrackingData(bool hasData);Флаг данных всей руки, изначально false. Setter меняет только его: не заполняет флаги/трансформы суставов и не создаёт pose default. При false суставные данные сохраняются, но использовать их для взаимодействий нельзя. Состоянием реальной руки управляет поставщик, не игровой код.
| Имя | Тип | По умолчанию |
|---|---|---|
hasData | bool | — |
hasDataФлаг данных всей руки. Не включает валидность отдельных суставов.
XRHandTracker.HandJoint
| Значение | Описание |
|---|---|
IndexFingerMetacarpal = 6 | Пястно-запястный сустав указательного пальца. |
IndexFingerPhalanxDistal = 9 | Дистальный сустав фаланги указательного пальца. |
IndexFingerPhalanxIntermediate = 8 | Промежуточный сустав фаланги указательного пальца. |
IndexFingerPhalanxProximal = 7 | Проксимальный сустав фаланги указательного пальца. |
IndexFingerTip = 10 | Кончик указательного пальца. |
Max = 26 | Представляет размер перечисления |
MiddleFingerMetacarpal = 11 | Пястно-запястный сустав среднего пальца. |
MiddleFingerPhalanxDistal = 14 | Дистальный сустав фаланги среднего пальца. |
MiddleFingerPhalanxIntermediate = 13 | Промежуточный сустав фаланги среднего пальца. |
MiddleFingerPhalanxProximal = 12 | Проксимальный сустав фаланги среднего пальца. |
MiddleFingerTip = 15 | Кончик среднего пальца. |
Palm = 0 | Ладонный сустав. |
PinkyFingerMetacarpal = 21 | Пястно-запястный сустав мизинца. |
PinkyFingerPhalanxDistal = 24 | Дистальный сустав фаланги мизинца. |
PinkyFingerPhalanxIntermediate = 23 | Промежуточный сустав фаланги мизинца. |
PinkyFingerPhalanxProximal = 22 | Проксимальный сустав фаланги мизинца. |
PinkyFingerTip = 25 | Сустав кончика мизинца. |
RingFingerMetacarpal = 16 | Пястно-запястный сустав безымянного пальца. |
RingFingerPhalanxDistal = 19 | Дистальный сустав фаланги безымянного пальца. |
RingFingerPhalanxIntermediate = 18 | Промежуточный сустав фаланги безымянного пальца. |
RingFingerPhalanxProximal = 17 | Проксимальный сустав фаланги безымянного пальца. |
RingFingerTip = 20 | Сустав кончика безымянного пальца. |
ThumbMetacarpal = 2 | Пястно-запястный сустав большого пальца. *РОД РОД_СОВМЕСТНЫЙ_ТОМБ_ФАЛАНЕКС_ПРОКСМАЛЬ |
ThumbPhalanxDistal = 4 | Дистальный сустав фаланги большого пальца. |
ThumbPhalanxProximal = 3 | Проксимальный сустав фаланги большого пальца. |
ThumbTip = 5 | Сустав кончика большого пальца. |
Wrist = 1 | Лучезапястный сустав. |
XRHandTracker.HandJointFlags
| Значение | Описание |
|---|---|
AngularVelocityValid = 32 | Данные об угловой скорости сустава кисти достоверны. |
LinearVelocityValid = 16 | Данные о линейной скорости сустава кисти достоверны. |
OrientationTracked = 2 | Ориентация сустава руки активно отслеживается. Не может быть установлена, если отслеживание временно потеряно. |
OrientationValid = 1 | Данные об ориентации сустава кисти достоверны. |
PositionTracked = 8 | Положение сустава руки активно отслеживается. Не может быть установлено, если отслеживание временно потеряно. |
PositionValid = 4 | Данные о положении сустава кисти достоверны. |
XRHandTracker.HandTrackingSourceEnum
| Значение | Описание |
|---|---|
Controller = 2 | Источником данных отслеживания рук является контроллер, то есть положения суставов определяются на основе входных данных контроллера. |
Max = 4 | Представляет размер перечисления |
NotTracked = 3 | Данные отслеживания руки не отслеживаются. Это означает, что рука закрыта, контроллер выключен или отслеживание не поддерживается для текущего типа ввода. |
Unknown = 0 | Источник данных отслеживания рук неизвестен. |
Unobstructed = 1 | Источник данных отслеживания рук не имеет препятствий, что означает, что используется точный метод отслеживания рук. К ним относятся оптическое отслеживание рук, перчатки с данными и т. д. |