reckfellENGINE

XRPositionalTracker

Общее состояние именованных pose и tracking.

На этой странице
class XRPositionalTrackerReckfellSharpНаследует XRTracker

XRPositionalTracker хранит состояние, которое поставщик tracking передаёт в XRServer. Это не Entity и не физическое тело. Создание объекта не регистрирует устройство и не запускает сеанс. Для контроллера есть XRControllerTracker; для игрового рига используйте XREntity3D или XRController3D.

HasPose проверяет существование записи. InvalidatePose сохраняет запись, последний трансформ, скорости и confidence, но сбрасывает HasTrackingData. SetPose обновляет тот же объект и снова делает его валидным; даже Confidence=None не сбрасывает этот флаг. Проверяйте пригодность данных отдельно от наличия записи.

Этот выполненный пример копирует сырой трансформ только при наличии tracking. Он не добавляет WorldScale, reference frame или игровой origin и не оценивает качество tracking:

C#
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Конструктор
# XRPositionalTracker
C#
public XRPositionalTracker();

Создаёт контейнер состояния без pose, с пустым Profile, Hand=Unknown и Type=Unknown. Не регистрирует tracker в XRServer и не обнаруживает устройство. Для контроллера используйте XRControllerTracker.

Свойства2

HandСвойство
# Hand
C#
public XRPositionalTracker.TrackerHand Hand { get; set; }

Принадлежность руке, изначально Unknown. Используйте Unknown, Left или Right; Max — граница enum, не значение устройства. Setter проверяет диапазон. Не выводится автоматически из Name, не создаёт pose и не испускает ProfileChanged.

ProfileСвойство
# Profile
C#
public string Profile { get; set; }

Строка профиля, изначально пустая. Для OpenXR обычно путь interaction profile; setter сам не проверяет поддержку или формат. ProfileChanged испускается только при изменении строки и передаёт новый профиль. Не создаёт устройство и не переключает его возможности.

Методы10

GetInputVariant · Устарело
# GetInput
C#
public Variant GetInput(StringName name);

Возвращает Variant по внутреннему имени действия или Nil. В текущем C# SDK метод помечен Obsolete и наследуется XRControllerTracker с той же пометкой. Для игрового ввода используйте XRController3D.GetInput; прямое чтение базового XRPositionalTracker дополнительно выдаёт native-предупреждение. Метод не проверяет pose или фокус.

Параметры
ИмяТипПо умолчанию
nameStringName—
name

Точное внутреннее имя действия; не LocalizedName и не обычный InputMap.

Возвращает Variant

Variant сохранённого типа или Nil; полученную обёртку Variant освобождайте через using.

GetPoseXRPose
# GetPose
C#
public XRPose GetPose(StringName name);

Возвращает общее состояние именованной pose или null. Повторный SetPose обновляет тот же объект; это не снимок. В C# может повторно использоваться та же обёртка: не вызывайте Dispose/using для заимствованной pose, которую могут читать другие ссылки. Для снимка копируйте Transform и нужные значения; проверяйте HasTrackingData.

Параметры
ИмяТипПо умолчанию
nameStringName—
name

Точное имя pose, например grip или aim; не имя tracker left_hand/right_hand.

Возвращает XRPose

Общая pose или null. Не освобождайте заимствованную C# обёртку; копируйте значения для снимка.

GetTrackerHandXRPositionalTracker.TrackerHand
# GetTrackerHand
C#
public XRPositionalTracker.TrackerHand GetTrackerHand();

Возвращает сохранённую принадлежность руке, изначально Unknown. Не подтверждает наличие данных tracking.

Возвращает XRPositionalTracker.TrackerHand

Сохранённая рука; изначально Unknown.

GetTrackerProfilestring
# GetTrackerProfile
C#
public string GetTrackerProfile();

Возвращает сохранённую строку профиля, изначально пустую. Это не имя tracker, не рука и не подтверждение поддержки устройства.

Возвращает string

Сохранённый профиль; изначально пустая строка.

HasPosebool
# HasPose
C#
public bool HasPose(StringName name);

Проверяет наличие именованной записи pose. После InvalidatePose остаётся true: запись не удаляется. Для пригодности данных проверяйте GetPose(name) и HasTrackingData самой pose.

