Adicionar um subespaço ao app

Um subspace é uma partição do espaço 3D no seu app em que você pode colocar modelos 3D, criar layouts 3D e adicionar profundidade ao conteúdo 2D. Um subspace é renderizado somente quando a espacialização está ativada. No espaço da casa ou em dispositivos que não são XR, qualquer código dentro desse subspace é ignorado.

É possível usar elementos combináveis de subespaço, como Volume e SpatialPanel, para colocar modelos 3D. Alguns componentes de XR, como Orbiter ou SpatialDialog, são elementos combináveis 2D padrão que podem ser usados em qualquer lugar na hierarquia da IU 2D, mas SubspaceComposables precisam ser invocados no subespaço do app. Para fazer isso, use o elemento combinável ApplicationSubspace ou o Subspace.

Como o nome sugere, o elemento combinável ApplicationSubspace precisa conter todo o conteúdo espacializado do app. O elemento combinável Subspace é ideal para aninhar uma partição de espaço 3D mais profundamente na hierarquia de interface existente do app.

Como com qualquer outro elemento combinável, é possível chamar Subspace diretamente na hierarquia da interface 2D. No entanto, é importante conhecer as implicações de onde você invoca o Subspace na hierarquia.

Sobre hierarquias de subespaço

O subespaço de nível superior é o mais externo invocado pelo app. Use o elemento combinável ApplicationSubspace para o subespaço de nível superior, mas, se você usar apenas o elemento combinável do subespaço no app, o elemento combinável Subspace mais externo será o subespaço de nível superior. Por padrão, esse subspace de nível superior é limitado pelo espaço recomendado para visualizar um app, e é normalmente onde você coloca o layout espacial do app e SpatialPanel. Se você precisar mudar os limites do subespaço de nível superior, transmita diferentes [VolumeConstraints][VolumeConstraints] para o ApplicationSubspace.

No entanto, se você aninhar outro subspace dentro de uma hierarquia de interface 2D em um painel contido no subspace de nível superior, esse subspace aninhado se comportará de maneira diferente.

Os subespaços aninhados têm duas diferenças importantes em relação ao Subspace de nível superior:

  • Eles participam do layout 2D em que são invocados. Isso significa que a altura e a largura do subespaço serão limitadas pela altura e largura do layout pai 2D.
  • Eles se comportam como filhos da entidade em que são invocados. Isso significa que, se você chamar um elemento combinável Subspace anidado em um SpatialPanel, esse subespaço será filho do SpatialPanel em que ele é chamado.

Esses comportamentos de subespaço aninhado permitem recursos como:

  • Mover a entidade filha com a entidade mãe
  • Como compensar o local da criança usando o deslocamento SubspaceModifier
  • Apresentar um objeto 3D que paira acima da interface 2D e corresponde à altura e largura do espaço apropriado no layout 2D

Adicionar um subespaço ao app

O exemplo de código abaixo mostra como adicionar subespaços aninhados e de nível superior ao app:

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)
    }
}