XRServer
Сервер для функций дополненной и виртуальной реальности.
Сервер для функций дополненной и виртуальной реальности.
Сервер дополненной (AR) и виртуальной (VR) реальности является сердцем нашего решения для Расширенной и Виртуальной Реальности и выполняет всю обработку.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Свойства5
CameraLockedToOriginСвойство
public static bool CameraLockedToOrigin { get; set; }Если установлено значение true, сцена будет визуализироваться так, как будто камера заблокирована на XROrigin3D.
Примечание: Это не очень удобно для пользователей. Эта настройка существует для проведения бенчмаркинга или автоматизированного тестирования, когда вы хотите контролировать то, что визуализируется через код.
PrimaryInterfaceСвойство
public static XRInterface PrimaryInterface { get; set; }Основной XRInterface, связанный в данный момент с XRServer.
SingletonСвойство
public static XRServerInstance Singleton { get; }WorldOriginСвойство
public static Transform3D WorldOrigin { get; set; }Игровой origin XRServer. Активный XROrigin3D публикует сюда свой мировой трансформ; прямое присваивание может быть перезаписано им. Setter испускает WorldOriginChanged даже при повторе. Для перемещения рига двигайте его origin/тело, не поддерживайте два независимых владельца. GetAdjustedTransform pose не включает это значение.
WorldScaleСвойство
public static double WorldScale { get; set; }Общий масштаб tracking относительно игровых единиц, изначально 1. Setter ограничивает конечные значения 0.01…1000 и передаёт состояние рендеру. Проверяйте конечность до вызова: сравнения диапазона не отбрасывают NaN. Меняет поправку pose, не локальный Scale Entity и не сохранённые скорости.
Методы26
AddInterfacevoid
public static void AddInterface(XRInterface @interface);Регистрирует объект XRInterface.
| Имя | Тип | По умолчанию |
|---|---|---|
interface | XRInterface | — |
AddTracker2 перегрузки
public static void AddTracker(XRPositionalTracker tracker);Регистрирует ненулевой объект по текущему имени. Повтор той же ссылки не испускает событие; другой объект с тем же именем заменяет запись и вызывает TrackerUpdated. Новое имя вызывает TrackerAdded. Не обнаруживает устройство и не проверяет аппаратные возможности. Имя сохраняйте стабильным до удаления.
| Имя | Тип | По умолчанию |
|---|---|---|
tracker | XRPositionalTracker | — |
trackerНенулевой объект с уже заданным стабильным именем. Удаление использует имя, не идентичность ссылки.
public static void AddTracker(XRTracker tracker);Регистрирует ненулевой объект по текущему имени. Повтор той же ссылки не испускает событие; другой объект с тем же именем заменяет запись и вызывает TrackerUpdated. Новое имя вызывает TrackerAdded. Не обнаруживает устройство и не проверяет аппаратные возможности. Имя сохраняйте стабильным до удаления.
| Имя | Тип | По умолчанию |
|---|---|---|
tracker | XRTracker | — |
trackerНенулевой объект с уже заданным стабильным именем. Удаление использует имя, не идентичность ссылки.
CenterOnHmdvoid
public static void CenterOnHmd(XRServer.RotationMode rotationMode, bool keepHeight);Важно правильно понимать эту функцию. Платформы дополненной и виртуальной реальности (AR) и виртуальной реальности (VR) обрабатывают позиционирование немного по-разному.
На платформах, не поддерживающих пространственное отслеживание, наша исходная точка (0, 0, 0) — это местоположение нашего шлема виртуальной реальности (HMD), но вы практически не можете контролировать направление взгляда игрока в реальном мире.
На платформах, поддерживающих пространственное отслеживание, наша исходная точка сильно зависит от системы. В OpenVR наша исходная точка обычно находится в центре пространства отслеживания на земле. На других платформах это часто местоположение камеры отслеживания.
Этот метод позволяет центрировать трекер относительно местоположения шлема виртуальной реальности (HMD). Он берёт текущее местоположение шлема виртуальной реальности и использует его для корректировки всех данных отслеживания; по сути, он адаптирует реальный мир к текущему положению игрока в игровом мире.
Для получения приемлемых результатов этот метод должен быть доступен для отслеживания. Это часто происходит через несколько кадров после запуска игры.
Вызвать этот метод следует через несколько секунд. Например, когда пользователь запрашивает перенастройку дисплея, удерживая назначенную кнопку на контроллере в течение короткого периода времени, или при реализации механизма телепортации.
| Имя | Тип | По умолчанию |
|---|---|---|
rotationMode | XRServer.RotationMode | — |
keepHeight | bool | — |
ClearReferenceFramevoid
public static void ClearReferenceFrame();Сбрасывает поправку reference frame в Identity, передаёт её рендеру и испускает ReferenceFrameChanged. Не меняет игровой origin, настройки масштаба или сырые pose. Поведение сверено с исходником; реальный recenter не проверен.
FindInterfaceXRInterface
public static XRInterface FindInterface(string name);Находит интерфейс по его name. Например, если ваш проект использует возможности платформы AR/VR, вы можете найти интерфейс для этой платформы по имени и инициализировать его.
| Имя | Тип | По умолчанию |
|---|---|---|
name | string | — |
XRInterfaceGetCameraOffsetsReckfell.Collections.Array<Transform3D>
public static Reckfell.Collections.Array<Transform3D> GetCameraOffsets(StringName trackerName);Получает набор перестановок для каждого просмотра для трекера tracker_name. tracker_name должен иметь в виду XRPositionalTracker Используется в качестве камеры.
Сначала проверьте наш первичный интерфейс, потом проверьте каждый активный интерфейс. Возвращается пустым, если интерфейсы не управляют этим трекером.
| Имя | Тип | По умолчанию |
|---|---|---|
trackerName | StringName | — |
Reckfell.Collections.Array<Transform3D>GetCameraProjectionsReckfell.Collections.Array<Projection>
public static Reckfell.Collections.Array<Projection> GetCameraProjections(StringName trackerName, double aspect, double near, double far);Получает набор матриц проекций для каждого вида для трекера tracker_name. tracker_name должен иметь в виду XRPositionalTracker Используется в качестве камеры.
Сначала проверьте наш первичный интерфейс, потом проверьте каждый активный интерфейс. Возвращается пустым, если интерфейсы не управляют этим трекером.
| Имя | Тип | По умолчанию |
|---|---|---|
trackerName | StringName | — |
aspect | double | — |
near | double | — |
far | double | — |
Reckfell.Collections.Array<Projection>GetHmdTransformTransform3D
public static Transform3D GetHmdTransform();Возвращает преобразование основного интерфейса.
Transform3DGetInterfaceXRInterface
public static XRInterface GetInterface(int idx);Возвращает интерфейс, зарегистрированный по заданному idx индексу в списке интерфейсов.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
XRInterfaceGetInterfaceCountint
public static int GetInterfaceCount();Возвращает количество интерфейсов, зарегистрированных в настоящее время на AR/VR-сервере. Если ваш проект поддерживает несколько AR/VR-платформ, вы можете просмотреть все доступные интерфейсы и либо предложить пользователю выбор, либо просто попытаться инициализировать каждый интерфейс и использовать первый, который вернет true.
intGetInterfacesReckfell.Collections.Array<Reckfell.Collections.Dictionary>
public static Reckfell.Collections.Array<Reckfell.Collections.Dictionary> GetInterfaces();Возвращает список доступных интерфейсов с указанием идентификатора и названия каждого интерфейса.
Reckfell.Collections.Array<Reckfell.Collections.Dictionary>GetPrimaryInterfaceXRInterface
public static XRInterface GetPrimaryInterface();XRInterfaceGetReferenceFrameTransform3D
public static Transform3D GetReferenceFrame();Копия поправки пространства tracking. GetAdjustedTransform слева умножает на неё pose после масштаба позиции. Это не игровой WorldOrigin. Здесь проверялся только Identity; recenter требует отдельной проверки устройства.
Transform3DПоправка пространства tracking, не игровой origin.
GetTrackerXRTracker
public static XRTracker GetTracker(StringName trackerName);Возвращает зарегистрированный XRTracker по точному имени или null. Поддерживает в том числе непозиционные tracker, которые текущий GetTrackers пропускает. Объект общий: не освобождайте заимствованную C# обёртку и не меняйте данные поставщика.
| Имя | Тип | По умолчанию |
|---|---|---|
trackerName | StringName | — |
trackerNameТочное имя записи XRServer, не ResourceName и не числовой ID.
XRTrackerОбщий зарегистрированный XRTracker либо null; не освобождайте заимствованный объект.
GetTrackersReckfell.Collections.Dictionary
public static Reckfell.Collections.Dictionary GetTrackers(int trackerTypes);Возвращает отдельный Dictionary: ключ — имя, значение — общий объект tracker. Очистка контейнера не снимает регистрацию. Маска сравнивается с Type побитово. Подтверждён дефект: реализация сначала приводит объекты к XRPositionalTracker, поэтому даже Any пропускает непозиционный XRFaceTracker. Для известного имени используйте GetTracker; не считайте этот список полным.
| Имя | Тип | По умолчанию |
|---|---|---|
trackerTypes | int | — |
trackerTypesПобитовая int-маска XRServer.TrackerType. Даже Any в текущем коде не включает непозиционные tracker.
Reckfell.Collections.DictionaryОтдельный Dictionary общих позиционных tracker; текущая реализация неполна для Any.
GetWorldOriginTransform3D
public static Transform3D GetWorldOrigin();Копия текущего игрового origin сервера, не сырая pose головы. На потоке рендера читается состояние кадра рендера.
Transform3DКопия игрового origin, поддерживаемого активным XROrigin3D.
GetWorldScaledouble
public static double GetWorldScale();Возвращает общий масштаб как double. На потоке рендера читается его сохранённое состояние, на основном — текущее состояние сервера. Синхронизация потоков здесь не проверялась.
doubleОбщий масштаб XRServer; не Scale Entity.
IsCameraLockedToOriginbool
public static bool IsCameraLockedToOrigin();boolRemoveInterfacevoid
public static void RemoveInterface(XRInterface @interface);Удаляет этот interface.
| Имя | Тип | По умолчанию |
|---|---|---|
interface | XRInterface | — |
RemoveTracker2 перегрузки
public static void RemoveTracker(XRPositionalTracker tracker);Удаляет запись по текущему имени переданного объекта, а не по идентичности ссылки. После замены объекта старая ссылка с тем же именем может удалить новый tracker. TrackerRemoved испускается до удаления записи; в обработчике GetTracker ещё может вернуть её. Не уничтожает внешние ссылки и не синтезирует отпускание кнопок.
| Имя | Тип | По умолчанию |
|---|---|---|
tracker | XRPositionalTracker | — |
trackerНенулевой объект с уже заданным стабильным именем. Удаление использует имя, не идентичность ссылки.
public static void RemoveTracker(XRTracker tracker);Удаляет запись по текущему имени переданного объекта, а не по идентичности ссылки. После замены объекта старая ссылка с тем же именем может удалить новый tracker. TrackerRemoved испускается до удаления записи; в обработчике GetTracker ещё может вернуть её. Не уничтожает внешние ссылки и не синтезирует отпускание кнопок.
| Имя | Тип | По умолчанию |
|---|---|---|
tracker | XRTracker | — |
trackerНенулевой объект с уже заданным стабильным именем. Удаление использует имя, не идентичность ссылки.
SetCameraLockedToOriginvoid
public static void SetCameraLockedToOrigin(bool enabled);| Имя | Тип | По умолчанию |
|---|---|---|
enabled | bool | — |
SetPrimaryInterfacevoid
public static void SetPrimaryInterface(XRInterface @interface);| Имя | Тип | По умолчанию |
|---|---|---|
interface | XRInterface | — |
SetWorldOriginvoid
public static void SetWorldOrigin(Transform3D worldOrigin);Игровой origin XRServer. Активный XROrigin3D публикует сюда свой мировой трансформ; прямое присваивание может быть перезаписано им. Setter испускает WorldOriginChanged даже при повторе. Для перемещения рига двигайте его origin/тело, не поддерживайте два независимых владельца. GetAdjustedTransform pose не включает это значение.
| Имя | Тип | По умолчанию |
|---|---|---|
worldOrigin | Transform3D | — |
worldOriginИгровой трансформ origin; активный XROrigin3D может перезаписать его.
SetWorldScalevoid
public static void SetWorldScale(double scale);Общий масштаб tracking относительно игровых единиц, изначально 1. Setter ограничивает конечные значения 0.01…1000 и передаёт состояние рендеру. Проверяйте конечность до вызова: сравнения диапазона не отбрасывают NaN. Меняет поправку pose, не локальный Scale Entity и не сохранённые скорости.
| Имя | Тип | По умолчанию |
|---|---|---|
scale | double | — |
scaleПоложительный конечный double масштаба; не передавайте NaN или бесконечность.
Сигналы и события7
InterfaceAddedСобытие
public static event XRServer.InterfaceAddedEventHandler InterfaceAdded;Выдается при добавлении нового интерфейса.
| Имя | Тип | По умолчанию |
|---|---|---|
interfaceName | StringName | — |
InterfaceRemovedСобытие
public static event XRServer.InterfaceRemovedEventHandler InterfaceRemoved;Выдается при удалении интерфейса.
| Имя | Тип | По умолчанию |
|---|---|---|
interfaceName | StringName | — |
ReferenceFrameChangedСобытие
public static event Action ReferenceFrameChanged;Испускается при изменении преобразования системы отсчета.
TrackerAddedСобытие
public static event XRServer.TrackerAddedEventHandler TrackerAdded;Событие новой записи после её добавления. Передаёт имя и числовую категорию long, не сам объект. Это регистрация поставщиком, не подтверждение актуальной pose или аппаратного подключения.
| Имя | Тип | По умолчанию |
|---|---|---|
trackerName | StringName | — |
type | long | — |
trackerNameТочное имя записи XRServer, не ResourceName и не числовой ID.
typeЧисловая категория long из XRServer.TrackerType, не объект tracker.
TrackerRemovedСобытие
public static event XRServer.TrackerRemovedEventHandler TrackerRemoved;Событие до удаления записи из реестра. В обработчике поиск по имени ещё может вернуть объект; не используйте это как доказательство, что удаление отменилось. После выхода из RemoveTracker запись уже отсутствует.
| Имя | Тип | По умолчанию |
|---|---|---|
trackerName | StringName | — |
type | long | — |
trackerNameТочное имя записи XRServer, не ResourceName и не числовой ID.
typeЧисловая категория long из XRServer.TrackerType, не объект tracker.
TrackerUpdatedСобытие
public static event XRServer.TrackerUpdatedEventHandler TrackerUpdated;Событие замены объекта другим с тем же именем. Повтор AddTracker той же ссылки не вызывает его. Не является событием каждого кадра tracking; обновления pose идут отдельно.
| Имя | Тип | По умолчанию |
|---|---|---|
trackerName | StringName | — |
type | long | — |
trackerNameТочное имя записи XRServer, не ResourceName и не числовой ID.
typeЧисловая категория long из XRServer.TrackerType, не объект tracker.
WorldOriginChangedСобытие
public static event Action WorldOriginChanged;Испускается при изменении преобразования начала координат мира.
XRServer.RotationMode
| Значение | Описание |
|---|---|
DontResetRotation = 2 | Не сбрасывает ориентацию HMD, центрируется только положение игрока. |
ResetButKeepTilt = 1 | Сбрасывает ориентацию, но сохраняет наклон устройства. Поэтому, если мы смотрим вниз, мы продолжаем смотреть вниз, но направление будет сброшено. |
ResetFullRotation = 0 | Полностью сбрасывает ориентацию HMD. Независимо от того, в какую сторону смотрит пользователь в реальном мире. В виртуальном мире пользователь будет смотреть вперед. |
XRServer.TrackerType
| Значение | Описание |
|---|---|
Anchor = 8 | Трекер отслеживает местоположение и размер AR-якоря. |
Any = 255 | Используется для выбора всех трекеров. |
AnyKnown = 127 | Используется для внутренней фильтрации трекеров любого известного типа. |
Basestation = 4 | Трекер отслеживает местоположение базовой станции. |
Body = 32 | Трекер отслеживает местоположение и суставы тела. |
Camera = 1 | Трекер отслеживает положение камеры XR (HMD, наружная камера, телефонная камера для телефонной связи). |
Controller = 2 | Трекер отслеживает местоположение контроллера. |
Face = 64 | Трекер отслеживает выражение лица. |
Hand = 16 | Трекер отслеживает местоположение и суставы руки. |
Head = 1 | Трекер отслеживает положение головы игрока. Обычно это точка по центру между его глазами. Обратите внимание, что для портативных устройств дополненной реальности это может быть текущее местоположение устройства. |
Unknown = 128 | Используется, если мы еще не установили тип трекера. |