XRPositionalTracker
Общее состояние именованных pose и tracking.
XRPositionalTracker хранит состояние, которое поставщик tracking передаёт в XRServer. Это не Entity и не физическое тело. Создание объекта не регистрирует устройство и не запускает сеанс. Для контроллера есть XRControllerTracker; для игрового рига используйте XREntity3D или XRController3D.
HasPose проверяет существование записи. InvalidatePose сохраняет запись, последний трансформ, скорости и confidence, но сбрасывает HasTrackingData. SetPose обновляет тот же объект и снова делает его валидным; даже Confidence=None не сбрасывает этот флаг. Проверяйте пригодность данных отдельно от наличия записи.
Этот выполненный пример копирует сырой трансформ только при наличии tracking. Он не добавляет WorldScale, reference frame или игровой origin и не оценивает качество tracking:
using Reckfell;
public static class TrackedPoseReader
{
// Raw tracking-space pose, not a world transform or a tracking-quality test.
public static bool TryRead(
XRPositionalTracker tracker, StringName poseName, out Transform3D transform)
{
transform = Transform3D.Identity;
if (tracker is null) return false;
// Shared tracker state: do not dispose its cached C# wrapper here.
var pose = tracker.GetPose(poseName);
if (pose is null || !pose.HasTrackingData) return false;
transform = pose.Transform;
return true;
}
}GetPose и аргументы событий содержат общее состояние. В C# обёртка одного native-объекта может переиспользоваться: не освобождайте заимствованную pose через Dispose/using. Проверка показала, что это делает другую удерживаемую ссылку непригодной. Для снимка копируйте Transform, скорости и флаги.
PoseChanged возникает при каждом SetPose; PoseLostTracking — при каждом InvalidatePose существующей записи, включая повторы. Это отличается от дедуплицируемого TrackingChanged у XREntity3D. Потеря pose не сбрасывает сохранённый ввод и не создаёт ButtonReleased.
GetInput/SetInput помечены Obsolete в текущем C# SDK даже через XRControllerTracker. Игровой код читает XRController3D; native Call использован только в изолированной проверке искусственного поставщика. Проверены состояние и пример, без реальной гарнитуры или оценки tracking. Настройка: компоненты XR.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы1
XRPositionalTrackerКонструктор
public XRPositionalTracker();Создаёт контейнер состояния без pose, с пустым Profile, Hand=Unknown и Type=Unknown. Не регистрирует tracker в XRServer и не обнаруживает устройство. Для контроллера используйте XRControllerTracker.
Свойства2
HandСвойство
public XRPositionalTracker.TrackerHand Hand { get; set; }Принадлежность руке, изначально Unknown. Используйте Unknown, Left или Right; Max — граница enum, не значение устройства. Setter проверяет диапазон. Не выводится автоматически из Name, не создаёт pose и не испускает ProfileChanged.
ProfileСвойство
public string Profile { get; set; }Строка профиля, изначально пустая. Для OpenXR обычно путь interaction profile; setter сам не проверяет поддержку или формат. ProfileChanged испускается только при изменении строки и передаёт новый профиль. Не создаёт устройство и не переключает его возможности.
Методы10
GetInputVariant · Устарело
public Variant GetInput(StringName name);Возвращает Variant по внутреннему имени действия или Nil. В текущем C# SDK метод помечен Obsolete и наследуется XRControllerTracker с той же пометкой. Для игрового ввода используйте XRController3D.GetInput; прямое чтение базового XRPositionalTracker дополнительно выдаёт native-предупреждение. Метод не проверяет pose или фокус.
| Имя | Тип | По умолчанию |
|---|---|---|
name | StringName | — |
nameТочное внутреннее имя действия; не LocalizedName и не обычный InputMap.
VariantVariant сохранённого типа или Nil; полученную обёртку Variant освобождайте через using.
GetPoseXRPose
public XRPose GetPose(StringName name);Возвращает общее состояние именованной pose или null. Повторный SetPose обновляет тот же объект; это не снимок. В C# может повторно использоваться та же обёртка: не вызывайте Dispose/using для заимствованной pose, которую могут читать другие ссылки. Для снимка копируйте Transform и нужные значения; проверяйте HasTrackingData.
| Имя | Тип | По умолчанию |
|---|---|---|
name | StringName | — |
nameТочное имя pose, например grip или aim; не имя tracker left_hand/right_hand.
XRPoseОбщая pose или null. Не освобождайте заимствованную C# обёртку; копируйте значения для снимка.
GetTrackerHandXRPositionalTracker.TrackerHand
public XRPositionalTracker.TrackerHand GetTrackerHand();Возвращает сохранённую принадлежность руке, изначально Unknown. Не подтверждает наличие данных tracking.
XRPositionalTracker.TrackerHandСохранённая рука; изначально Unknown.
GetTrackerProfilestring
public string GetTrackerProfile();Возвращает сохранённую строку профиля, изначально пустую. Это не имя tracker, не рука и не подтверждение поддержки устройства.
stringСохранённый профиль; изначально пустая строка.
HasPosebool
public bool HasPose(StringName name);Проверяет наличие именованной записи pose. После InvalidatePose остаётся true: запись не удаляется. Для пригодности данных проверяйте GetPose(name) и HasTrackingData самой pose.
| Имя | Тип | По умолчанию |
|---|---|---|
name | StringName | — |
nameТочное имя pose, например grip или aim; не имя tracker left_hand/right_hand.
booltrue при наличии записи, включая запись с потерянным tracking.
InvalidatePosevoid
public void InvalidatePose(StringName name);Для существующей pose сбрасывает HasTrackingData и испускает PoseLostTracking при каждом вызове, включая повторный. Не удаляет запись, не обнуляет трансформ, скорости или confidence, не сбрасывает ввод. Неизвестное имя ничего не делает. Следующий SetPose снова делает запись валидной.
| Имя | Тип | По умолчанию |
|---|---|---|
name | StringName | — |
nameТочное имя pose, например grip или aim; не имя tracker left_hand/right_hand.
SetInputvoid · Устарело
public void SetInput(StringName name, Variant value);Записывает значение по имени действия; события возникают только при изменении значения и только для Bool, Float или Vector2. Float не синтезирует ButtonPressed по порогу. В C# SDK метод Obsolete даже через XRControllerTracker; это не API ввода игрока. Поставщик tracking управляет состоянием, игровой код читает XRController3D. В QA native Call использован только для искусственных данных.
| Имя | Тип | По умолчанию |
|---|---|---|
name | StringName | — |
value | Variant | — |
nameТочное внутреннее имя действия; не LocalizedName и не обычный InputMap.
valueЗначение действия. События поддерживают Bool, Float и Vector2; это данные поставщика, не симуляция клавиатуры.
SetPosevoid
public void SetPose(StringName name, Transform3D transform, Vector3 linearVelocity, Vector3 angularVelocity, XRPose.TrackingConfidenceEnum trackingConfidence);Создаёт запись pose при отсутствии или обновляет прежний объект. Записывает трансформ, скорости, confidence и HasTrackingData=true; PoseChanged испускается при каждом вызове, даже с прежними значениями. Confidence=None сам по себе не сбрасывает HasTrackingData. Метод для поставщика tracking; игровой код не должен подменять состояние реального устройства.
| Имя | Тип | По умолчанию |
|---|---|---|
name | StringName | — |
transform | Transform3D | — |
linearVelocity | Vector3 | — |
angularVelocity | Vector3 | — |
trackingConfidence | XRPose.TrackingConfidenceEnum | — |
nameТочное имя pose, например grip или aim; не имя tracker left_hand/right_hand.
transformТрансформ в пространстве tracking поставщика. Сохраняется без добавления игрового origin; не GlobalTransform персонажа.
linearVelocityЛинейная скорость в соглашениях поставщика; сохраняется как передана, без вычисления из предыдущих pose.
angularVelocityУгловая скорость в соглашениях поставщика; сохраняется как передана.
trackingConfidenceОценка confidence для записи. None не мешает SetPose установить HasTrackingData=true; это разные поля.
SetTrackerHandvoid
public void SetTrackerHand(XRPositionalTracker.TrackerHand hand);Принадлежность руке, изначально Unknown. Используйте Unknown, Left или Right; Max — граница enum, не значение устройства. Setter проверяет диапазон. Не выводится автоматически из Name, не создаёт pose и не испускает ProfileChanged.
| Имя | Тип | По умолчанию |
|---|---|---|
hand | XRPositionalTracker.TrackerHand | — |
handUnknown, Left или Right; Max не является допустимой рукой.
SetTrackerProfilevoid
public void SetTrackerProfile(string profile);Строка профиля, изначально пустая. Для OpenXR обычно путь interaction profile; setter сам не проверяет поддержку или формат. ProfileChanged испускается только при изменении строки и передаёт новый профиль. Не создаёт устройство и не переключает его возможности.
| Имя | Тип | По умолчанию |
|---|---|---|
profile | string | — |
profileСохраняемая строка профиля. Setter не проверяет поддержку runtime; повтор строки не испускает событие.
Сигналы и события7
ButtonPressedСобытие
public event XRPositionalTracker.ButtonPressedEventHandler ButtonPressed;Событие записи изменившегося Bool=true. Повтор true не испускается; Float не преобразуется в нажатие автоматически. Содержит внутреннее имя действия, не подпись.
| Имя | Тип | По умолчанию |
|---|---|---|
actionName | string | — |
actionNameВнутреннее имя действия, например select; не подпись или путь компонента контроллера.
ButtonReleasedСобытие
public event XRPositionalTracker.ButtonReleasedEventHandler ButtonReleased;Событие записи изменившегося Bool=false. Потеря pose не сбрасывает ввод и не испускает отпускание; очищайте игровое состояние взаимодействий отдельно.
| Имя | Тип | По умолчанию |
|---|---|---|
actionName | string | — |
actionNameВнутреннее имя действия, например select; не подпись или путь компонента контроллера.
InputFloatChangedСобытие
public event XRPositionalTracker.InputFloatChangedEventHandler InputFloatChanged;Передаёт новое значение действия Float при изменении. Параметр value в C# — double. Не создаёт событий нажатия кнопки и не добавляет dead zone.
| Имя | Тип | По умолчанию |
|---|---|---|
actionName | string | — |
value | double | — |
actionNameВнутреннее имя действия, например select; не подпись или путь компонента контроллера.
valueНовое значение double действия Float.
InputVector2ChangedСобытие
public event XRPositionalTracker.InputVector2ChangedEventHandler InputVector2Changed;Передаёт изменившееся значение Vector2. Параметр в этом событии называется vector; не путайте с value у XRController3D.InputVector2Changed. Нормализация и dead zone не применяются.
| Имя | Тип | По умолчанию |
|---|---|---|
actionName | string | — |
vector | Vector2 | — |
actionNameВнутреннее имя действия, например select; не подпись или путь компонента контроллера.
vectorНовое значение Vector2 без нормализации и dead zone.
PoseChangedСобытие
public event XRPositionalTracker.PoseChangedEventHandler PoseChanged;Передаёт общий объект pose после каждого SetPose, даже если значения совпали. Это обновление данных поставщиком, не обязательно изменение координат. Не освобождайте и не изменяйте переданную pose; скопируйте нужные поля для длительного хранения.
| Имя | Тип | По умолчанию |
|---|---|---|
pose | XRPose | — |
poseОбщее состояние pose. Не изменяйте и не освобождайте его; при хранении копируйте нужные значения.
PoseLostTrackingСобытие
public event XRPositionalTracker.PoseLostTrackingEventHandler PoseLostTracking;Передаёт сохранённую pose уже с HasTrackingData=false. Повторный InvalidatePose снова испускает событие. Отличается от дедуплицируемого TrackingChanged у XREntity3D. Старые координаты остаются доступными, но не подтверждают текущую pose.
| Имя | Тип | По умолчанию |
|---|---|---|
pose | XRPose | — |
poseОбщее состояние pose. Не изменяйте и не освобождайте его; при хранении копируйте нужные значения.
ProfileChangedСобытие
public event XRPositionalTracker.ProfileChangedEventHandler ProfileChanged;Испускается при изменении Profile. Параметр role фактически содержит новую строку профиля, а не Left/Right. Повтор того же профиля событие не создаёт.
| Имя | Тип | По умолчанию |
|---|---|---|
role | string | — |
roleНовая строка профиля; историческое имя аргумента не означает принадлежность руке.
XRPositionalTracker.TrackerHand
| Значение | Описание |
|---|---|
Left = 1 | Этот трекер — левый контроллер. |
Max = 3 | Представляет размер перечисления |
Right = 2 | Этот трекер является правым контроллером. |
Unknown = 0 | Рука, в которой находится этот трекер, неизвестна или неприменима. |