Criar âncoras com o ARCore para o Jetpack XR

Dispositivos XR relevantes
Estas orientações ajudam você a criar experiências para esses tipos de dispositivos XR.
Headsets XR
Óculos XR com fio

Uma âncora descreve um local e uma orientação no mundo real. Anexar um objeto a uma âncora ajuda os objetos a aparecerem de forma realista no mundo real e ajuda seu app a economizar energia, já que não precisa executar a lógica a cada frame.

Acessar uma sessão

Crie âncoras usando um ARCore para Jetpack XR Session. Se você estiver aprimorando a interface espacial usando o Jetpack Compose para XR, acesse uma sessão do Jetpack Compose para XR. Se você estiver trabalhando com entidades espacializadas da biblioteca Jetpack SceneCore, acesse uma sessão do Jetpack XR Runtime.

Configurar a sessão

A criação e o carregamento de âncoras não exigem que a sessão seja configurada. No entanto, a persistência de âncoras não é ativada por padrão em sessões XR. Para persistir e carregar âncoras do armazenamento local, configure a sessão e defina o AnchorPersistenceMode.LOCAL modo:

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. */)
}

Conteúdo da âncora em um local no espaço

Uma âncora é criada usando um Pose, que pode ser interpretada em relação a um Anchorable existente ou fixada no mundo. Um Anchorable é um Trackable que pode ter âncoras anexadas a ele.

Criar uma âncora relativa a um Anchorable

Quando uma âncora é criada em relação a um Anchorable, como um Plane, isso faz com que a âncora siga o Anchorable anexado quando ele se move pelo espaço.

val anchor = plane.createAnchor(pose)

Criar uma âncora fixa no mundo

Para criar uma âncora fixa no mundo, não a anexe a um Anchorable. Use esse tipo de âncora apenas para pontos que estão flutuando no espaço, porque a estimativa da sessão de onde os objetos imóveis estão muda com o tempo:

val anchor = Anchor.create(session, pose)

Anexar uma entidade a uma âncora

Para renderizar um modelo nesse local, crie um GltfModel e defina o pai dele como um AnchorSpace.

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

Entender o TrackingState

Cada Trackable tem um TrackingState que precisa ser verificado antes de ser usado. Um Trackable que tem um TrackableState de Tracking tem a Pose ativamente atualizada pelo sistema. Um Trackable que está Paused pode se tornar Tracking no futuro, enquanto um que está Stopped nunca se tornará Tracking.

Persistir uma âncora em sessões

Uma âncora que não é persistida desaparece depois que uma sessão é destruída. Ao persistir uma âncora, seu app lembra a posição dela nos dados privados do app. Essa âncora pode ser recuperada em uma sessão subsequente e é ancorada no mesmo local do mundo.

Para persistir uma âncora, use Anchor.persist(), conforme mostrado aqui:

val uuid = anchor.persist()

Seu app pode recuperar a âncora usando o UUID em uma sessão futura:

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

Quando você não precisar mais de uma âncora, chame unpersist(). Isso remove a âncora do armazenamento do app e torna o UUID fornecido irrecuperável para chamadas de Anchor.load().

Anchor.unpersist(session, uuid)

Seu app também pode solicitar uma lista de todas as âncoras persistidas que ainda estão presentes no armazenamento do app:

val uuids = Anchor.getPersistedAnchorUuids(session)