Crie vídeos panorâmicos no Unity



Por que você precisa de vídeos panorâmicos?



A maioria das postagens do meu blog é voltada para desenvolvedores de jogos. Se você é um deles, pode estar se perguntando por que está interessado em criar vídeos 360 °. A realidade virtual é uma indústria de muito sucesso, com mais jogos sendo lançados em várias plataformas a cada ano. Muitos jogadores aprendem sobre jogos de RV por meio de trailers, que infelizmente são gravados em 2D.





Se quiser dar um passo adiante, você pode criar um trailer panorâmico opcional para mostrar todo o potencial do seu jogo. Embora geralmente seja necessário um fone de ouvido caro para reproduzir a RV, os vídeos panorâmicos têm suporte nativo do YouTube sem a necessidade de hardware adicional. E se você tiver um telefone, pode facilmente transformá-lo em um fone de ouvido VR usando o Google Cardboard .



Isso pode fornecer às pessoas uma experiência muito mais envolvente e dar a elas uma noção de qual é o objetivo do seu jogo. Filmes como It (veja o trailer abaixo) e The Conjuring tiraram proveito disso criando jogos de realidade virtual (com trailers em vídeo panorâmico) para uma experiência mais interativa.





Por fim, os vídeos panorâmicos são ótimos para fins educacionais, como pode ser visto em All Discovered Exoplanets: A Narrated 360 VR Journey .



Lidando com vídeos panorâmicos



Provavelmente, você está familiarizado com o YouTube e como ele funciona. No entanto, os vídeos panorâmicos não são familiares para muitos. A maioria dos vídeos é gravada em uma câmera que captura apenas uma pequena parte do ambiente. Vídeos panorâmicos gravam simultaneamente tudo o que acontece em todas as direções. Isso geralmente requer câmeras especiais chamadas câmeras omnidirecionais . Eles usam espelhos curvos para refletir seus arredores em uma câmera tradicional (bem como uma lente olho de peixe) ou têm várias câmeras voltadas para diferentes direções. Uma dessas câmeras é a GoPro Omni (veja abaixo), que é essencialmente um dispositivo contendo seis câmeras fisheye padrão.





É fácil ver por que o equipamento necessário para gravar vídeos panorâmicos costuma ser mais caro do que as câmeras tradicionais. No entanto, esse não é o único motivo que limita sua distribuição. A reprodução adequada de vídeos panorâmicos requer software e hardware especiais. As telas, como as câmeras, são projetadas para recriar apenas uma pequena parte dos ambientes. O YouTube conseguiu contornar essa limitação permitindo que os espectadores "girassem" o vídeo para que pudessem olhar ao redor. Se você estiver assistindo a um vídeo panorâmico de um telefone ou tablet, geralmente o move no espaço para ver diferentes partes da "esfera" em 360 °.



O YouTube oferece suporte a dois tipos de vídeos panorâmicos: mono e estéreo (os últimos costumam ser chamados de vídeos VR) A diferença entre os dois é que o vídeo estéreo se destina a fones de ouvido VR e pode transmitir uma sensação de profundidade que não pode ser sentida em vídeos tradicionais. Isso é realizado por ter não um, mas dois vídeos, um para cada olho. Esses dois vídeos são gravados simultaneamente por duas câmeras, a distância entre as quais é comparável à distância entre os olhos. Como resultado, os vídeos de RV podem "enganar" o cérebro para que perceba a verdadeira distância, como na vida cotidiana.



A tabela mostra os requisitos desses dois tipos de vídeo.



Nome Vídeo 360 ° Vídeo de realidade virtual
Mono Estéreo
2D 3D
Ligação Apoio, suporte Apoio, suporte
Frequência de quadro 24, 25, 30, 48, 50, 60 25, 30, 50, 60
Formato

Proporção equidistante 2: 1


Proporção equidistante acima e abaixo de 1: 1
Resolução Recomendado: 7.168 x 3.584, até 8.192 x 4.096 5120 x 5120 a 8192 x 8192


