OpenXRPlaneTracker
Плоскость с локальной геометрией и кешированными формами.
Данные плоскости: BoundsSize, semantic label/alignment и, при наличии, polygon mesh. GetMesh/GetShape создают кеши, но сами не добавляют визуальные Entity или collision. Геометрия в XY; применяйте GetMeshOffset к общему дочернему Entity3D и не добавляйте безусловный поворот пола.
MeshChanged подходит для обновления mesh/shape, но origin-only SetMeshData не испускает его: читайте offset каждый кадр при валидном tracking. GetShape повторно с иной толщиной возвращает старую кешированную форму. Пустые indices означают fan, а не универсальную триангуляцию вогнутого контура.
Рабочий пример и настройка. Проверены synthetic metadata и клиентская логика в Windows headless XR-off: 23 API случая и ранее 20 проверок helper. Реальное обнаружение, entity/context RID, persistence, шлем и изображение не проверены. Provider-owned tracker/pose/кешированные обёртки не освобождайте; собственный новый tracker допускает Dispose после завершения использования.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы1
OpenXRPlaneTrackerКонструктор
public OpenXRPlaneTracker();Создаёт принадлежащий вызывающему RefCounted tracker без запуска OpenXR, регистрации в XRServer или обнаружения. Базовое состояние Paused, категория Anchor; Entity/context RID пусты. Для реального приложения обычно используйте заимствованный tracker, зарегистрированный provider, а не synthetic ресурс. Собственный экземпляр освобождайте после удаления своих ссылок/регистрации.
Свойства3
BoundsSizeСвойство
public Vector2 BoundsSize { get; set; }Размер прямоугольной границы в локальной XY-плоскости, изначально Vector2.Zero. Setter применяет изменение, только если разница хотя бы одной компоненты >0.001. Без polygon data сбрасывает кеши и испускает MeshChanged; при polygon data граница не заменяет mesh. Положительные обе компоненты нужны для прямоугольного fallback.
PlaneAlignmentСвойство
public OpenXRSpatialComponentPlaneAlignmentList.PlaneAlignment PlaneAlignment { get; set; }Metadata ориентации плоскости, по умолчанию HorizontalUpward даже без данных детектора. Setter сохраняет значение без геометрического поворота и без MeshChanged. Не выводите из этого значения наличие пола, tracking или реальную классификацию runtime.
PlaneLabelСвойство
public string PlaneLabel { get; set; }Семантическая метка плоскости либо пустая строка при отсутствии данных. Setter также копирует строку в Description трекера; не перестраивает mesh/shape и не испускает MeshChanged. Не считайте пустую/незнакомую метку полом; поддержка меток зависит от runtime.
Методы14
ClearMeshDatavoid
public void ClearMeshData();Сбрасывает polygon vertices/indices, origin и кеши mesh/shape, сохраняя BoundsSize. Поэтому следующий GetMesh/GetShape может вернуть прямоугольный fallback, а не null. MeshChanged испускается только если polygon data действительно были; после явного сброса обновите свои mesh/collider независимо от события.
GetBoundsSizeVector2
public Vector2 GetBoundsSize();Размер прямоугольной границы в локальной XY-плоскости, изначально Vector2.Zero. Setter применяет изменение, только если разница хотя бы одной компоненты >0.001. Без polygon data сбрасывает кеши и испускает MeshChanged; при polygon data граница не заменяет mesh. Положительные обе компоненты нужны для прямоугольного fallback.
Vector2Размер прямоугольной границы в локальной XY-плоскости, изначально Vector2.Zero. Setter применяет изменение, только если разница хотя бы одной компоненты >0.001. Без polygon data сбрасывает кеши и испускает MeshChanged; при polygon data граница не заменяет mesh. Положительные обе компоненты нужны для прямоугольного fallback.
GetIndicesint[]
public int[] GetIndices();Сохранённые triangle indices либо пустой массив. После SetMeshData без indices содержит сгенерированный fan, не исходный контур; прямоугольный fallback список не заполняет. C# int[] — данные для чтения/копирования, не редактирование tracker на месте.
int[]Сохранённые triangle indices либо пустой массив. После SetMeshData без indices содержит сгенерированный fan, не исходный контур; прямоугольный fallback список не заполняет. C# int[] — данные для чтения/копирования, не редактирование tracker на месте.
GetMeshMesh
public Mesh GetMesh();Лениво создаёт и кеширует mesh из polygon data или положительных BoundsSize; при отсутствии обоих null. Геометрия в локальной XY, не world space; отдельно примените GetMeshOffset. Возвращённая обёртка заимствованная: не Dispose. MeshChanged требует обновить собственный MeshInstance3D.Mesh; setter tracker не обновит вашу Entity автоматически.
MeshЛениво создаёт и кеширует mesh из polygon data или положительных BoundsSize; при отсутствии обоих null. Геометрия в локальной XY, не world space; отдельно примените GetMeshOffset. Возвращённая обёртка заимствованная: не Dispose. MeshChanged требует обновить собственный MeshInstance3D.Mesh; setter tracker не обновит вашу Entity автоматически.
GetMeshOffsetTransform3D
public Transform3D GetMeshOffset();Transform геометрии относительно default pose: для polygon data inverse(raw pose) × mesh origin, затем translation умножается на WorldScale. Без polygon data — Identity. Применяйте к общему дочернему Entity3D для mesh/collider. Origin-only обновление может не дать MeshChanged: читайте offset каждый кадр при валидном tracking. Проверка ограничена WorldScale=1.
Transform3DTransform геометрии относительно default pose: для polygon data inverse(raw pose) × mesh origin, затем translation умножается на WorldScale. Без polygon data — Identity. Применяйте к общему дочернему Entity3D для mesh/collider. Origin-only обновление может не дать MeshChanged: читайте offset каждый кадр при валидном tracking. Проверка ограничена WorldScale=1.
GetPlaneAlignmentOpenXRSpatialComponentPlaneAlignmentList.PlaneAlignment
public OpenXRSpatialComponentPlaneAlignmentList.PlaneAlignment GetPlaneAlignment();Metadata ориентации плоскости, по умолчанию HorizontalUpward даже без данных детектора. Setter сохраняет значение без геометрического поворота и без MeshChanged. Не выводите из этого значения наличие пола, tracking или реальную классификацию runtime.
OpenXRSpatialComponentPlaneAlignmentList.PlaneAlignmentMetadata ориентации плоскости, по умолчанию HorizontalUpward даже без данных детектора. Setter сохраняет значение без геометрического поворота и без MeshChanged. Не выводите из этого значения наличие пола, tracking или реальную классификацию runtime.
GetPlaneLabelstring
public string GetPlaneLabel();Семантическая метка плоскости либо пустая строка при отсутствии данных. Setter также копирует строку в Description трекера; не перестраивает mesh/shape и не испускает MeshChanged. Не считайте пустую/незнакомую метку полом; поддержка меток зависит от runtime.
stringСемантическая метка плоскости либо пустая строка при отсутствии данных. Setter также копирует строку в Description трекера; не перестраивает mesh/shape и не испускает MeshChanged. Не считайте пустую/незнакомую метку полом; поддержка меток зависит от runtime.
GetShapeShape3D
public Shape3D GetShape(float thickness = 0.01f);Лениво создаёт и кеширует Shape3D: polygon data дают ConcavePolygonShape3D, положительные BoundsSize — BoxShape3D; иначе null. Заимствованная обёртка, не Dispose. thickness по умолчанию 0.01, задавайте положительное конечное значение. Если shape уже кеширована, другая thickness не перестраивает её; очистите/обновите данные или создайте собственную форму. Сам getter не включает collision.
| Имя | Тип | По умолчанию |
|---|---|---|
thickness | float | 0.01f |
thicknessПоложительная конечная толщина; default 0.01. Уже кешированная shape игнорирует новое значение.
Shape3DЛениво создаёт и кеширует Shape3D: polygon data дают ConcavePolygonShape3D, положительные BoundsSize — BoxShape3D; иначе null. Заимствованная обёртка, не Dispose. thickness по умолчанию 0.01, задавайте положительное конечное значение. Если shape уже кеширована, другая thickness не перестраивает её; очистите/обновите данные или создайте собственную форму. Сам getter не включает collision.
GetVerticesVector2[]
public Vector2[] GetVertices();Сохранённые polygon vertices в локальной XY, либо пустой массив; прямоугольный fallback не заполняет этот список. C# getter возвращает Vector2[]-копию: её изменение не редактирует tracker. Для обновления используйте SetMeshData.
Vector2[]Сохранённые polygon vertices в локальной XY, либо пустой массив; прямоугольный fallback не заполняет этот список. C# getter возвращает Vector2[]-копию: её изменение не редактирует tracker. Для обновления используйте SetMeshData.
SetBoundsSizevoid
public void SetBoundsSize(Vector2 boundsSize);Размер прямоугольной границы в локальной XY-плоскости, изначально Vector2.Zero. Setter применяет изменение, только если разница хотя бы одной компоненты >0.001. Без polygon data сбрасывает кеши и испускает MeshChanged; при polygon data граница не заменяет mesh. Положительные обе компоненты нужны для прямоугольного fallback.
| Имя | Тип | По умолчанию |
|---|---|---|
boundsSize | Vector2 | — |
boundsSizeРазмер прямоугольной границы в локальной XY-плоскости, изначально Vector2.Zero. Setter применяет изменение, только если разница хотя бы одной компоненты >0.001. Без polygon data сбрасывает кеши и испускает MeshChanged; при polygon data граница не заменяет mesh. Положительные обе компоненты нужны для прямоугольного fallback.
SetMeshData2 перегрузки
public void SetMeshData(Transform3D origin, Vector2[] vertices, int[] indices = null);Назначает локальные XY vertices, transform их origin и triangle indices. Нужны >=3 vertices; меньшее число очищает имеющиеся polygon data. Пустые indices дают fan от вершины 0, поэтому для вогнутого контура передавайте собственную корректную триангуляцию. Проверяйте индексы и кратность трём самостоятельно. Изменение геометрии сбрасывает mesh/shape и испускает MeshChanged; только новый origin при прежних массивах события не даёт.
| Имя | Тип | По умолчанию |
|---|---|---|
origin | Transform3D | — |
vertices | Vector2[] | — |
indices | int[] | null |
originTransform polygon data в пространстве tracking; не подставляйте global transform без преобразования. Изменение только origin может не испустить MeshChanged.
verticesМинимум три локальные XY вершины. Для concave polygon передайте готовые triangle indices.
indicesИндексы треугольников: число кратно трём, все в пределах vertices. Пустой массив включает fan от вершины 0.
public void SetMeshData(Transform3D origin, ReadOnlySpan<Vector2> vertices, ReadOnlySpan<int> indices);Назначает локальные XY vertices, transform их origin и triangle indices. Нужны >=3 vertices; меньшее число очищает имеющиеся polygon data. Пустые indices дают fan от вершины 0, поэтому для вогнутого контура передавайте собственную корректную триангуляцию. Проверяйте индексы и кратность трём самостоятельно. Изменение геометрии сбрасывает mesh/shape и испускает MeshChanged; только новый origin при прежних массивах события не даёт.
| Имя | Тип | По умолчанию |
|---|---|---|
origin | Transform3D | — |
vertices | ReadOnlySpan<Vector2> | — |
indices | ReadOnlySpan<int> | — |
originTransform polygon data в пространстве tracking; не подставляйте global transform без преобразования. Изменение только origin может не испустить MeshChanged.
verticesМинимум три локальные XY вершины. Для concave polygon передайте готовые triangle indices.
indicesИндексы треугольников: число кратно трём, все в пределах vertices. Пустой массив включает fan от вершины 0.
SetPlaneAlignmentvoid
public void SetPlaneAlignment(OpenXRSpatialComponentPlaneAlignmentList.PlaneAlignment planeAlignment);Metadata ориентации плоскости, по умолчанию HorizontalUpward даже без данных детектора. Setter сохраняет значение без геометрического поворота и без MeshChanged. Не выводите из этого значения наличие пола, tracking или реальную классификацию runtime.
| Имя | Тип | По умолчанию |
|---|---|---|
planeAlignment | OpenXRSpatialComponentPlaneAlignmentList.PlaneAlignment | — |
planeAlignmentMetadata ориентации плоскости, по умолчанию HorizontalUpward даже без данных детектора. Setter сохраняет значение без геометрического поворота и без MeshChanged. Не выводите из этого значения наличие пола, tracking или реальную классификацию runtime.
SetPlaneLabelvoid
public void SetPlaneLabel(string planeLabel);Семантическая метка плоскости либо пустая строка при отсутствии данных. Setter также копирует строку в Description трекера; не перестраивает mesh/shape и не испускает MeshChanged. Не считайте пустую/незнакомую метку полом; поддержка меток зависит от runtime.
| Имя | Тип | По умолчанию |
|---|---|---|
planeLabel | string | — |
planeLabelСемантическая метка плоскости либо пустая строка при отсутствии данных. Setter также копирует строку в Description трекера; не перестраивает mesh/shape и не испускает MeshChanged. Не считайте пустую/незнакомую метку полом; поддержка меток зависит от runtime.
Сигналы и события1
MeshChangedСобытие
public event Action MeshChanged;Сигнал изменения геометрии/части кешей; заново назначьте mesh/shape своим визуальным и физическим Entity. Не сообщает обо всех metadata и origin-only изменениях. GetMeshOffset обновляйте отдельно при валидном tracking; не предполагайте один сигнал на каждую операцию.