Подпространство — это раздел 3D-пространства внутри вашего приложения, где вы можете размещать 3D-модели, создавать 3D-макеты и добавлять глубину к 2D-контенту. Подпространство визуализируется только тогда, когда включена пространственная обработка. В домашнем пространстве или на устройствах, отличных от XR, любой код в этом подпространстве игнорируется.
Для размещения 3D-моделей можно использовать составные элементы подпространства, такие как Volume
и SpatialPanel
. Некоторые компоненты XR, такие как Orbiter
или SpatialDialog
являются стандартными составными 2D-компонентами, которые можно использовать в любом месте иерархии 2D-интерфейса, но SubspaceComposable
необходимо вызывать в подпространстве вашего приложения. Для этого используйте составной объект ApplicationSubspace
или составной объект Subspace
.
Как следует из названия, составной элемент ApplicationSubspace
должен содержать весь пространственный контент вашего приложения. Компонуемый элемент Subspace
идеально подходит для более глубокого вложения раздела трехмерного пространства в существующую иерархию пользовательского интерфейса вашего приложения.
Как и в случае с любым другим компонентом, вы можете вызывать Subspace
непосредственно в иерархии 2D-интерфейса. Однако важно осознавать последствия того, в каком месте иерархии вы вызываете Subspace
.
Об иерархиях подпространств
Подпространство верхнего уровня — это самое внешнее подпространство, вызываемое вашим приложением. Используйте составной элемент ApplicationSubspace
для своего подпространства верхнего уровня, но если вы используете только составной элемент Subspace в своем приложении, самый внешний составной элемент Subspace
будет вашим подпространством верхнего уровня. По умолчанию это подпространство верхнего уровня ограничено рекомендуемым пространством для просмотра приложения, и обычно именно там вы размещаете пространственный макет вашего приложения и SpatialPanel
. Если вам нужно изменить границы подпространства верхнего уровня, передайте разные [ VolumeConstraints
][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) } }