Observe que o YouTube está trabalhando constantemente para melhorar o suporte para vídeos panorâmicos, então isso pode mudar no futuro. Leia as informações referenciadas na tabela antes de seguir essas especificações.



Projetando vídeo



A primeira parte complicada dos vídeos panorâmicos é como codificar a esfera em uma superfície plana. Isso é necessário porque, embora as câmeras omnidirecionais possam gravar em todas as direções, cada quadro ainda precisa ser convertido em uma imagem plana tradicional.



Existem muitas maneiras de transformar (estritamente falando, projetar ) uma esfera em um retângulo. Provavelmente, a mais famosa é a projeção cilíndrica , que se popularizou depois que o cartógrafo Gerard Mercator começou a usá-la em 1569 para transformar a superfície do planeta em mapas planos.



No entanto, a projeção equirretangular é mais frequentemente usada em vídeos panorâmicos (veja abaixo).





Som espacial



Vídeos panorâmicos, tanto mono quanto estéreo, podem suportar áudio espacial . Os vídeos padrão têm dois canais de áudio (esquerdo e direito) que são usados ​​para criar um senso de direção ao ouvir com fones de ouvido estéreo. O áudio espacial permite que você codifique a verdadeira direção da fonte de som, em vez de apenas esquerda / direita. Isso significa que, com o equipamento certo, você pode se sentir completamente imerso e entender as direções dos sons ao redor.



Apesar do nome, os vídeos de RV não são tão bons quanto os jogos de RV “reais” porque, embora um fone de ouvido de RV possa rastrear os movimentos da cabeça, o vídeo é renderizado a partir de um ponto fixo. É impossível se mover e ver o que está atrás do objeto, como seria em um jogo de RV. Isso pode ser um pouco desorientador, especialmente quando combinado com o som surround. Quando você está trabalhando em um projeto de RV (jogo ou vídeo) há muito tempo, pode se acostumar. É importante realizar um teste de jogo suficientemente detalhado para garantir a conveniência do produto acabado e encontrar limitações que causem desconforto aos jogadores ou espectadores.



O vídeo panorâmico não precisa ter áudio espacial. O YouTube suporta dois formatos:



  • Ambisonics de primeira ordem
  • Ambisonics de primeira ordem com estéreo com bloqueio de cabeça


Ambisonics é um formato de som usado para gravar não apenas o som, mas também a direção de onde ele vem. O Ambisonics de primeira ordem (FOA) usa quatro canais de áudio para codificar a diretividade da fonte de som. Para ter uma ideia geral de como isso funciona, direi que gravar som FOA é um pouco como gravar com quatro microfones. O equívoco comum é que esses quatro microfones estão localizados em pontos cardeais (um na frente do visualizador, um atrás, o terceiro à esquerda e o quarto à direita). Não é assim que o Ambisonics funciona, mas podemos falar sobre isso em outros posts.



Embora o FOA use 4 canais, o YouTube também suporta uma versão de 6 canais, que simplesmente adiciona os canais estéreo tradicionais esquerdo e direito. Este formato é denominado FOA com Head-Locked Stereo...



Atenção especial deve ser dada à codificação de vídeo panorâmico (estéreo ou mono), pois nem todos os formatos suportam 4 ou 6 canais de áudio. O YouTube recomenda o seguinte:



  • Formato: MP4, MOV
  • Codec: H.264, ProRes, DNxHR


Se você estiver usando o Premiere Pro 2018 ou mais recente, é melhor codificar seu vídeo como um codec Quicktime ProRes. Você pode ler mais sobre os formatos de áudio espacial suportados pelo YouTube aqui .



Como criar um vídeo panorâmico no Unity



Um dos muitos recursos adicionados no Unity 2018.1 é a capacidade de fazer capturas de tela da câmera em um formato compatível com vídeos panorâmicos do YouTube. Esse recurso é brevemente descrito em uma postagem no site da Unity: Stereo 360 Image and Video Capture . Infelizmente, não há referência de cena nele para teste.



Teoria



