Créez des vidéos panoramiques dans Unity



Pourquoi avez-vous besoin de vidéos panoramiques?



La plupart de mes articles de blog sont destinés aux développeurs de jeux. Si vous êtes l'un d'entre eux, vous vous demandez peut-être pourquoi vous pourriez être intéressé par la création de vidéos 360 °. La réalité virtuelle est une industrie très réussie avec de plus en plus de jeux sortant sur diverses plates-formes chaque année. De nombreux joueurs découvrent les jeux VR grâce à des bandes-annonces, qui sont malheureusement enregistrées en 2D.





Si vous souhaitez aller plus loin, vous pouvez créer une bande-annonce panoramique en option pour mettre en valeur tout le potentiel de votre jeu. Alors que la réalité virtuelle nécessite généralement un casque coûteux pour la lecture, les vidéos panoramiques sont prises en charge nativement par YouTube sans nécessiter de matériel supplémentaire. Et si vous avez un téléphone, vous pouvez très facilement le transformer en casque VR à l'aide de Google Cardboard .



Cela peut offrir aux gens une expérience beaucoup plus immersive et leur donner une idée de l'intérêt de votre jeu. Des films comme It (voir la bande-annonce ci-dessous) et The Conjuring en ont pleinement profité en créant des jeux VR (avec des bandes-annonces en vidéo panoramique) pour une expérience plus interactive.





Enfin, les vidéos panoramiques sont idéales à des fins éducatives, comme on le voit dans All Discovered Exoplanets: A Narrated 360 VR Journey .



Gérer les vidéos panoramiques



Il y a de fortes chances que vous soyez familier avec YouTube et son fonctionnement. Cependant, les vidéos panoramiques ne sont pas familières à beaucoup. La plupart des vidéos sont enregistrées sur une caméra qui ne capture qu'une petite partie de l'environnement. Les vidéos panoramiques enregistrent simultanément tout ce qui se passe dans toutes les directions. Cela nécessite généralement des caméras spéciales appelées caméras omnidirectionnelles . Ils utilisent soit des miroirs incurvés pour refléter le monde qui les entoure dans un appareil photo traditionnel (un peu comme un objectif fisheye), soit plusieurs appareils photo orientés dans des directions différentes. Une de ces caméras est la GoPro Omni (voir ci-dessous), qui est essentiellement un appareil contenant six caméras fisheye standard.





Il est facile de comprendre pourquoi l'équipement nécessaire pour enregistrer des vidéos panoramiques est généralement plus cher que les caméras traditionnelles. Cependant, ce n'est pas la seule raison limitant leur distribution. Une lecture correcte des vidéos panoramiques nécessite un logiciel et un matériel spéciaux. Les écrans, comme les caméras, sont conçus pour ne recréer qu'une petite partie des environnements. YouTube a pu contourner cette limitation en permettant aux téléspectateurs de "faire pivoter" la vidéo pour pouvoir regarder autour de lui. Si vous regardez une vidéo panoramique depuis un téléphone ou une tablette, vous la déplacez généralement dans l'espace pour voir différentes parties de la «sphère» à 360 °.



YouTube prend en charge deux types de vidéos panoramiques: mono et stéréo (ces dernières sont souvent appelées vidéos VR). La différence entre les deux est que la vidéo stéréo est destinée aux casques VR et peut transmettre une sensation de profondeur qui ne peut être ressentie dans les vidéos traditionnelles. Ceci est réalisé en ayant non pas une, mais deux vidéos, une pour chaque œil. Ces deux vidéos sont enregistrées simultanément par deux caméras, dont la distance est comparable à la distance entre les yeux. En conséquence, les vidéos VR peuvent «tromper» le cerveau en percevant la vraie distance comme dans la vie de tous les jours.



Le tableau présente les exigences de ces deux types de vidéos.



