Criar âncoras com o ARCore para o Jetpack XR

Uma âncora descreve um local e uma orientação fixos no mundo real. A fixação de um objeto a uma âncora ajuda a mostrar objetos colocados de forma realista no mundo real.

Criar uma sessão do ARCore para o Jetpack XR

Crie âncoras usando uma sessão do ARCore para o Jetpack XR. Consulte Entender o ciclo de vida de uma sessão para receber uma Session.

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 âncora não é ativada por padrão nas sessões de XR. Para manter e carregar âncoras, configure a sessão:

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

Fixar o conteúdo em um local fixo no espaço

Uma âncora é criada usando um Pose, que pode ser interpretado em relação a um Trackable existente ou não.

Criar uma âncora relativa a um rastreável

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

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

Criar uma âncora sem um rastreável

Para criar uma âncora que não esteja anexada a um Trackable:

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

Anexar uma entidade a uma âncora

Para renderizar um modelo nesse local, [crie um GltfModel][5] e defina o pai como um AnchorEntity.

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

Entender o TrackingState

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

Manter uma âncora em todas as sessões

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

Para manter uma âncora, use anchor.persist(), conforme mostrado aqui:

val uuid = anchor.persist()

Seu app pode recuperar a âncora usando a 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 faz com que o UUID fornecido não possa ser recuperado para chamadas para Anchor.load().

Anchor.unpersist(session, uuid)

O 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)