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

Подпространство — это раздел 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)
    }
}