Nom Vidéo 360 ° Vidéo de réalité virtuelle
Mono Stéréo
2D 3D
Lien Soutien Soutien
Fréquence de trame 24, 25, 30, 48, 50, 60 25, 30, 50, 60
Format

Rapport hauteur / largeur équidistant 2: 1


Rapport hauteur / largeur ci-dessous équidistant 1: 1
Résolution Recommandé: 7168 x 3584, jusqu'à 8192 x 4096 5120 x 5120 à 8192 x 8192


Veuillez noter que YouTube s'efforce constamment d'améliorer la prise en charge des vidéos panoramiques, cela peut donc changer à l'avenir. Lisez les informations référencées dans le tableau avant de suivre ces spécifications.



Vidéo du projet



La première partie délicate des vidéos panoramiques est de savoir comment encoder la sphère sur une surface plane. Cela est nécessaire car même si les caméras omnidirectionnelles peuvent enregistrer dans toutes les directions, chaque image doit toujours être convertie en une image plate traditionnelle.



Il existe de nombreuses façons de transformer (à proprement parler, projeter ) une sphère en un rectangle. La plus connue est probablement la projection cylindrique , qui est devenue populaire après que le cartographe Gerard Mercator a commencé à l'utiliser en 1569 pour transformer la surface de la planète en cartes plates.



Cependant, la projection équirectangulaire est le plus souvent utilisée dans les vidéos panoramiques (voir ci-dessous).





Son spatial



Les vidéos panoramiques, mono et stéréo, peuvent prendre en charge l'audio spatial . Les vidéos standard ont deux canaux audio (gauche et droit) qui sont utilisés pour créer un sens de l'orientation lors de l'écoute avec des écouteurs stéréo. L'audio spatial vous permet d'encoder la vraie direction de la source sonore, plutôt que juste la gauche / droite. Cela signifie qu'avec le bon équipement, vous pouvez vous sentir complètement immergé et comprendre les directions des sons environnants.



Malgré son nom, les vidéos VR ne sont pas aussi bonnes que les «vrais» jeux VR car même si un casque VR peut suivre les mouvements de la tête, la vidéo est rendue à partir d'un point fixe. Il est impossible de se déplacer et de voir ce qu'il y a derrière l'objet, comme ce serait le cas dans un jeu VR. Cela peut être un peu déroutant, surtout lorsqu'il est combiné avec un son surround. Lorsque vous travaillez depuis longtemps sur un projet VR (jeu ou vidéo), vous pouvez vous y habituer. Il est important de procéder à un test de jeu suffisamment détaillé pour garantir la commodité du produit fini et pour trouver les limites qui causent une gêne aux joueurs ou aux spectateurs.



La vidéo panoramique n'a pas besoin d'avoir un son spatial. YouTube prend en charge deux formats:



  • Ambisoniques de premier ordre
  • Ambisonique de premier ordre avec stéréo à verrouillage de tête


L'ambisonique est un format sonore utilisé pour enregistrer non seulement le son mais aussi la direction dont il vient. L'ambisonique de premier ordre (FOA) utilise quatre canaux audio pour coder la directivité de la source sonore. Pour avoir une idée approximative de la façon dont cela fonctionne, je dirai que l'enregistrement du son FOA est un peu comme l'enregistrement avec quatre microphones. L'idée fausse commune est que ces quatre microphones sont situés à des points cardinaux (un devant le spectateur, un autre derrière, un troisième à gauche et un quatrième à droite). Ce n'est pas ainsi que fonctionne Ambisonics, mais nous pouvons en parler dans d'autres articles.



Bien que FOA utilise 4 canaux, YouTube prend également en charge une version 6 canaux, qui ajoute simplement les canaux stéréo gauche et droit traditionnels. Ce format est appelé FOA avec Head-Locked Stereo...



Une attention particulière doit être portée à l'encodage de la vidéo panoramique (stéréo ou mono) car tous les formats ne prennent pas en charge 4 ou 6 canaux audio. YouTube recommande ce qui suit:



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


