Adicionar um subespaço que segue um destino

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

Enquanto um Subspace padrão permanece em uma posição fixa determinada pelo sistema, às vezes você pode querer que a IU espacial do app se mova dinamicamente com o usuário ou permaneça anexada a um local específico no ambiente ou no mundo real. É possível transmitir um FollowTarget para o parâmetro follow de Subspace para criar experiências como HUDs com bloqueio de cabeça ou painéis de informações anexados a objetos do mundo real.

Adicionar um subespaço que segue a visualização do usuário

Para adicionar um subespaço posicionado em relação ao campo de visão do usuário, use FollowTarget.view. Dependendo do modo de acompanhamento especificado, isso permite rastrear continuamente os movimentos da cabeça do usuário ou posicionar o conteúdo de forma estática com base em para onde ele está olhando. Você pode usar isso para coisas como HUDs, notificações persistentes ou controles de ação rápida.

Declarar e solicitar permissões

Antes de solicitar permissões, é necessário declará-las no arquivo de manifesto do app usando o elemento <uses-permission>.

<manifest ...>
    <!-- Only declare permissions that your app actually needs. In this example,
    we declare permissions for head tracking. -->
    <uses-permission android:name="android.permission.HEAD_TRACKING"/>
    <application ...>
        ...
    </application>
</manifest>

Agora, solicite as permissões. Para mais informações, consulte os princípios e fluxos de trabalho de permissão para garantir que você ofereça a melhor experiência aos usuários, como verificar se o usuário já concedeu as permissões de execução que o app exige e se o app precisa mostrar uma justificativa ao usuário antes de solicitar essa permissão.

Configurar a sessão

Em seguida, configure a sessão do app que é criada para você ao usar o Jetpack Compose para XR definindo DeviceTrackingMode.SPATIAL:

val session = checkNotNull(LocalSession.current)
session.configure(
    config = Config.Builder(session.config).setDeviceTracking(DeviceTrackingMode.SPATIAL)
        .build()
)

Criar o subespaço

Por fim, você vai criar um subespaço que segmenta a visualização do usuário, junto com um modo de acompanhamento:

// Example: A subspace that softly follows the user's view (like a HUD)
Subspace(
    follow = FollowTarget.view(
        // Customizing the soft follow to move slightly faster and tracking all dimensions
        mode = FollowMode.soft(
        )
    ),
    modifier = modifier,
) {
    SpatialPanel {
      // SpatialPanel Content
    }
}

Modos de acompanhamento para subespaços que segmentam a visualização de um usuário

Ao usar FollowTarget.view como destino, é possível personalizar o comportamento do conteúdo especificando um FollowMode:

  • FollowMode.soft: o conteúdo acompanha gradualmente os movimentos do alvo, criando um efeito de flutuação suave.
  • FollowMode.snap: o conteúdo é colocado na frente do usuário uma vez, com base na pose de visualização inicial, e permanece estacionário depois disso.
  • FollowMode.tight: o conteúdo acompanha a visualização do usuário imediatamente com o mínimo de atraso, mantendo o conteúdo intimamente ligado ao movimento.

Todos os modos de acompanhamento permitem escolher quais dimensões de movimento são rastreadas entre as seguintes opções:

  • Eixo X
  • Eixo Y
  • Apresentar
  • Rolo
  • Guinada
  • RotationOnly: permite especificar um único valor para rastrear as dimensões relacionadas à rotação (inclinação, guinada e rolagem).

É possível escolher qualquer combinação dessas dimensões ou usar o valor padrão de TrackedDimensions.All, que rastreia todas elas.

Adicionar um subespaço que segue um recurso ambiental

Para adicionar um subespaço que bloqueie o conteúdo espacial estritamente a um recurso físico no ambiente do usuário, use FollowTarget.anchor(). Use esse tipo de alvo para seguir um plano detectado, uma âncora ou um local geoespacial.

O rastreamento de recursos do mundo real exige outras permissões e configurações de sessão, dependendo do recurso que você está seguindo.

Para instruções detalhadas sobre como trabalhar com recursos de percepção para recursos do ARCore, além de configurar as permissões necessárias e configurar sua sessão para usar FollowTarget.anchor(), consulte a documentação do SDK do Jetpack XR para Planos, Âncoras e Poses geoespaciais.

O exemplo a seguir cria um subespaço que segue uma âncora do mundo real:

// A subspace locked to a real-world anchor
Subspace(
    follow = FollowTarget.anchor(anchor = myAnchor)
) {
    // Rotate the panel to ensure it faces the user while remaining anchored
    SpatialPanel(SubspaceModifier.rotateToLookAtUser()) {
      // SpatialPanel Content
    }
}

Evitar sobreposição espacial

Cada Subspace criado gerencia a própria cena 3D independente e não tem conhecimento de outros subespaços que existem. Portanto, ele não evita colisões automaticamente.

Para evitar que o HUD fixado na cabeça passe pelos painéis de PDI ancorados (Z-fighting), gerencie explicitamente os volumes de layout usando estes métodos:

  1. Use deslocamentos: use SubspaceModifier.offset para aproximar ou afastar a interface periférica (como o HUD) no eixo Z ou deslocá-la para as bordas da visão do usuário.
  2. Restringir tamanhos: aplique modificadores como requiredSizeIn para restringir as caixas delimitadoras dos seus espaços.

Para mais informações sobre espaços de coordenadas, restrições de layout e todas as configurações de rastreamento disponíveis, consulte a documentação de referência do Subspace.