Параметры
ИмяТипПо умолчанию
nameStringName—
name

Точное имя pose, например grip или aim; не имя tracker left_hand/right_hand.

Возвращает bool

true при наличии записи, включая запись с потерянным tracking.

InvalidatePosevoid
# InvalidatePose
C#
public void InvalidatePose(StringName name);

Для существующей pose сбрасывает HasTrackingData и испускает PoseLostTracking при каждом вызове, включая повторный. Не удаляет запись, не обнуляет трансформ, скорости или confidence, не сбрасывает ввод. Неизвестное имя ничего не делает. Следующий SetPose снова делает запись валидной.

Параметры
ИмяТипПо умолчанию
nameStringName—
name

Точное имя pose, например grip или aim; не имя tracker left_hand/right_hand.

SetInputvoid · Устарело
# SetInput
C#
public void SetInput(StringName name, Variant value);

Записывает значение по имени действия; события возникают только при изменении значения и только для Bool, Float или Vector2. Float не синтезирует ButtonPressed по порогу. В C# SDK метод Obsolete даже через XRControllerTracker; это не API ввода игрока. Поставщик tracking управляет состоянием, игровой код читает XRController3D. В QA native Call использован только для искусственных данных.

Параметры
ИмяТипПо умолчанию
nameStringName—
valueVariant—
name

Точное внутреннее имя действия; не LocalizedName и не обычный InputMap.

value

Значение действия. События поддерживают Bool, Float и Vector2; это данные поставщика, не симуляция клавиатуры.

SetPosevoid
# SetPose
C#
public void SetPose(StringName name, Transform3D transform, Vector3 linearVelocity, Vector3 angularVelocity, XRPose.TrackingConfidenceEnum trackingConfidence);

Создаёт запись pose при отсутствии или обновляет прежний объект. Записывает трансформ, скорости, confidence и HasTrackingData=true; PoseChanged испускается при каждом вызове, даже с прежними значениями. Confidence=None сам по себе не сбрасывает HasTrackingData. Метод для поставщика tracking; игровой код не должен подменять состояние реального устройства.

Параметры
ИмяТипПо умолчанию
nameStringName—
transformTransform3D—
linearVelocityVector3—
angularVelocityVector3—
trackingConfidenceXRPose.TrackingConfidenceEnum—
name

Точное имя pose, например grip или aim; не имя tracker left_hand/right_hand.

transform

Трансформ в пространстве tracking поставщика. Сохраняется без добавления игрового origin; не GlobalTransform персонажа.

linearVelocity

Линейная скорость в соглашениях поставщика; сохраняется как передана, без вычисления из предыдущих pose.

angularVelocity

Угловая скорость в соглашениях поставщика; сохраняется как передана.

trackingConfidence

Оценка confidence для записи. None не мешает SetPose установить HasTrackingData=true; это разные поля.

SetTrackerHandvoid
# SetTrackerHand
C#
public void SetTrackerHand(XRPositionalTracker.TrackerHand hand);

Принадлежность руке, изначально Unknown. Используйте Unknown, Left или Right; Max — граница enum, не значение устройства. Setter проверяет диапазон. Не выводится автоматически из Name, не создаёт pose и не испускает ProfileChanged.

Параметры
ИмяТипПо умолчанию
handXRPositionalTracker.TrackerHand—
hand

Unknown, Left или Right; Max не является допустимой рукой.

SetTrackerProfilevoid
# SetTrackerProfile
C#
public void SetTrackerProfile(string profile);

Строка профиля, изначально пустая. Для OpenXR обычно путь interaction profile; setter сам не проверяет поддержку или формат. ProfileChanged испускается только при изменении строки и передаёт новый профиль. Не создаёт устройство и не переключает его возможности.

Параметры
ИмяТипПо умолчанию
profilestring—
profile

Сохраняемая строка профиля. Setter не проверяет поддержку runtime; повтор строки не испускает событие.

Сигналы и события7

ButtonPressedСобытие
# ButtonPressed
C#
public event XRPositionalTracker.ButtonPressedEventHandler ButtonPressed;

