Подпространство — это раздел 3D-пространства в вашем приложении, где вы можете размещать 3D-модели, строить 3D-макеты и добавлять глубину к 2D-контенту. Подпространство отображается только при включенной пространственной ориентации. В Home Space или на устройствах без XR любой код в этом подпространстве игнорируется.
Вы можете использовать подпространственные компоновочные элементы, такие как Volume
и SpatialPanel
для размещения 3D-моделей. Некоторые компоненты XR, такие как Orbiter
или SpatialDialog
являются стандартными 2D-компоновочными элементами, которые можно использовать в любом месте иерархии 2D-UI, но SubspaceComposable
должны вызываться в подпространстве вашего приложения. Для этого используйте либо ApplicationSubspace
composable, либо Subspace
composable.
Как следует из названия, ApplicationSubspace
composable должен содержать весь пространственный контент вашего приложения. Subspace
composable идеально подходит для вложения раздела 3D-пространства глубже в существующую иерархию пользовательского интерфейса вашего приложения.
Как и в случае с любым другим компонуемым объектом, вы можете вызвать Subspace
напрямую в иерархии 2D UI. Однако важно осознавать последствия того, где в иерархии вы вызываете Subspace
.
О подпространственных иерархиях
Подпространство верхнего уровня — это самое внешнее подпространство, вызываемое вашим приложением. Используйте ApplicationSubspace
composable для вашего подпространства верхнего уровня, но если вы используете только Subspace composable в своем приложении, то самым внешним Subspace
composable будет ваше подпространство верхнего уровня. По умолчанию это подпространство верхнего уровня ограничено рекомендуемым пространством для просмотра приложения, и обычно именно там вы размещаете пространственный макет вашего приложения и SpatialPanel
. Если вам нужно изменить границы подпространства верхнего уровня, передайте различные VolumeConstraints
в ваше ApplicationSubspace
.
Однако если вы вкладываете другое подпространство внутрь иерархии 2D-пользовательского интерфейса в панель, содержащуюся в подпространстве верхнего уровня, то это вложенное подпространство ведет себя по-другому.
Вложенные подпространства имеют два ключевых отличия от Subspace
верхнего уровня:
- Они участвуют в 2D-макете, в котором они вызываются. Это означает, что высота и ширина подпространства будут ограничены высотой и шириной его 2D-родительского макета.
- Они ведут себя как дочерние элементы сущности, в которой они вызываются. Это означает, что если вы вызываете составное
Subspace
, вложенное вSpatialPanel
, то это подпространство является дочерним элементомSpatialPanel
, в котором оно вызывается.
Такое поведение вложенного подпространства обеспечивает такие возможности, как:
- Перемещение дочернего объекта с родительской сущностью
- Смещение местоположения дочернего элемента с помощью смещения
SubspaceModifier
- Представление 3D-объекта, который парит над вашим 2D-интерфейсом и соответствует высоте и ширине соответствующего пространства в 2D-макете.
Добавьте подпространство в свое приложение
В следующем примере кода показано, как добавить в приложение подпространства верхнего уровня и вложенные подпространства:
setContent { // This is a top-level subspace ApplicationSubspace { SpatialPanel { MyComposable() } } }
@Composable private fun MyComposable() { Row { PrimaryPane() SecondaryPane() } } @Composable private fun PrimaryPane() { // This is a nested subspace, because PrimaryPane is in a SpatialPanel // and that SpatialPanel is in a top-level Subspace Subspace { ObjectInAVolume(true) } }