Spiegel (mit Echtzeitreflexion)

Aus LOTUS Wiki DE
Wechseln zu: Navigation, Suche

Rückspiegel und ähnliche (plane) Echtzeitreflexionen werden realisiert, indem LOTUS vor dem Hauptrender-Vorgang für jeden Spiegel einen zusätzlichen Render-Vorgang (aus "Sicht" des Spiegels) durchführt und das Ergebnis in eine Textur speichert. Diese wiederum wird dann als normale (!) Textur für das Spiegel-Mesh verwendet.

Allgemeines

Zu den Echtzeitreflexionen für (Rück-)Spiegel sind folgende Dinge zu beachten:

  • Für jeden Rückspiegel ist grundsätzlich ein eigener Eintrag unter "Echtzeit-Spiegel" anzulegen. Jeder Eintrag dort kostet aber Performance, solange der entsprechende Spiegel im Sichtfeld liegt, da er einen eigenen Render-Vorgang darstellt. Liegen aber zwei Spiegel nahe beieinander und sind ähnlich ausgerichtet, lässt sich ggf. "tricksen", indem sie sich eine Textur "teilen" (durch ein angepasstes Mapping der Einzelspiegel-Objekte).
  • Die Spiegel-Kamera wird in der Mitte des Spiegels platziert und senkrecht zur Spiegelfläche ausgerichtet. Die Berechnung des finalen Winkels auf Basis der Position der User-Kamera wird von LOTUS übernommen.
  • Jede Spiegel-Kamera wird nur gerendert, wenn der Mittelpunkt (plus der angegebene Radius) im Sichtfeld der User-Kamera liegt. Spiegel-Kameras werden momentan nur gerendert, wenn sich der User in einer Innensicht befindet.
  • Die erzeugte Textur wird explizit als "normale" Textur verwendet! Nicht als Reflexionstextur o.Ä.! Die Simulation der Reflexion erfolgt ja bereits beim Rendern der Textur.
  • Ebenso werden alle Beleuchtungseffekte der Spiegelfläche deaktiviert, weil die aktuelle Beleuchtung direkt aus der gerenderten Textur hervorgeht.

Durchführung

Blender

Ein typischer Rückspiegel kann so aussehen:

Der Spiegelfläche muss eine eigene "Dummy"-Textur zugewiesen werden. Sie sollte ein günstiges Seitenverhältnis aufweisen (hier 1:2), so dass sie möglichst bildfüllend auf die Spiegelfläche draufgemappt werden kann:

Jeder Spiegel sollte über eine eigene Dummy-Textur verfügen, damit nachher im ContentTool gleich getrennte Materialien angelegt werden.

Script

Im Script muss für jede Spiegel-Textur eine Integer-Public-Variable mit dem Namen mirrortex_# (# = Index des Spiegels, beginnend ab 0) angelegt werden, in die LOTUS die Textur-ID reinschreiben kann und auf die dann die Materialeigenschaften zugreifen können. Falls das Fahrzeug drei Spiegel hat also:

mirrortex_0: integer;

mirrortex_1: integer;

mirrortex_2: integer;

ContentTool

Es muss nun für jeden Spiegel links im Abschnitt "Echtzeit-Spiegel" ein Eintrag angelegt werden:

Jeder Spiegel hat folgende Parameter:

  • Name: Nur für die Liste
  • Ursprung: Mittelpunkt der Spiegelfläche und Punkt, von dem aus die Spiegelkamera "schaut":
  • Richtungs- und Höhen-Winkel: Die Ausrichtung der Spiegelflächen-Normalen – im folgenden Bild der blaue Pfeil:
  • Öffnungswinkel: Wie groß ist das Bildfeld des Spiegels?
  • Ist eine Reflexion: Noch werden zwar keine Monitore unterstützt – später aber dient dieser Parameter der Unterscheidung zwischen Spiegeln und Monitoren (z.B. ändert sich die Perspektive der Überwachungskamera nicht, wenn sich die Perspektive der User-Kamera ändert ;-) )
  • Radius des Spiegelobjektes: Wenn sich der Mittelpunkt der Spiegelfläche aus dem Blickfeld bewegt, würde LOTUS sofort das Rendern einstellen. Der restliche Spiegel könnte aber noch im Blick sein und dementsprechend sichtbar einfrieren. Um diesen Effekt zu vermeiden, gibt man diesen Radius gewissermaßen als Toleranzgrenze an.
  • Textur-Breite und -Höhe: Die Auflösung der Textur, in die gerendert werden soll. Hierüber ergibt sich automatisch das Seitenverhältnis, mit dem das Spiegelbild gerendert werden soll.

Zuletzt muss das Material entsprechend konfiguriert werden:

  • Als Materialtyp empfiehlt sich "Direct Texture", da alle Lichteffekte bereits direkt über die Reflexions-Textur realisiert werden. Wenn es draußen dunkel wird, dann wird das Spiegelbild von alleine dunkel ;-)
  • Bei der Textur wird hinten der Haken gesetzt und die entsprechend im Script angelegte "mirrortex_#"-Variable ausgewählt