Событие записи изменившегося Bool=true. Повтор true не испускается; Float не преобразуется в нажатие автоматически. Содержит внутреннее имя действия, не подпись.

Параметры обработчика
ИмяТипПо умолчанию
actionNamestring—
actionName

Внутреннее имя действия, например select; не подпись или путь компонента контроллера.

ButtonReleasedСобытие
# ButtonReleased
C#
public event XRPositionalTracker.ButtonReleasedEventHandler ButtonReleased;

Событие записи изменившегося Bool=false. Потеря pose не сбрасывает ввод и не испускает отпускание; очищайте игровое состояние взаимодействий отдельно.

Параметры обработчика
ИмяТипПо умолчанию
actionNamestring—
actionName

Внутреннее имя действия, например select; не подпись или путь компонента контроллера.

InputFloatChangedСобытие
# InputFloatChanged
C#
public event XRPositionalTracker.InputFloatChangedEventHandler InputFloatChanged;

Передаёт новое значение действия Float при изменении. Параметр value в C# — double. Не создаёт событий нажатия кнопки и не добавляет dead zone.

Параметры обработчика
ИмяТипПо умолчанию
actionNamestring—
valuedouble—
actionName

Внутреннее имя действия, например select; не подпись или путь компонента контроллера.

value

Новое значение double действия Float.

InputVector2ChangedСобытие
# InputVector2Changed
C#
public event XRPositionalTracker.InputVector2ChangedEventHandler InputVector2Changed;

Передаёт изменившееся значение Vector2. Параметр в этом событии называется vector; не путайте с value у XRController3D.InputVector2Changed. Нормализация и dead zone не применяются.

Параметры обработчика
ИмяТипПо умолчанию
actionNamestring—
vectorVector2—
actionName

Внутреннее имя действия, например select; не подпись или путь компонента контроллера.

vector

Новое значение Vector2 без нормализации и dead zone.

PoseChangedСобытие
# PoseChanged
C#
public event XRPositionalTracker.PoseChangedEventHandler PoseChanged;

Передаёт общий объект pose после каждого SetPose, даже если значения совпали. Это обновление данных поставщиком, не обязательно изменение координат. Не освобождайте и не изменяйте переданную pose; скопируйте нужные поля для длительного хранения.

Параметры обработчика
ИмяТипПо умолчанию
poseXRPose—
pose

Общее состояние pose. Не изменяйте и не освобождайте его; при хранении копируйте нужные значения.

PoseLostTrackingСобытие
# PoseLostTracking
C#
public event XRPositionalTracker.PoseLostTrackingEventHandler PoseLostTracking;

Передаёт сохранённую pose уже с HasTrackingData=false. Повторный InvalidatePose снова испускает событие. Отличается от дедуплицируемого TrackingChanged у XREntity3D. Старые координаты остаются доступными, но не подтверждают текущую pose.

Параметры обработчика
ИмяТипПо умолчанию
poseXRPose—
pose

Общее состояние pose. Не изменяйте и не освобождайте его; при хранении копируйте нужные значения.

ProfileChangedСобытие
# ProfileChanged
C#
public event XRPositionalTracker.ProfileChangedEventHandler ProfileChanged;

Испускается при изменении Profile. Параметр role фактически содержит новую строку профиля, а не Left/Right. Повтор того же профиля событие не создаёт.

Параметры обработчика
ИмяТипПо умолчанию
rolestring—
role

Новая строка профиля; историческое имя аргумента не означает принадлежность руке.

XRPositionalTracker.TrackerHand

ЗначениеОписание
Left = 1

Этот трекер — левый контроллер.

Max = 3

Представляет размер перечисления XRPositionalTracker.TrackerHand.

Right = 2

Этот трекер является правым контроллером.

Unknown = 0

Рука, в которой находится этот трекер, неизвестна или неприменима.

Документация Reckfell EngineНаверх ↑
БЫСТРЫЙ ПЕРЕХОДНачало работыEntity и иерархияC# & .NET 10Сцены и префабы
Руководства и полный API Reckfell K
reckfellENGINE
RECKFELL ACCOUNT

Вход в аккаунт

Войдите в аккаунт Reckfell.

Один аккаунт для всей платформы Reckfell.