Si vous utilisez Premiere Pro 2018 ou une version plus récente, il est préférable d'encoder votre vidéo en tant que codec Quicktime ProRes. Vous pouvez en savoir plus sur les formats audio spatiaux pris en charge par YouTube ici .



Comment créer une vidéo panoramique dans Unity



L'une des nombreuses fonctionnalités ajoutées à Unity 2018.1 est la possibilité de prendre des captures d'écran de l'appareil photo dans un format compatible avec les vidéos panoramiques YouTube. Cette fonctionnalité est brièvement décrite dans un article sur le site Web de Unity: Stereo 360 Image and Video Capture . Malheureusement, il n'y a pas de référence de scène pour les tests.



Théorie



Le plus souvent, les clips de jeu sont enregistrés pendant que le jeu est en cours d'exécution. Cela convient aux vidéos standard, mais généralement pas aux vidéos panoramiques. La raison principale est qu'une zone beaucoup plus grande est nécessaire pour rendre un jeu panoramique, ce qui fait chuter considérablement la fréquence d'images. Une approche plus standard consiste à effectuer le rendu et à exporter chaque image en arrière-plan afin de pouvoir la modifier ultérieurement dans un logiciel tiers tel que ffmpeg ou Premiere Pro. C'est ce que nous allons faire dans notre tutoriel.



Le rendu d'une scène panoramique dans Unity est un processus en trois étapes assez simple:



  • Rendu d'une scène en texture de carte de cube (format préféré de Unity pour les textures panoramiques)
  • Conversion d'une carte cubique en projection équirectangulaire (format préféré pour les vidéos panoramiques YouTube)
  • Enregistrer la projection équidistante au format PNG


Les deux premières étapes sont nécessaires en raison du fonctionnement des caméras dans Unity.



Si vous êtes familier avec Unity, vous savez probablement que le moyen préféré de stocker des textures panoramiques est d' utiliser une carte de cube , qui est un moyen de regrouper six images différentes sans déformation (voir ci-dessous). Les cartes cubiques sont souvent utilisées pour les skyboxes et les sondes de réflexion, il est donc probable que vous les ayez déjà rencontrées.





Pour créer une texture panoramique, Unity effectue le rendu de la scène six fois, à chaque fois sous un angle différent. La caméra effectue un panoramique comme si elle était alignée avec l'un des six côtés du cube. En conséquence, chaque capture d'écran panoramique est constituée de six captures d'écran traditionnelles liées entre elles.



Après avoir rempli la carte du cube, la deuxième étape consiste à la convertir dans un format compatible YouTube. Comme nous l'avons vu précédemment, YouTube nécessite des vidéos panoramiques équirectangulaires. Cette transformation nécessite généralement le codage de shaders complexes, mais heureusement, une fonction a été ajoutée à Unity spécifiquement pour cela.



La dernière étape consistera à exporter la texture équidistante vers un fichier PNG. Une fois que toutes les images vidéo ont été rendues, vous pouvez les fusionner à l'aide d'un programme tel que ffmpeg ou Premiere Pro.



Le code



La première étape consiste à créer un script (appelé dans les extraits ci-dessous Camera360) et à l'attacher à la caméra à rendre. Cependant, le code changera selon que l'on souhaite rendre la vidéo en mono (360 ° / mono / 2D) ou en stéréo (VR / stéréo / 3D).



Mono



Commençons par la version 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);
    }
}


Le script ci-dessus rendra chaque image dans une texture de rendu appelée Equirect, qui contiendra une capture d'écran panoramique enregistrée dans une projection équirectangulaire.



La valeur 63utilisée dans la méthode RenderToCubemapsignifie que nous voulons prendre des captures d'écran des six côtés du cube.



Les deux EyeCubemap, et EquirectTexturepeuvent être créés dans l'éditeur ou dans le code.





