Demonstração do ARKit: criação de filmes em realidade aumentada

Publicados: 2022-03-11

AR e VR estão se tornando populares, e todas as principais empresas de alta tecnologia estão perseguindo-os: a Apple tem o ARKit, o Google tem o ARCore e a Microsoft tem seu próprio HoloLens (e, claro, há o Unity). E com alguns aplicativos recebendo muita atenção do público, o desenvolvimento de aplicativos de realidade aumentada está se tornando uma habilidade muito desejável para desenvolvedores móveis.

Neste artigo, gostaria de demonstrar um pequeno aplicativo simples, mas significativo, que fará mais do que apenas ter um cubo giratório. Quem precisa de cubos giratórios de qualquer maneira? Vamos fazer Matrix.

Introdução ao ARKit

ARKit é uma estrutura da Apple para criar aplicativos AR para dispositivos iOS. Vários renderizadores podem ser usados ​​com ele: SpriteKit para objetos 2D, SceneKit para 3D e Metal se quisermos implementar um renderizador personalizado.

Para esta demonstração, usaremos o SceneKit para renderizar e colocar objetos 3D totalmente renderizados (facas).

imagem: distinção entre renderizadores

A partir do ARKit v2, cinco tipos de configuração são suportados no ARKit:

AROrientationTrackingConfiguration – Quando você deseja rastrear apenas a orientação do dispositivo (por exemplo, para um aplicativo de constelação de estrelas). Com esta configuração, os movimentos físicos como o desvio de lado não são rastreados e não afetarão a posição ou a direção dos objetos na cena.

ARWorldTrackingConfiguration – Esta é provavelmente a configuração mais usada para AR, pois suporta o que a maioria das pessoas consideraria realidade aumentada. Os exemplos incluem aplicativos de caça virtual para animais de estimação ou Pokémon.

ARFaceTrackingConfiguration – Esta configuração é atualmente suportada apenas pelo iPhone X porque requer uma câmera TrueDepth (como Face ID). Essa configuração rastreia recursos no rosto e seu deslocamento relativo em relação à expressão facial neutra (por exemplo, um aplicativo em que os usuários podem experimentar óculos de sol da moda antes de comprá-los).

ARImageTrackingConfiguration – Se você possui um conjunto de marcadores e deseja mostrar animais pulando do marcador, essa configuração é ideal para você. Estes não precisam ser marcadores de cartão, mas qualquer imagem 2D. Você poderia apontar sua câmera para a Mona Lisa, e ela viraria a cabeça e lhe diria algo. Uma desvantagem é que você precisa dizer com antecedência qual é o tamanho físico do marcador de imagem.

ARObjectScanningConfiguration – Esta configuração é a versão 3D do ARImageTrackingConfiguration.

Nesta demonstração, adicionaremos facas e balas à cena e gostaríamos de ter seis graus de liberdade, então a ferramenta apropriada é ARWorldTrackingConfiguration.

O conceito do aplicativo

Todos que viram Matrix podem se lembrar de Neo (Keanu Reeves) desviando de balas e parando-as no ar. Nosso aplicativo nos ajudará a recriar essa cena a partir de um feed de câmera ao vivo. Assim, podemos criar vídeos personalizados demonstrando poderes do tipo Neo.