Na maioria das vezes, os clipes de jogos são gravados enquanto o jogo está em execução. Isso é bom para vídeos padrão, mas geralmente não para vídeos panorâmicos. O principal motivo é que uma área muito maior é necessária para renderizar um jogo panorâmico, o que faz com que a taxa de quadros caia drasticamente. Uma abordagem mais padrão é renderizar e exportar cada quadro em segundo plano para que possam ser editados posteriormente em software de terceiros, como ffmpeg ou Premiere Pro. Isso é o que faremos em nosso tutorial.



Renderizar uma cena panorâmica no Unity é um processo bastante simples de três etapas:



  • Renderize uma cena em uma textura de mapa de cubo (formato preferido da Unity para texturas panorâmicas)
  • Converter um mapa de cubo em uma projeção equirretangular (formato preferido para vídeos panorâmicos do YouTube)
  • Salvar projeção equidistante como PNG


As duas primeiras etapas são necessárias devido à forma como as câmeras funcionam no Unity.



Se você está familiarizado com o Unity, provavelmente sabe que a maneira preferida de armazenar texturas panorâmicas é com um mapa de cubo , que é uma forma de empacotar seis imagens diferentes sem deformar (veja abaixo). Mapas cúbicos são freqüentemente usados ​​para skyboxes e sondas de reflexão, então é provável que você os tenha encontrado antes.





Para criar uma textura panorâmica, o Unity renderiza a cena seis vezes, cada vez em um ângulo diferente. A câmera gira como se estivesse alinhada com um dos seis lados do cubo. Como resultado, cada captura de tela panorâmica é seis tradicionais interligadas.



Depois de preencher o mapa do cubo, o segundo passo é convertê-lo para um formato compatível com o YouTube. Como vimos anteriormente, o YouTube requer vídeos panorâmicos equirretangulares. Essa transformação geralmente requer a codificação de shaders complexos, mas felizmente um recurso foi adicionado ao Unity especificamente para isso.



A etapa final será exportar a textura equidistante para um arquivo PNG. Depois que todos os quadros de vídeo foram renderizados, você pode mesclá-los usando um programa como o ffmpeg ou Premiere Pro.



O código



O primeiro passo é criar um script (chamado nos fragmentos abaixo Camera360) e anexá-lo à câmera que será renderizada. No entanto, o código mudará dependendo se queremos renderizar o vídeo em mono (360 ° / mono / 2D) ou em estéreo (VR / estéreo / 3D).



Mono



Vamos começar com a versão mono:



public class Camera360 : MonoBehaviour
{
    public Camera Camera;
    
    public RenderTexture EyeCubemap;
    public RenderTexture EquirectTexture;

    void Update ()
    {
        Camera.RenderToCubemap(EyeCubemap, 63, Camera.MonoOrStereoscopicEye.Mono);
        EyeCubemap.ConvertToEquirect(EquirectTexture, Camera.MonoOrStereoscopicEye.Mono);
    }
}


O script acima renderizará cada quadro em uma textura de renderização intitulada Equirect, que conterá uma captura de tela panorâmica salva em uma projeção equirretangular.



O valor 63usado no método RenderToCubemapsignifica que queremos fazer capturas de tela de todos os seis lados do cubo.



Ambos EyeCubemap, e EquirectTexturepodem ser criados no editor ou no código.





Estéreo



O código da versão estéreo é muito semelhante, mas requer uma etapa adicional:



    void Start ()
    {
        Camera.stereoSeparation = 0.064f; // 64mm
    }

    void Update ()
    {
        Camera.RenderToCubemap(EyeCubemap, 63, Camera.MonoOrStereoscopicEye.Left);
        EyeCubemap.ConvertToEquirect(EquirectTexture, Camera.MonoOrStereoscopicEye.Left);

        Camera.RenderToCubemap(EyeCubemap, 63, Camera.MonoOrStereoscopicEye.Right);
        EyeCubemap.ConvertToEquirect(EquirectTexture, Camera.MonoOrStereoscopicEye.Right);
    }


Para renderizar uma imagem estéreo, você precisa renderizar dois mapas de cubo. stereoSeparationdefine a distância entre esses mapas cúbicos. O valor padrão é 64 mm, que é aproximadamente igual à distância entre os olhos esquerdo e direito.





