Erstellen Sie Panorama-Videos in Unity



Warum brauchen Sie Panorama-Videos?



Die meisten Artikel in meinem Blog richten sich an Spieleentwickler. Wenn Sie einer von ihnen sind, fragen Sie sich möglicherweise, was Sie an der Erstellung von 360 ° -Videos interessiert sein könnten. Virtual Reality ist eine sehr erfolgreiche Branche, in der jedes Jahr mehr Spiele auf verschiedenen Plattformen veröffentlicht werden. Viele Spieler lernen VR-Spiele durch Trailer kennen, die leider in 2D aufgezeichnet sind.





Wenn Sie noch einen Schritt weiter gehen möchten, können Sie einen optionalen Panorama-Video-Trailer erstellen, um das volle Potenzial Ihres Spiels zu demonstrieren. Obwohl normalerweise ein teures Headset zum Abspielen von VR erforderlich ist, werden Panorama-Videos von YouTube nativ unterstützt, ohne dass zusätzliche Hardware erforderlich ist. Und wenn Sie ein Telefon haben, können Sie es mit Google Cardboard ganz einfach in ein VR-Headset verwandeln .



Dies kann den Menschen eine viel eindringlichere Erfahrung bieten und ihnen einen Eindruck davon vermitteln, worum es in Ihrem Spiel geht. Filme wie It (siehe Trailer unten) und The Conjuring nutzten dies voll aus, indem sie VR-Spiele (mit Trailern in Panorama-Videos) für ein interaktiveres Erlebnis erstellten.





Schließlich eignen sich Panorama-Videos hervorragend für Bildungszwecke, wie in Alle entdeckten Exoplaneten: Eine erzählte 360-VR-Reise zu sehen ist .



Umgang mit Panorama-Videos



Wahrscheinlich kennen Sie YouTube und dessen Funktionsweise. Panorama-Videos sind jedoch vielen nicht vertraut. Die meisten Videos werden mit einer Kamera aufgenommen, die nur einen kleinen Teil der Umgebung erfasst. Panorama-Videos zeichnen gleichzeitig alles auf, was in alle Richtungen passiert. Dies erfordert normalerweise spezielle Kameras, die als omnidirektionale Kameras bezeichnet werden . Sie verwenden entweder gekrümmte Spiegel, um ihre Umgebung in eine herkömmliche Kamera (ähnlich wie ein Fischaugenobjektiv) zu reflektieren, oder sie haben mehrere Kameras, die in verschiedene Richtungen zeigen. Eine solche Kamera ist die GoPro Omni (siehe unten), bei der es sich im Wesentlichen um ein Gerät handelt, das sechs Standard-Fischaugen-Kameras enthält.





Es ist leicht zu erkennen, warum die zum Aufnehmen von Panorama-Videos erforderliche Ausrüstung normalerweise teurer ist als herkömmliche Kameras. Dies ist jedoch nicht der einzige Grund, der ihre Verbreitung einschränkt. Die ordnungsgemäße Wiedergabe von Panorama-Videos erfordert spezielle Software und Hardware. Bildschirme sind wie Kameras so konzipiert, dass sie nur einen kleinen Teil der Umgebung nachbilden. YouTube konnte diese Einschränkung umgehen, indem es den Zuschauern ermöglichte, das Video zu "drehen", damit sie sich umschauen können. Wenn Sie ein Panorama-Video von einem Telefon oder Tablet aus ansehen, bewegen Sie es normalerweise im Raum, um verschiedene Teile der "Kugel" in 360 ° zu sehen.



YouTube unterstützt zwei Arten von Panorama-Videos: Mono und Stereo (letztere werden häufig als VR-Videos bezeichnet). Der Unterschied zwischen beiden besteht darin, dass Stereovideo für VR-Headsets gedacht ist und ein Gefühl von Tiefe vermitteln kann, das in herkömmlichen Videos nicht zu spüren ist. Dies wird dadurch realisiert, dass nicht ein, sondern zwei Videos vorhanden sind, eines für jedes Auge. Diese beiden Videos werden gleichzeitig von zwei Kameras aufgenommen, deren Abstand mit dem Abstand zwischen den Augen vergleichbar ist. Infolgedessen können VR-Videos das Gehirn dazu bringen, die wahre Distanz wie im Alltag wahrzunehmen.



Die Tabelle zeigt die Anforderungen, die diese beiden Arten von Videos haben.