Stéréo



Le code de la version stéréo est très similaire, mais nécessite une étape supplémentaire:



    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);
    }


Pour rendre une image stéréo, vous devez rendre deux cartes de cube. stereoSeparationdéfinit la distance entre ces cartes de cube. La valeur standard est de 64 mm, ce qui est approximativement égal à la distance entre les yeux gauche et droit.





Créer et enregistrer des textures



Les deux extraits de code présentés ci-dessus écrivent simplement dans la texture, mais ils ne l'enregistrent nulle part. Si nous voulons que les images soient enregistrées sur le disque, cela doit être fait manuellement.



Malheureusement, exporter une texture de rendu vers un fichier PNG n'est pas aussi simple qu'il devrait l'être. Le premier problème est que Unity ne vous permet pas d'accéder directement aux pixels individuels RenderTexture. Tout d'abord, la texture de rendu doit être copiée dans un objet Texture2D.



L'extrait de code ci-dessous effectue exactement cette tâche, à l'aide de la méthode, ReadPixelscopie les pixels de la texture de rendu actuellement active .



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;
}


À condition qu'il FileNamecontienne le chemin correct vers le fichier PNG, le code ci-dessus fera l'affaire. Un seul petit changement devra être fait: pour s'assurer que le script n'écrase pas le même fichier encore et encore. Pour ce faire, ajoutez simplement le compteur de nom de fichier à la réécriture répétée frame.png, il écrivait frame_0.png, frame_1.pnget ainsi de suite.



Problèmes



Il y a des problèmes avec cette solution. Le plus important est que certains effets de post-traitement peuvent ne pas fonctionner comme prévu.



Performance



Le rendu des cadres panoramiques dans Unity est une tâche très coûteuse. Dans ma solution, la scène est rendue 6 ou 12 fois (selon le format vidéo - mono ou stéréo). Le post-traitement requis pour fusionner les images et enregistrer chaque image sur le disque peut réduire les performances d'un facteur de 10 à 15. Si vous effectuez le rendu d'une vidéo en haute qualité (8192 x 8192 pixels), la taille de chaque image individuelle peut dépasser 100 Mo. Evidemment, si vous ne disposez pas d'une machine très puissante, vous ne pourrez pas simultanément jouer en temps réel et exporter des prises de vue panoramiques.



Post-traitement



Le vignettage , par exemple, ajoute un halo sombre autour de la caméra. Puisque Unity crée une image panoramique en effectuant le rendu de la scène six fois, un effet de vignettage sera appliqué à chaque image. En conséquence, un étrange halo noir sera présent aux jonctions des images.





De même, les effets de flou et de bloom provoquent également des erreurs sur les bords, démontrant l'existence de coutures. Il n'y a pas de solution simple à ce problème, car aucune des piles de post-traitement créées par Unity n'est conçue pour fonctionner avec des images panoramiques.



Cependant, les effets de flou et de floraison peuvent toujours être appliqués avec modération. Si vous avez besoin de ces effets, il est préférable de les appliquer en post-production à l'aide de Premiere Pro.



Rendu de ligne



Un énorme problème avec les images panoramiques est que les rendus de ligne peuvent ne pas s'afficher correctement . Si une ligne est configurée de sorte qu'elle doit toujours regarder la caméra, alors lors du rendu dans une image panoramique, Unity la rejettera simplement. C'est extrêmement ennuyeux car il n'y a pas de vraie raison à cela.



Unity a développé une version alternative du moteur de rendu de ligne appelée XRLineRenderer qui fonctionne correctement. Bien qu'il ne



prenne pas en charge toutes les fonctionnalités du composant Line Renderer standard, vous serez en mesure de mettre en œuvre la plupart des fonctionnalités. Le XRLineRenderer a également la capacité de créer des effets de lueur simples, ce qui peut réduire l'importance des problèmes décrits dans la section précédente.



Voir également:






All Articles