สร้างจุดยึดด้วย ARCore สำหรับ Jetpack XR

อุปกรณ์ XR ที่รองรับ
คำแนะนำนี้จะช่วยคุณสร้างประสบการณ์การใช้งานสำหรับอุปกรณ์ XR ประเภทนี้
ชุดหูฟัง XR
แว่นตา XR แบบมีสาย

Anchor อธิบายตำแหน่งและทิศทางที่แน่นอนในโลกแห่งความเป็นจริง การแนบออบเจ็กต์กับ Anchor จะช่วยให้ออบเจ็กต์ดูเหมือนวางอยู่ในโลกจริงอย่างสมจริง

เข้าถึงเซสชัน

สร้าง Anchor ผ่าน ARCore สำหรับ Jetpack XR Session หากคุณกำลังปรับปรุง UI เชิงพื้นที่โดยใช้ Jetpack Compose สำหรับ XR โปรดเข้าถึงเซสชันจาก Jetpack Compose สำหรับ XR หากคุณกำลังทำงานกับเอนทิตีเชิงพื้นที่ จากไลบรารี SceneCore ของ Jetpack ให้เข้าถึงเซสชันจากรันไทม์ Jetpack XR

กำหนดค่าเซสชัน

การสร้างและโหลด Anchor ไม่จำเป็นต้องกำหนดค่าเซสชัน อย่างไรก็ตาม ระบบไม่ได้เปิดใช้การคงอยู่ของ Anchor โดยค่าเริ่มต้นในเซสชัน XR หากต้องการบันทึกและโหลด Anchor จากพื้นที่เก็บข้อมูลในเครื่อง ให้กำหนดค่าเซสชันและตั้งค่าโหมด AnchorPersistenceMode.LOCAL ดังนี้

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

ยึดเนื้อหาไว้กับตำแหน่งคงที่ในพื้นที่

ระบบจะสร้าง Anchor โดยใช้ Pose ซึ่งตีความได้โดยอิงกับ Anchorable ที่มีอยู่หรือไม่ก็ได้ Anchorable คือ Trackable ที่สามารถติด Anchor ได้

สร้าง Anchor ที่สัมพันธ์กับ Anchorable

เมื่อสร้าง Anchor ที่สัมพันธ์กับ Anchorable เช่น Plane ซึ่ง ทำให้ Anchor ติดตาม Anchorable ที่แนบมาเมื่อเคลื่อนที่ผ่านพื้นที่

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

สร้างสมอโดยไม่มี Anchorable

วิธีสร้างจุดยึดที่ไม่ได้แนบกับ Anchorable

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

แนบเอนทิตีกับสมอ

หากต้องการแสดงโมเดลในตำแหน่งนี้ ให้สร้าง GltfModel และตั้งค่า องค์ประกอบหลักเป็น AnchorEntity

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

ทำความเข้าใจ TrackingState

Trackable แต่ละรายการมี TrackingState ที่ควรตรวจสอบก่อนใช้งาน ระบบจะอัปเดต Pose ของ Trackable ที่มี TrackableState เป็น Tracking อย่างต่อเนื่อง Trackableที่Pausedอาจกลายเป็นTrackingในอนาคต แต่Stoppedจะไม่มีวันกลายเป็นTracking

คง Anchor ไว้ตลอดเซสชัน

Anchor ที่ไม่ได้บันทึกไว้จะหายไปหลังจากที่เซสชันถูกทำลาย การคงตำแหน่งของ Anchor จะช่วยให้แอปจดจำตำแหน่งของ Anchor นั้นในข้อมูลแอปส่วนตัวได้ คุณสามารถดึงข้อมูลสมอเรือนี้ในเซสชันต่อมาและยึดสมอเรือ ในตำแหน่งเดียวกันในโลก

หากต้องการบันทึกสมอ ให้ใช้ Anchor.persist() ดังที่แสดงที่นี่

val uuid = anchor.persist()

แอปของคุณสามารถดึงข้อมูล Anchor ได้โดยใช้ UUID ในเซสชันในอนาคต

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

หากไม่ต้องการสมออีกต่อไป ให้โทรหา unpersist() ซึ่งจะนำ Anchor ออกจากที่เก็บข้อมูลของแอปและทำให้ UUID ที่ระบุเรียกข้อมูลไม่ได้สำหรับการ เรียกใช้ Anchor.load()

Anchor.unpersist(session, uuid)

นอกจากนี้ แอปยังขอรายการ Anchor ทั้งหมดที่บันทึกไว้ซึ่งยังคงอยู่ในที่เก็บข้อมูลของแอปได้ด้วย โดยทำดังนี้

val uuids = Anchor.getPersistedAnchorUuids(session)