Criação e salvamento de texturas



Os dois trechos de código acima apenas gravam na textura, mas não a salvam em lugar nenhum. Se quisermos que os quadros sejam salvos no disco, isso deve ser feito manualmente.



Infelizmente, exportar uma textura de renderização para um arquivo PNG não é tão fácil como deveria ser. O primeiro problema é que o Unity não permite que você acesse diretamente pixels individuais RenderTexture. Primeiro, a textura de renderização precisa ser copiada para um objeto Texture2D.



O trecho de código abaixo executa exatamente esta tarefa, usando o método, ReadPixelscopia os pixels da textura de renderização atualmente ativa .



public string FileName;

void Update ()
{
    ...    

    // Creates buffer
    Texture2D tempTexture = new Texture2D(EquirectTexture.width, Equirect.height);

    // Copies EquirectTexture into the tempTexture
    RenderTexture currentActiveRT = RenderTexture.active;
    RenderTexture.active = EquirectTexture;
    TempTexture.ReadPixels(new Rect(0, 0, EquirectTexture.width, EquirectTexture.height), 0, 0);

    // Exports to a PNG
    var bytes = tempTexture.EncodeToPNG();
    System.IO.File.WriteAllBytes(FileName, bytes);

    // Restores the active render texture
    RenderTexture.active = currentActiveRT;
}


Desde que FileNamecontenha o caminho correto para o arquivo PNG, o código acima fará o trabalho. Apenas uma pequena mudança precisará ser feita: para garantir que o script não substitua o mesmo arquivo repetidamente. Para fazer isso, basta adicionar o contador nome do arquivo para repetido reescrevendo frame.png, ele estava escrevendo em frame_0.png, frame_1.pnge assim por diante.



Problemas



Essa solução também tem seus problemas. O mais importante deles é que alguns efeitos de pós-processamento podem não funcionar como esperado.



atuação



Renderizar quadros panorâmicos no Unity é uma tarefa muito cara. Na minha solução, a cena é renderizada 6 ou 12 vezes (dependendo do formato do vídeo - mono ou estéreo). O pós-processamento necessário para mesclar imagens e salvar cada quadro no disco pode reduzir o desempenho por um fator de 10-15. Se você renderizar um vídeo em alta qualidade (8192 x 8192 pixels), cada quadro individual pode ter mais de 100 MB de tamanho. Obviamente, se você não tiver uma máquina muito potente, não poderá jogar simultaneamente em tempo real e exportar fotos panorâmicas.



Pós-processamento



A vinheta , por exemplo, adiciona um halo escuro ao redor da câmera. Como o Unity cria uma imagem panorâmica renderizando a cena seis vezes, um efeito de vinheta será aplicado a cada imagem. Como resultado, um estranho halo preto estará presente nas junções das imagens.





Da mesma forma, os efeitos de desfoque e floração também causam erros nas bordas, demonstrando a existência de costuras. Não existem soluções fáceis para este problema, pois nenhuma das pilhas de pós-processamento criadas pelo Unity foi projetada para trabalhar com imagens panorâmicas.



No entanto, os efeitos de desfoque e flor ainda podem ser aplicados com moderação. Se você precisar desses efeitos, é melhor aplicá-los na pós-produção usando o Premiere Pro.



Renderizadores de linha



Um grande problema com imagens panorâmicas é que os renderizadores de linha podem não ser exibidos corretamente . Se uma linha for configurada de forma que sempre deve estar olhando para a câmera, então ao renderizá-la em uma imagem panorâmica, o Unity simplesmente a descartará. Isso é extremamente irritante porque não há uma razão real para isso.



A Unity desenvolveu uma versão alternativa do renderizador de linha chamado XRLineRenderer que funciona corretamente. Embora não suporte todas as funcionalidades do componente Line Renderer padrão, você será capaz de implementar a maioria das funcionalidades.O



XRLineRenderer também tem a capacidade de criar efeitos de brilho simples, que podem reduzir a importância dos problemas descritos na seção anterior.



Veja também:






All Articles