Подпространство — это раздел трёхмерного пространства в вашем приложении, где вы можете размещать 3D-модели, создавать 3D-макеты и добавлять глубину двумерному контенту. Подпространство отображается только при включенной пространственной визуализации. В Home Space или на устройствах без XR любой код в этом подпространстве игнорируется.
Вы можете использовать компонуемые подпространства, такие как SpatialPanel , SpatialRow и SpatialColumn для создания макета и размещения 2D-контента в 3D-пространстве. Для размещения 3D-контента используйте соответствующий компонуемый подпространство объект, например, SceneCoreEntity для 3D-моделей и SpatialExternalSurface для стереоизображений. Некоторые компоненты XR, такие как Orbiter или SpatialDialog являются стандартными компонуемыми 2D-объектами, которые можно использовать в любом месте иерархии 2D-интерфейса, но SubspaceComposable необходимо вызывать в подпространстве вашего приложения. Для этого используйте компонуемый подпространство Subspace .
О подпространственных иерархиях
Subspace верхнего уровня — это самое внешнее подпространство, вызываемое вашим приложением. Каждый вызов Subspace создаёт новую, независимую иерархию пространственного пользовательского интерфейса. Оно не наследует пространственное положение, ориентацию или масштаб какого-либо родительского Subspace в которое оно вложено.
Чтобы создать встроенное или вложенное Subspace внутри SpatialPanel , Orbiter , SpatialPopup или другого компонента, используйте PlanarEmbeddedSubspace .
PlanarEmbeddedSubspace имеет два ключевых отличия от Subspace :
- Они участвуют в 2D-макете, в котором они вызываются. Это означает, что высота и ширина подпространства будут ограничены высотой и шириной его родительского 2D-макета.
- Они ведут себя как дочерние элементы сущности, в которой они вызываются. Это означает, что если вы вызываете подпространство, вложенное в
SpatialPanel, то это подпространство является дочерним элементомSpatialPanelв котором оно вызывается.
Такое поведение PlanarEmbeddedSubspace обеспечивает такие возможности, как:
- Перемещение дочернего объекта вместе с родительской сущностью
- Смещение местоположения дочернего элемента с помощью
SubspaceModifierсмещения - Представление 3D-объекта, который парит над вашим 2D-интерфейсом и соответствует высоте и ширине соответствующего пространства в 2D-макете.
Адаптируйте макеты для подпространства
В Android XR макет вашего приложения по умолчанию привязан к VolumeConstraints объёма Subspace в режиме Full Space. Поэтому следует учитывать объём видимого пространства, доступного пользователю, и соответствующим образом корректировать макет. 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 .