Name 360 ° Video Video zur virtuellen Realität
Mono Stereo
2D 3D
Verknüpfung Unterstützung Unterstützung
Bildfrequenz 24, 25, 30, 48, 50, 60 25, 30, 50, 60
Format Äquidistantes

Seitenverhältnis 2: 1
Äquidistantes

Seitenverhältnis von oben nach unten 1: 1
Auflösung Empfohlen: 7168 x 3584, bis zu 8192 x 4096 5120 x 5120 bis 8192 x 8192


Bitte beachte, dass YouTube ständig daran arbeitet, die Unterstützung für Panorama-Videos zu verbessern. Dies kann sich in Zukunft ändern. Lesen Sie die in der Tabelle angegebenen Informationen, bevor Sie diese Spezifikationen befolgen.



Video projizieren



Der erste schwierige Teil von Panorama-Videos besteht darin, die Kugel in eine flache Oberfläche zu kodieren. Dies ist erforderlich, da omnidirektionale Kameras zwar in alle Richtungen aufnehmen können, jedoch jedes Bild in ein herkömmliches flaches Bild konvertiert werden muss.



Es gibt viele Möglichkeiten, eine Kugel in ein Rechteck umzuwandeln (genau genommen zu projizieren ). Am bekanntesten ist wohl die zylindrische Projektion , die populär wurde, nachdem der Kartograf Gerard Mercator 1569 damit begann, die Oberfläche des Planeten in flache Karten umzuwandeln.



Die gleichwinklige Projektion wird jedoch am häufigsten in Panoramavideos verwendet (siehe unten).





Raumklang



Panorama-Videos, sowohl Mono als auch Stereo, können räumliches Audio unterstützen . Standardvideos verfügen über zwei Audiokanäle (links und rechts), mit denen beim Hören mit Stereokopfhörern ein Orientierungssinn erzeugt wird. Mit räumlichem Audio können Sie die wahre Richtung der Schallquelle codieren und nicht nur links / rechts. Dies bedeutet, dass Sie sich mit der richtigen Ausrüstung vollständig eingetaucht fühlen und die Richtungen der Umgebungsgeräusche verstehen können.



Trotz seines Namens sind VR-Videos nicht so gut wie "echte" VR-Spiele, denn obwohl ein VR-Headset Kopfbewegungen verfolgen kann, wird das Video von einem festen Punkt aus gerendert. Es ist unmöglich, sich zu bewegen und zu sehen, was sich hinter dem Objekt befindet, wie es in einem VR-Spiel der Fall wäre. Dies kann ein wenig verwirrend sein, insbesondere in Kombination mit Surround-Sound. Wenn Sie lange an einem VR-Projekt (Spiel oder Video) gearbeitet haben, können Sie sich daran gewöhnen. Es ist wichtig, einen ausreichend detaillierten Spieltest durchzuführen, um die Bequemlichkeit des fertigen Produkts zu gewährleisten und Einschränkungen zu finden, die Spielern oder Zuschauern Unbehagen bereiten.



Panorama-Video muss kein räumliches Audio haben. YouTube unterstützt zwei Formate:



  • Ambisonics erster Ordnung
  • Ambisonics erster Ordnung mit Head-Locked-Stereo


Ambisonics ist ein Soundformat, mit dem nicht nur der Sound, sondern auch die Richtung, aus der er kommt, aufgezeichnet wird. Ambisonics (FOA) erster Ordnung verwendet vier Audiokanäle, um die Richtwirkung der Schallquelle zu codieren. Um eine ungefähre Vorstellung davon zu bekommen, wie dies funktioniert, möchte ich sagen, dass das Aufnehmen von FOA-Sound ein bisschen wie das Aufnehmen mit vier Mikrofonen ist. Das verbreitete Missverständnis ist, dass sich diese vier Mikrofone an den Hauptpunkten befinden (eines vor dem Betrachter, eines hinter dem anderen, das dritte links und das vierte rechts). So funktioniert Ambisonics nicht, aber wir können in anderen Beiträgen darüber sprechen.



Obwohl FOA 4 Kanäle verwendet, unterstützt YouTube auch eine 6-Kanal-Version, die einfach die traditionellen linken und rechten Stereokanäle hinzufügt. Dieses Format heißt FOA mit Head-Locked Stereo...



Besondere Aufmerksamkeit sollte der Codierung von Panorama-Videos (Stereo oder Mono) gewidmet werden, da nicht alle Formate 4 oder 6 Audiokanäle unterstützen. YouTube empfiehlt Folgendes:



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


