Как добавить подпространство в приложение

Поддерживаемые XR-устройства
Это руководство поможет вам создавать контент для таких устройств.
XR-шлемы
Проводные XR-очки

Подпространство – это часть трехмерного пространства в приложении, где можно размещать 3D-модели, создавать 3D-макеты и добавлять глубину в 2D-контент. Подпространство отображается только при включенной пространственной обработке. На устройствах без поддержки XR и в главном пространстве любой код в этом подпространстве игнорируется.

Вы можете использовать композиции подпространства, такие как SpatialPanel, SpatialRow и SpatialColumn, чтобы создать макет и разместить 2D-контент в 3D-пространстве. Для размещения 3D-контента используйте подходящий компонент Subspace Composable, например SceneCoreEntity для 3D-моделей и SpatialExternalSurface для стереоскопических изображений. Некоторые компоненты XR, например Orbiter или SpatialDialog, представляют собой стандартные 2D-компоненты, которые можно использовать в любом месте иерархии 2D-интерфейса. Однако SubspaceComposable необходимо вызывать в подпространстве приложения. Для этого используйте функцию Subspace.

Об иерархиях подпространств

Subspace – это внешний подпространство, вызываемое приложением. Каждый вызов Subspace создает новую независимую иерархию пространственного интерфейса. Он не наследует пространственное положение, ориентацию или масштаб родительского объекта Subspace, в который вложен.

Чтобы создать встроенный или вложенный элемент Subspace в элементе SpatialPanel, Orbiter, SpatialPopup или другом компоненте, используйте PlanarEmbeddedSubspace.

PlanarEmbeddedSubspace отличается от Subspace двумя основными особенностями:

  • Они участвуют в двухмерной раскладке, в которой вызываются. Это означает, что высота и ширина подпространства будут ограничены высотой и шириной его родительского макета.
  • Они ведут себя как дочерние элементы объекта, в котором вызываются. Это означает, что если вы вызываете composable-функцию, вложенную в SpatialPanel, то эта composable-функция является дочерней по отношению к SpatialPanel, в котором она вызывается.

Такое поведение PlanarEmbeddedSubspace позволяет:

  • Перемещение дочернего объекта вместе с родительским объектом
  • Смещение местоположения ребенка с помощью параметра offset SubspaceModifier
  • Показ 3D-объекта, который находится над 2D-интерфейсом и соответствует высоте и ширине определенного пространства в 2D-макете.

Как адаптировать макеты для подпространства

В Android XR макет приложения по умолчанию привязан к VolumeConstraints Subspace в режиме полного пространства. Поэтому вам следует учитывать, сколько места доступно пользователю, и соответствующим образом корректировать макет. recommendedContentBoxInFullSpace содержит точные размеры граничной рамки внутри ActivitySpace, чтобы контент можно было разместить в зоне обзора пользователя.

Основной контент приложения должен помещаться в этом окне. Если вы хотите добавить контент, который выходит за рекомендуемые границы, создайте макет, который будет побуждать пользователей исследовать пространство, поворачивая голову. Ограничение по умолчанию для recommendedContentBoxInFullSpace можно переопределить, применив специальный модификатор на основе размера, например SubspaceModifier.requiredSizeIn. Для неограниченного поведения задайте значение allowUnboundedSubspace = true.

Вызовите recommendedContentBoxInFullSpace, используя текущий сеанс, чтобы получить эти специальные параметры. Вот пример:

val session = LocalSession.current
session?.scene?.activitySpace?.recommendedContentBoxInFullSpace

Как добавить подпространство в приложение

В приведенном ниже примере кода показано, как добавить в приложение Subspace и PlanarEmbeddedSubspace:

setContent {
    // This is a top-level subspace
    Subspace {
        SpatialPanel {
            MyComposable()
        }
    }
}

@Composable
private fun MyComposable() {
    Row {
        PrimaryPane()
        SecondaryPane()
    }
}

@Composable
private fun PrimaryPane() {
    // This is an embedded subspace, because PrimaryPane is in a SpatialPanel
    // and that SpatialPanel is in the top-level Subspace
    PlanarEmbeddedSubspace {
        SpatialPanel {}
    }
}

Подробную информацию о Subspace и PlanarEmbeddedSubspace можно найти в справочной документации.