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

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

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

גישה לסשן

יוצרים עוגנים באמצעות Session של ARCore for Jetpack XR. אם אתם משפרים ממשק משתמש מרחבי באמצעות Jetpack Compose for XR, אתם צריכים לגשת לסשן מ-Jetpack Compose for XR. אם אתם עובדים עם ישויות מרחביות מספריית Jetpack SceneCore, תצטרכו לגשת לסשן מ-Jetpack XR Runtime.

הגדרת הסשן

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

val newConfig = Config.Builder(session.config)
    .setAnchorPersistence(AnchorPersistenceMode.LOCAL)
    .build()
when (val result = session.configure(newConfig)) {
    is SessionConfigureSuccess -> TODO(/* Success! */)
    else ->
        TODO(/* The session could not be configured. See SessionConfigureResult for possible causes. */)
}

הצמדת תוכן למיקום במרחב

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

יצירת עוגן ביחס לרכיב Anchorable

כשיוצרים עוגן ביחס ל-Anchorable, כמו Plane, העוגן עוקב אחרי Anchorable שאליו הוא מצורף כשהוא נע במרחב.

val anchor = plane.createAnchor(pose)

יצירת עוגן קבוע בעולם

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

val anchor = Anchor.create(session, pose)

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

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

AnchorSpace.create(session, anchor).apply {
    parent = session.scene.activitySpace
    addChild(entity)
}

הסבר על TrackingState

לכל Trackable יש TrackingState שצריך לבדוק לפני שמשתמשים בו. המערכת מעדכנת באופן פעיל Pose של Trackable עם TrackableState של Tracking. ‫Trackable עם הערך Paused עשוי להפוך בעתיד ל-Tracking, אבל אם הערך שלו הוא 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)