Tạo neo bằng ARCore cho Jetpack XR

Các thiết bị XR được hỗ trợ
Hướng dẫn này giúp bạn xây dựng các trải nghiệm cho những loại thiết bị XR sau.
Thiết bị đeo đầu XR
Kính thông minh XR có dây

Anchor mô tả vị trí và hướng cố định trong thế giới thực. Việc gắn một đối tượng vào một neo giúp các đối tượng xuất hiện một cách chân thực trong thế giới thực.

Truy cập vào một phiên

Tạo neo thông qua ARCore cho Jetpack XR Session. Nếu bạn đang cải tiến giao diện người dùng không gian bằng Jetpack Compose cho XR, hãy truy cập vào một phiên từ Jetpack Compose cho XR. Nếu bạn đang làm việc với các thực thể được không gian hoá từ thư viện Jetpack SceneCore, hãy truy cập vào một phiên từ Thời gian chạy Jetpack XR.

Định cấu hình phiên

Việc tạo và tải neo không yêu cầu phải định cấu hình phiên. Tuy nhiên, tính năng duy trì neo không được bật theo mặc định trên các phiên XR. Để duy trì và tải neo từ bộ nhớ cục bộ, hãy định cấu hình phiên và đặt chế độ 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. */)
}

Neo nội dung vào một vị trí cố định trong không gian

Neo được tạo bằng Pose, có thể được diễn giải tương đối so với Anchorable hiện có hoặc không. Một Anchorable là một Trackable có thể gắn neo vào.

Tạo một neo tương đối so với Anchorable

Khi một neo được tạo tương đối so với một Anchorable, chẳng hạn như Plane, neo sẽ theo dõi Anchorable được gắn khi di chuyển trong không gian.

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

Tạo một neo mà không có Anchorable

Cách tạo một neo không được gắn vào một Anchorable:

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

Gắn một thực thể vào một neo

Để hiển thị một mô hình tại vị trí này, hãy tạo một GltfModel và đặt mô hình mẹ thành một AnchorEntity.

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

Tìm hiểu về TrackingState

Mỗi Trackable đều có một TrackingState mà bạn nên kiểm tra trước khi sử dụng. Một TrackableTrackableStateTrackingPose được hệ thống cập nhật liên tục. TrackablePaused có thể trở thành Tracking trong tương lai, trong khi Stopped sẽ không bao giờ trở thành Tracking.

Duy trì một Neo trong suốt các phiên

Một neo không được duy trì sẽ biến mất sau khi một phiên bị huỷ. Bằng cách duy trì một neo, ứng dụng của bạn sẽ ghi nhớ vị trí của neo đó trong dữ liệu ứng dụng riêng tư. Bạn có thể truy xuất neo này trong một phiên tiếp theo và được neo ở cùng một vị trí trên thế giới.

Để duy trì một neo, hãy sử dụng Anchor.persist() như minh hoạ bên dưới:

val uuid = anchor.persist()

Ứng dụng của bạn có thể truy xuất neo bằng cách sử dụng UUID trong một phiên trong tương lai:

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

Khi không cần neo nữa, hãy gọi unpersist(). Thao tác này sẽ xoá neo khỏi bộ nhớ của ứng dụng và khiến mã nhận dạng duy nhất (UUID) đã cho không thể truy xuất được đối với các lệnh gọi đến Anchor.load().

Anchor.unpersist(session, uuid)

Ứng dụng của bạn cũng có thể yêu cầu một danh sách tất cả các neo đã được duy trì vẫn còn trong bộ nhớ của ứng dụng:

val uuids = Anchor.getPersistedAnchorUuids(session)