Konvertieren einer Cubemap in Equirectangular Panorama
Ich möchte konvertieren von cube map [Bild1] in ein equirectangular panorama [abbildung2].
Bild1
Bild2
Ist es möglich, zu gehen, von Sphärisch zu Kubisch (indem Sie die folgenden: Konvertieren 2:1 equirectangular panorama auf die cube map ), verlor aber, wie es rückgängig zu machen.
Bild2 gerendert wird in eine Sphäre mit Einheit.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vorausgesetzt, die Eingabe-Bildes ist in den folgenden cubemap format:
Ziel ist es, das projizierte Bild auf der equirectangular-format etwa so:
Die Umwandlung Algorithmus ist Recht einfach.
Zur Berechnung der besten Schätzung der Farbe der einzelnen pixel in der equirectangular Bild gegeben, eine cubemap mit 6 Gesichter:
das sphärische Bild.
das Gesicht der cubemap und die pixel, in Richtung des Vektors
liegt; wie ein raycast vom Zentrum eines Würfels treffen würde, eine
seine Seiten und einem bestimmten Punkt auf dieser Seite.
Beachten Sie, dass es mehrere Methoden zur Schätzung der Farbe eines pixels im equirectangular Bild gegeben, eine normierte Koordinate (u,v) auf eine bestimmte Fläche einer cubemap. Die einfachste Methode ist, das ist eine sehr grobe Näherung und wird in dieser Antwort der Einfachheit halber ist die Runde die Koordinaten auf einen bestimmten pixel und verwenden, die pixel. Anderen fortgeschrittenen Methoden rechnen konnte, ein Durchschnitt von ein paar benachbarte Pixel.
Die Implementierung des Algorithmus wird variieren, je nach Kontext. Ich habe eine schnelle Umsetzung in Unity3D C#, die zeigt, wie implementieren Sie den Algorithmus in einem realen Szenario. Es läuft auf der CPU, es gibt eine Menge Raum für Verbesserung, aber es ist leicht zu verstehen.
Zur Nutzung der GPU, die ich erstellt einen shader, der die gleiche Umwandlung. Es ist viel schneller als laufen die conversion-pixel für pixel auf, die CPU aber leider die Einheit erlegt Auflösung Einschränkungen auf cubemaps, damit es seine Nützlichkeit beschränkt sich in Szenarien, wenn eine hohe Auflösung input-Bild verwendet werden.
Die Qualität der entstehenden Bilder erheblich verbessert werden kann, indem entweder beschäftigt eine differenziertere Methode zur Schätzung der Farbe eines pixels während der Konvertierung oder Nachbearbeitung das resultierende Bild (oder beides, eigentlich). Zum Beispiel ein Bild der größeren Größe erzeugt werden, wenden Sie einen Unschärfe-filter und dann das Downsampling auf die gewünschte Größe.
Habe ich eine einfache Unity-Projekt mit zwei editor-Assistenten, die zeigen, wie man richtig nutzen Sie den C# - code oder die shader, die oben gezeigt. Holen Sie es hier:
https://github.com/Mapiarz/CubemapToEquirectangular
Denken Sie daran, die richtige import-Einstellungen in der Einheit für Ihre Eingabe Bilder:
a = Mathf.Max(new float[3] { Mathf.Abs(x), Mathf.Abs(y), Mathf.Abs(z) });
- denn ein zurück, wie 0, wenn x -, y -, z-Werte unter 1, wodurch xa, xy und xz als unbestimmt, aufgrund geteilt durch null problem, bin ich etwas fehlt ? meine c++ - Zeile sieht wie folgt aus:a = maximum(abs(x), abs(y), abs(z));
(ich habe eine maximum-Funktion von meinem eigenen).cube2sphere die den gesamten Prozess automatisiert. Beispiel: