Eine Standard-Subspace bleibt an einer festen Position, die vom System bestimmt wird. Manchmal möchten Sie aber, dass sich die räumliche Benutzeroberfläche Ihrer App dynamisch mit dem Nutzer bewegt oder an einem bestimmten Ort in der Umgebung oder in der realen Welt bleibt. Sie können ein FollowTarget an den Parameter follow von Subspace übergeben, um Erlebnisse wie am Kopf fixierte HUDs oder Informationsbereiche zu erstellen, die an realen Objekten angebracht sind.
Unterbereich hinzufügen, der der Ansicht des Nutzers folgt
Wenn Sie einen Unterbereich hinzufügen möchten, der relativ zum Sichtfeld des Nutzers positioniert ist, verwenden Sie FollowTarget.view. Je nach angegebenem Verfolgungsmodus kannst du so die Kopfbewegungen des Nutzers kontinuierlich verfolgen oder Inhalte statisch platzieren, je nachdem, wohin er blickt. Sie können diese für Heads-up-Displays (HUDs), dauerhafte Benachrichtigungen oder Schnellaktionen verwenden.
Berechtigungen deklarieren und anfordern
Bevor du Berechtigungen anforderst, musst du sie in der Manifestdatei deiner App mit dem Element <uses-permission> deklarieren.
<manifest ...>
<!-- Only declare permissions that your app actually needs. In this example,
we declare permissions for head tracking. -->
<uses-permission android:name="android.permission.HEAD_TRACKING"/>
<application ...>
...
</application>
</manifest>
Fordern Sie jetzt die Berechtigungen an. Weitere Informationen findest du in den Prinzipien und Workflows für Berechtigungen. So kannst du deinen Nutzern die bestmögliche Erfahrung bieten, indem du beispielsweise prüfst, ob der Nutzer die von deiner App benötigten Laufzeitberechtigungen bereits erteilt hat und ob deine App dem Nutzer eine Begründung anzeigen sollte, bevor diese Berechtigung angefordert wird.
Sitzung konfigurieren
Als Nächstes konfigurieren Sie die Sitzung Ihrer App, die bei der Verwendung von Jetpack Compose for XR für Sie erstellt wird, indem Sie DeviceTrackingMode.SPATIAL festlegen:
val session = checkNotNull(LocalSession.current)
session.configure(
config = Config.Builder(session.config).setDeviceTracking(DeviceTrackingMode.SPATIAL)
.build()
)
Untergeordneten Space erstellen
Schließlich erstellen Sie einen Unterbereich, der auf die Ansicht des Nutzers ausgerichtet ist, zusammen mit einem Folgemodus:
// Example: A subspace that softly follows the user's view (like a HUD)
Subspace(
follow = FollowTarget.view(
// Customizing the soft follow to move slightly faster and tracking all dimensions
mode = FollowMode.soft(
)
),
modifier = modifier,
) {
SpatialPanel {
// SpatialPanel Content
}
}
Folgemodi für Unterbereiche, die auf die Ansicht eines Nutzers ausgerichtet sind
Wenn Sie FollowTarget.view als Ziel verwenden, können Sie das Verhalten des Inhalts anpassen, indem Sie einen FollowMode angeben:
FollowMode.soft: Der Inhalt folgt den Bewegungen des Ziels nach und nach, wodurch ein flüssiger Schwebeeffekt entsteht.FollowMode.snap: Der Inhalt wird einmal basierend auf der ursprünglichen Ansichtspose vor dem Nutzer platziert und bleibt danach stationär.FollowMode.tight: Der Inhalt folgt dem Blick des Nutzers sofort mit minimaler Verzögerung, sodass der Inhalt eng mit seiner Bewegung verbunden bleibt.
Bei allen Verfolgungsmodi können Sie aus den folgenden Optionen auswählen, welche Bewegungsdimensionen verfolgt werden:
- X-Achse
- Y-Achse
- Pitchen
- Rolle
- Gieren
RotationOnly: Hiermit können Sie einen einzelnen Wert angeben, um die Dimensionen zu verfolgen, die sich auf die Drehung beziehen (Neigung, Gieren und Rollen).
Sie können eine beliebige Kombination dieser Dimensionen auswählen oder den Standardwert TrackedDimensions.All verwenden, mit dem alle Dimensionen erfasst werden.
Teilbereich hinzufügen, der einem Umgebungselement folgt
Wenn Sie einen Unterbereich hinzufügen möchten, der die räumlichen Inhalte strikt an ein physisches Merkmal in der Umgebung des Nutzers bindet, verwenden Sie FollowTarget.anchor(). Verwenden Sie diesen Zieltyp, um einer erkannten Ebene, einem Anker oder einem geografischen Standort zu folgen.
Für das Tracking von realen Elementen sind je nach Element, das Sie verfolgen, zusätzliche Berechtigungen und Sitzungskonfigurationen erforderlich.
Eine detaillierte Anleitung zur Verwendung von Wahrnehmungsfunktionen für ARCore-Funktionen sowie zum Einrichten der erforderlichen Berechtigungen und zum Konfigurieren Ihrer Sitzung für die Verwendung von FollowTarget.anchor() finden Sie in der Jetpack XR SDK-Dokumentation für Ebenen, Anker und Geospatial-Positionen.
Im folgenden Beispiel wird ein Unterbereich erstellt, der einem realen Anker folgt:
// A subspace locked to a real-world anchor
Subspace(
follow = FollowTarget.anchor(anchor = myAnchor)
) {
// Rotate the panel to ensure it faces the user while remaining anchored
SpatialPanel(SubspaceModifier.rotateToLookAtUser()) {
// SpatialPanel Content
}
}
Räumliche Überschneidungen vermeiden
Jeder von Ihnen erstellte Subspace verwaltet seine eigene unabhängige 3D-Szene und hat keine Kenntnis von anderen vorhandenen Unterbereichen. Daher werden Kollisionen nicht automatisch vermieden.
Damit das am Kopf fixierte HUD nicht durch die verankerten POI-Bereiche hindurchragt (Z-Fighting), sollten Sie die Layoutvolumen mit den folgenden Methoden explizit verwalten:
- Offsets verwenden: Mit
SubspaceModifier.offsetkannst du periphere UI-Elemente (z. B. dein HUD) auf der Z-Achse näher heran- oder weiter wegschieben oder sie an den Rand des Sichtfelds des Nutzers verschieben. - Größen einschränken: Verwenden Sie Modifikatoren wie
requiredSizeIn, um die Begrenzungsrahmen Ihrer Bereiche einzuschränken.
Weitere Informationen zu Koordinatenräumen, Layoutbeschränkungen und allen verfügbaren Tracking-Konfigurationen finden Sie in der Referenzdokumentation zu Subspace.