Nosso aplicativo terá modelos 3D de balas e facas. Cabe ao usuário quantas balas ou facas ele quer em seu filme. Se você quiser gastar algum tempo e adicionar outros modelos, o código do aplicativo é de código aberto e está disponível no GitHub (https://github.com/altaibayar/toptal_ar_video_maker). Embora este não seja um tutorial de RA completo, a demonstração e a fonte devem ser um recurso valioso se você estiver tentando entrar no desenvolvimento de aplicativos de RA no iOS.

O cenário de caso de uso pretendido é o seguinte:

  1. ter um amigo vestido como Neo (não é estritamente necessário para o funcionamento do aplicativo, mas pode ficar bem enquanto estamos fazendo isso).
  2. Peça a “Neo” para ficar a cerca de 10 metros de você.
  3. Inicie o aplicativo e escaneie o plano de terra.
  4. Adicione balas e facas voando em “Neo”.
  5. Segure o botão de gravação para gravar o vídeo enquanto “Neo” executa alguns movimentos legais desviando ou parando as balas
  6. solte o botão de gravação e salve o vídeo em sua biblioteca.

Construindo o aplicativo

Como mencionado anteriormente, queremos poder nos mover livremente enquanto gravamos todos os 360º da cena e fazer com que as balas e facas rastreiem o movimento da câmera de forma adequada.

Para fins de demonstração, teremos apenas dois tipos de objetos virtuais: facas e balas de espingarda.

Facas são objetos detalhados e usarei o modelo gratuito de https://poly.google.com/view/3TnnfzKfHrq (Obrigado Andrew).

Balas de espingarda, no entanto, são objetos esféricos simples e podemos simplesmente codificá-los. Vamos torná-los metálicos e incandescentes para variar. Como estamos emulando uma espingarda, também as geraremos como clusters agrupados. Para fazer o agrupamento fazer sentido sem muito incômodo, podemos usar o gerador de números aleatórios gaussianos do GamplayKit.

O GameplayKit é uma ferramenta útil que é útil sempre que você precisar de geração de ruído aleatório, máquina de estado, IA ou tomada de decisão baseada em probabilidade.

 override init() { super.init(); // generate 50 gaussian distributed position around [0, 0, 0] let positions = Randomness.gaussian(center: SCNVector3Zero, count: 50); for pos in positions { let node = SCNNode(geometry: sphereGeometry()); node.position = pos; self.addChildNode(node); } } private func sphereGeometry() -> SCNGeometry { // radius of one projectile sphere is 5mm/0.2inch let sphere = SCNSphere(radius: 0.005); // sphere is reddish sphere.firstMaterial?.diffuse.contents = UIColor.red; // reflection on light is gray/silver sphere.firstMaterial?.reflective.contents = UIColor.gray; // metalness is 0.3 sphere.firstMaterial?.metalness.contents = 0.3; // shading should be realistic sphere.firstMaterial?.lightingModel = .physicallyBased; return sphere; }

Lógica de deslocamento aleatório semelhante pode ser usada para as facas, mas como elas não se comportam como clusters, uma distribuição aleatória simples pode ser usada.

Arquitetura do aplicativo

Está além do escopo desta demonstração aprofundar as discussões sobre qual paradigma de arquitetura é o melhor. Existem muitos artigos por aí que se aprofundam nesse assunto.

Em vez disso, vou apenas apresentar a estrutura do projeto como um guia para se orientar no projeto vinculado do GitHub: quais são os principais componentes, como estão conectados e por que foram escolhidos.

O aplicativo possui apenas três telas:

PermissionViewController – A tela em que solicitamos ao usuário que conceda ao aplicativo acesso aos recursos móveis necessários.

  • Câmera – Obviamente
  • Galeria – Para salvar vídeo gravado e entrada de microfone
  • Microfone – A permissão é exigida por uma biblioteca que estou usando para criar o vídeo (por padrão, o som do microfone seria usado como fonte de uma faixa de áudio).

ExportViewController – Esta tela mostra um vídeo gravado e oferece as opções para compartilhar ou salvar o vídeo.

MainViewController – Toda a mágica acontece aqui.

Pela minha experiência, é melhor você envolver todas as classes ARKit necessárias, como ARSession, ARConfiguration e todos os tipos exclusivos de SCNNode. Dessa forma, o código é autoexplicativo.

ARSession é herdada em ToptalARSession, e a nova classe de sessão tem apenas três métodos: o construtor de classe onde configuramos tudo o que é necessário e os métodos resetTracking e pauseTracking.

O aplicativo reconhece quatro tipos exclusivos de SCNNodes:

  • KnifeNode – Representa um objeto 3D de faca e carrega automaticamente uma faca 3D como sua geometria.
  • BulletsNode – Este nó representa um conjunto de cartuchos de espingarda. Ruído gaussiano aleatório, cores e modo de iluminação física são configurados automaticamente.

    Nenhum trabalho especial ou adicional é necessário nas classes que usam KnifeNode ou BulletsNode, e eles podem ser usados ​​como modelos para personalizar o aplicativo para adicionar mais tipos de objetos 3D.

  • ReticleNode – Envolve um modelo 3D que aparece na cena acima do chão para mostrar onde as facas ou balas serão adicionadas.
  • DirectionalLightNode – Este é um nó que representa uma luz vertical apontando para baixo.

Referências e Créditos

Modelo de faca: https://poly.google.com/view/3TnnfzKfHrq

Gravação do SCNScene: https://github.com/svtek/SceneKitVideoRecorder

Ícones de botão, aplicativo de demonstração ARKit: https://developer.apple.com/documentation/arkit/handling_3d_interaction_and_ui_controls_in_augmented_reality