Wenn Sie Premiere Pro 2018 oder neuer verwenden, ist es am besten, Ihr Video als Quicktime ProRes-Codec zu codieren. Weitere Informationen zu den von YouTube unterstützten räumlichen Audioformaten finden Sie hier .



So erstellen Sie Panorama-Videos in Unity



Eine der vielen Funktionen, die in Unity 2018.1 hinzugefügt wurden, ist die Möglichkeit, Screenshots von der Kamera in einem Format aufzunehmen, das mit YouTube-Panorama-Videos kompatibel ist. Diese Funktion wird in einem Beitrag auf der Unity-Website kurz beschrieben: Stereo 360 Image and Video Capture . Leider gibt es darin keine Szenenreferenz zum Testen.



Theorie



Meistens werden Spielclips aufgezeichnet, während das Spiel läuft. Dies ist in Ordnung für Standardvideos, normalerweise jedoch nicht für Panorama-Videos. Der Hauptgrund ist, dass zum Rendern eines Panoramaspiels ein viel größerer Bereich erforderlich ist, wodurch die Bildrate dramatisch sinkt. Ein Standardansatz besteht darin, jedes Bild im Hintergrund zu rendern und zu exportieren, damit es später in Software von Drittanbietern wie ffmpeg oder Premiere Pro bearbeitet werden kann. Dies werden wir in unserem Tutorial tun.



Das Rendern einer Panoramaszene in Unity ist ein ziemlich einfacher dreistufiger Prozess:



  • Rendern Sie eine Szene in eine Würfelkartenstruktur (Unitys bevorzugtes Format für Panoramatexturen).
  • Konvertieren einer Würfelkarte in eine gleichwinklige Projektion (bevorzugtes Format für YouTube-Panoramavideos)
  • Speichern Sie die äquidistante Projektion als PNG


Die ersten beiden Schritte sind aufgrund der Funktionsweise von Kameras in Unity erforderlich.



Wenn Sie mit Unity vertraut sind, wissen Sie wahrscheinlich, dass die bevorzugte Methode zum Speichern von Panoramatexturen eine Würfelkarte ist, mit der sechs verschiedene Bilder ohne Verzerrung verpackt werden können (siehe unten). Kubische Karten werden häufig für Skyboxen und Reflexionssonden verwendet. Sie sind also wahrscheinlich bereits auf sie gestoßen.





Um eine Panorama-Textur zu erstellen, rendert Unity die Szene sechsmal, jedes Mal in einem anderen Winkel. Die Kamera schwenkt so, als wäre sie an einer der sechs Seiten des Würfels ausgerichtet. Daher sind bei jedem Panorama-Screenshot sechs traditionelle Screenshots miteinander verbunden.



Nach dem Ausfüllen der Würfelkarte besteht der zweite Schritt darin, sie in ein YouTube-kompatibles Format zu konvertieren. Wie wir bereits gesehen haben, benötigt YouTube gleichwinklige Panorama-Videos. Diese Transformation erfordert normalerweise das Codieren komplexer Shader, aber zum Glück wurde Unity speziell dafür eine Funktion hinzugefügt.



Der letzte Schritt besteht darin, die äquidistante Textur in eine PNG-Datei zu exportieren. Nachdem alle Videobilder gerendert wurden, können Sie sie mit einem Programm wie ffmpeg oder Premiere Pro zusammenführen.



Der Code



Der erste Schritt besteht darin, ein Skript zu erstellen (in den folgenden Ausschnitten genannt Camera360) und es an die Kamera anzuhängen, die gerendert werden soll. Der Code ändert sich jedoch abhängig davon, ob das Video in Mono (360 ° / Mono / 2D) oder in Stereo (VR / Stereo / 3D) gerendert werden soll.



Mono



Beginnen wir mit der Mono-Version:



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


Das obige Skript rendert jeden Frame in einer Rendertextur mit Equirectdem Titel , die einen Panorama-Screenshot enthält, der in einer gleichwinkligen Projektion gespeichert ist.



Der 63in der Methode verwendete Wert RenderToCubemapbedeutet, dass wir Screenshots von allen sechs Seiten des Cubes machen möchten.



Beides EyeCubemapund EquirectTexturekann entweder im Editor oder im Code erstellt werden.





Stereo



Der Stereo-Versionscode ist sehr ähnlich, erfordert jedoch einen zusätzlichen Schritt:



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


