יצירת עוגנים באמצעות ARCore ל-Jetpack XR

נקודת עיגון מתארת מיקום ומיקוד קבועים בעולם האמיתי. הצמדת אובייקט ל-anchor עוזרת לאובייקטים להיראות ממוקמים באופן ריאליסטי בעולם האמיתי.

יצירת סשן של ARCore ל-Jetpack XR

יצירת עוגנים באמצעות סשן של ARCore for Jetpack XR. במאמר הסבר על מחזור החיים של סשן מוסבר איך לקבל את הערך Session.

הגדרת הסשן

כדי ליצור עוגנים ולטעון אותם, אין צורך להגדיר את הסשן. עם זאת, התכונה 'עקביות של עוגנים' לא מופעלת כברירת מחדל בסשנים של XR. כדי לשמור ולטעון עוגנים, מגדירים את הסשן:

val newConfig = session.config.copy(
    anchorPersistence = Config.AnchorPersistenceMode.Enabled,
)
when (val result = session.configure(newConfig)) {
    is SessionConfigureConfigurationNotSupported ->
        TODO(/* Some combinations of configurations are not valid. Handle this failure case. */)
    is SessionConfigurePermissionsNotGranted ->
        TODO(/* The required permissions in result.permissions have not been granted. */)
    is SessionConfigureSuccess -> TODO(/* Success! */)
}

עיגון תוכן במיקום קבוע במרחב המשותף

עוגן נוצר באמצעות Pose, שאפשר לפרש ביחס ל-Trackable קיים או לא.

יצירת עוגן ביחס לפריט שניתן למעקב

כשיצירת הצמדה יחסית ל-Trackable, כמו Plane, כך שהצמדה עוקבת אחרי ה-Trackable המצורף כשהוא זז במרחב.

when (val result = trackable.createAnchor(pose)) {
    is AnchorCreateSuccess -> { /* anchor stored in `result.anchor`. */ }
    else -> { /* handle failure */ }
}

יצירת עוגן ללא פריט שניתן למעקב

כדי ליצור עוגן שלא מחובר ל-Trackable:

when (val result = Anchor.create(session, pose)) {
    is AnchorCreateSuccess -> { /* anchor stored in `result.anchor`. */ }
    else -> { /* handle failure */ }
}

צירוף ישות לעוגן

כדי ליצור עיבוד (render) של מודל במיקום הזה, יוצרים GltfModel ומגדירים את ההורה שלו כ-AnchorEntity.

AnchorEntity.create(session, anchor).apply {
    setParent(session.scene.activitySpace)
    addChild(entity)
}

הסבר על TrackingState

לכל Trackable יש TrackingState שצריך לבדוק לפני שמשתמשים בו. אם ל-Trackable יש TrackableState של Tracking, המערכת מעדכנת את Pose שלו באופן פעיל. Trackable שהערך שלו הוא Paused עשוי להפוך ל-Tracking בעתיד, אבל Trackable שהערך שלו הוא Stopped לעולם לא יהפוך ל-Tracking.

שמירה של ציר לאורך הסשנים

עוגן שלא נשמר נעלם אחרי שהסשן נהרס. שמירת עוגן מאפשרת לאפליקציה לזכור את המיקום של העוגן בנתוני האפליקציה הפרטיים שלה. אפשר לאחזר את העוגן הזה בסשן מאוחר יותר, והוא מקובע באותו מיקום בעולם.

כדי לשמור את הצמד, משתמשים ב-anchor.persist() כפי שמוצג כאן:

val uuid = anchor.persist()

האפליקציה יכולה לאחזר את הצמד באמצעות UUID בסשן עתידי:

when (val result = Anchor.load(session, uuid)) {
    is AnchorCreateSuccess -> {
        // Loading was successful. The anchor is stored in result.anchor.
    }
    else -> {
        // handle failure
    }
}

כשלא צריכים יותר את העוגן, צריך להתקשר למספר unpersist(). הפעולה הזו מסירה את הצ'אנק מהאחסון של האפליקציה, ואי אפשר לאחזר את ה-UUID הזה בקריאות ל-Anchor.load().

Anchor.unpersist(session, uuid)

האפליקציה יכולה גם לבקש רשימה של כל עוגנים שנשמרו ועדיין נמצאים באחסון של האפליקציה:

val uuids = Anchor.getPersistedAnchorUuids(session)