Dodawanie podprzestrzeni do aplikacji

Odpowiednie urządzenia XR
Te wskazówki pomogą Ci tworzyć treści na te urządzenia XR.
Gogle XR
Przewodowe okulary XR

Podprzestrzeń to część przestrzeni 3D w aplikacji, w której możesz umieszczać modele 3D, tworzyć układy 3D i dodawać głębię do treści 2D. Podprzestrzeń jest renderowana tylko wtedy, gdy włączona jest przestrzenność. W przestrzeni domowej lub na urządzeniach innych niż XR każdy kod w tej podprzestrzeni jest ignorowany.

Do tworzenia układu i umieszczania treści 2D w przestrzeni 3D możesz używać komponentów kompozycyjnych podprzestrzeni, takich jak SpatialPanel, SpatialRowSpatialColumn. Do umieszczania treści 3D używaj odpowiednich komponentów Subspace Composable, np. SceneCoreEntity w przypadku modeli 3D i SpatialExternalSurface w przypadku obrazów stereo. Niektóre komponenty XR, takie jak Orbiter lub SpatialDialog, są standardowymi komponentami 2D, których można używać w dowolnym miejscu w hierarchii interfejsu 2D, ale komponent SubspaceComposable musi być wywoływany w podprzestrzeni aplikacji. Aby to zrobić, użyj komponentu Subspace.

Hierarchie podprzestrzeni

Najwyższy poziom Subspace to najbardziej zewnętrzna podprzestrzeń wywoływana przez aplikację. Każde wywołanie Subspace tworzy nową, niezależną hierarchię interfejsu przestrzennego. Nie dziedziczy pozycji przestrzennej, orientacji ani skali żadnego elementu nadrzędnego, w którym jest zagnieżdżony.Subspace

Aby utworzyć umieszczony lub zagnieżdżony element Subspace w elemencie SpatialPanel, Orbiter, SpatialPopup lub innym komponencie, użyj PlanarEmbeddedSubspace.

PlanarEmbeddedSubspace różni się od Subspace 2 głównymi cechami:

  • Uczestniczą one w układzie 2D, w którym są wywoływane. Oznacza to, że wysokość i szerokość podprzestrzeni będą ograniczone przez wysokość i szerokość jej dwuwymiarowego układu nadrzędnego.
  • Zachowują się jak elementy podrzędne jednostki, w której są wywoływane. Oznacza to, że jeśli wywołasz przestrzeń podrzędną zagnieżdżoną w SpatialPanel, będzie ona podrzędna względem SpatialPanel, w której jest wywoływana.

Takie działanie PlanarEmbeddedSubspace umożliwia korzystanie z funkcji takich jak:

  • Przenoszenie dziecka wraz z podmiotem nadrzędnym
  • Kompensowanie lokalizacji dziecka za pomocą przesunięcia SubspaceModifier
  • Wyświetlanie obiektu 3D, który unosi się nad interfejsem 2D i ma wysokość oraz szerokość odpowiedniego obszaru w układzie 2D.

Dostosowywanie układów do podprzestrzeni

Na Androidzie XR układ aplikacji jest domyślnie powiązany z VolumeConstraints Subspace w trybie pełnej przestrzeni. Dlatego musisz wziąć pod uwagę ilość miejsca widocznego dla użytkownika i odpowiednio dostosować układ. recommendedContentBoxInFullSpace podaje konkretne wymiary ramki ograniczającej w ActivitySpace, dzięki czemu treści mogą być umieszczane w polu widzenia użytkownika.

Główne treści aplikacji powinny mieścić się w tym polu. Jeśli masz treści, które muszą wykraczać poza zalecane granice, rozważ układ, który zachęca użytkowników do eksplorowania przestrzeni poprzez poruszanie głową. Domyślne ograniczenie elementu recommendedContentBoxInFullSpace można zastąpić, stosując niestandardowy modyfikator oparty na rozmiarze, np. SubspaceModifier.requiredSizeIn. W przypadku nieograniczonego działania ustaw wartość allowUnboundedSubspace = true.

Wywołaj funkcję recommendedContentBoxInFullSpace, używając bieżącej sesji, aby w razie potrzeby uzyskać te konkretne wymiary. Przyjrzyj się temu przykładowi:

val session = LocalSession.current
session?.scene?.activitySpace?.recommendedContentBoxInFullSpace

Dodawanie podprzestrzeni do aplikacji

Poniższy przykład kodu pokazuje, jak dodać do aplikacji wywołania zwrotne SubspacePlanarEmbeddedSubspace:

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

Więcej informacji znajdziesz w pełnej dokumentacji referencyjnej dotyczącej SubspacePlanarEmbeddedSubspace.