Um ein Stereobild zu rendern, müssen Sie zwei Würfelkarten rendern. stereoSeparationLegt den Abstand zwischen diesen Würfelkarten fest. Der Standardwert beträgt 64 mm, was ungefähr dem Abstand zwischen dem linken und dem rechten Auge entspricht.





Texturen erstellen und speichern



Die beiden obigen Codefragmente schreiben nur in die Textur, speichern sie jedoch nirgendwo. Wenn Frames auf der Festplatte gespeichert werden sollen, muss dies manuell erfolgen.



Leider ist das Exportieren einer Rendertextur in eine PNG-Datei nicht so einfach, wie es sein sollte. Das erste Problem ist, dass Sie mit Unity nicht direkt auf einzelne Pixel zugreifen können RenderTexture. Zunächst muss die Rendertextur in ein Objekt kopiert werden Texture2D.



Das folgende Codefragment führt genau diese Aufgabe aus und ReadPixelskopiert mithilfe der Methode die Pixel aus der aktuell aktiven Rendertextur .



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


Vorausgesetzt, es FileNameenthält den richtigen Pfad zur PNG-Datei, erledigt der obige Code die Aufgabe. Es muss nur eine kleine Änderung vorgenommen werden: um sicherzustellen, dass das Skript nicht immer wieder dieselbe Datei überschreibt. Fügen Sie dazu einfach den Dateinamenzähler zum wiederholten Umschreiben hinzu frame.png, in das er geschrieben hat frame_0.png, frame_1.pngund so weiter.



Probleme



Es gibt Probleme mit dieser Lösung. Das wichtigste davon ist, dass einige Nachbearbeitungseffekte möglicherweise nicht wie beabsichtigt funktionieren.



Performance



Das Rendern von Panoramarahmen in Unity ist eine sehr teure Aufgabe. In meiner Lösung wird die Szene 6 oder 12 Mal gerendert (je nach Videoformat - Mono oder Stereo). Die Nachbearbeitung, die zum Zusammenführen von Bildern und Speichern jedes Frames auf der Festplatte erforderlich ist, kann die Leistung um den Faktor 10-15 verringern. Wenn Sie ein Video in hoher Qualität (8192 × 8192 Pixel) rendern, kann jeder einzelne Frame eine Größe von über 100 MB haben. Wenn Sie nicht über eine sehr leistungsstarke Maschine verfügen, können Sie natürlich nicht gleichzeitig in Echtzeit spielen und Panoramaaufnahmen exportieren.



Nachbearbeitung



Durch die Vignettierung wird beispielsweise ein dunkler Lichtschein um die Kamera gelegt. Da Unity durch sechsmaliges Rendern der Szene ein Panoramabild erstellt, wird auf jedes Bild ein Vignettierungseffekt angewendet. Infolgedessen ist an den Kreuzungen der Bilder ein seltsamer schwarzer Heiligenschein vorhanden.





Ebenso verursachen Unschärfe- und Blüteeffekte Fehler an den Rändern, was das Vorhandensein von Nähten zeigt. Es gibt keine einfachen Lösungen für dieses Problem, da keiner der von Unity erstellten Nachbearbeitungsstapel für die Arbeit mit Panoramabildern ausgelegt ist.



Unschärfe- und Blüteeffekte können jedoch weiterhin in Maßen angewendet werden. Wenn Sie diese Effekte benötigen, wenden Sie sie am besten in der Postproduktion mit Premiere Pro an.



Linienrenderer



Ein großes Problem bei Panoramabildern besteht darin, dass Linienrenderer möglicherweise nicht richtig angezeigt werden . Wenn eine Linie so eingerichtet ist, dass sie immer auf die Kamera gerichtet sein muss, wird sie beim Rendern in einem Panoramabild von Unity einfach verworfen. Das ist äußerst ärgerlich, weil es keinen wirklichen Grund dafür gibt.



Unity hat eine alternative Version des Zeilenrenderers namens XRLineRenderer entwickelt , die ordnungsgemäß funktioniert. Obwohl nicht alle Funktionen der Standard-Line-Renderer-Komponente unterstützt werden, können Sie die meisten Funktionen implementieren.



Der XRLineRenderer kann auch einfache Glüheffekte erstellen, wodurch die Bedeutung der im vorherigen Abschnitt beschriebenen Probleme verringert werden kann.



Siehe auch:






All Articles