Spotlight als Matrixscheinwerfer

  • Hallo zusammen,


    ich möchte das Verhalten eines Matrixscheinwerfers in der UE modellieren. Dieser besteht aus einer Lichtmatrix, welche wiederum aus vielen einzelnen Lichtquellen (bspw. LEDs) besteht, die unabhängig voneinander angesteuert werden können. Meine Idee ist es, ein Spotlight zu einem Diaprojektor umzufunktionieren. Als Dia möchte ich eine Textur verwenden, die die Lichtverteilung des Scheinwerfers beschreibt.


    Im Bild sieht man, was ich meine. Hier habe ich eine einfache Textur als Light Function verwendet. Jedoch ist diese zur Laufzeit fix. Wenn man sich die verwendete Textur als 2D-Array vorstellt, das aus Grauwerten besteht, könnte man die Textur so beschreiben: [[255, 0], [0, 255]]. Ich möchte diese Werte in jedem Frame anpassen können und die korrespondierende Lichtverteilung erhalten.


    Ich habe nur wenig Erfahrung mit der UE. Leider scheint es auch keine Ressourcen zu geben, die mir bei diesem Problem helfen. Ich habe zwar Tutorials gefunden, wie man mit Spotlights Videos in die virtuelle Welt projizieren kann, aber das ist nicht das, was ich erreichen möchte. Also ich möchte keine vorgefertigte Sequenz von Lichtverteilungen/Grauwerttexturen "abspielen".


    Ich denke, der vielversprechendste Ansatz ist die Light Function. Nur habe ich keine Idee, wie ich die fehlende Dynamik einbringen kann. Der alternative Ansatz, eine eigene Lichtquelle zu programmieren, die einen Matrixscheinwerfer implementiert, ist für mich vermutlich nicht umsetzbar, da ich hier das Rendering innerhalb der Engine verstehen und erweitern müsste und mir dafür schlichtweg das nötige Know-how fehlt.


    Was sind eure Gedanken dazu? Fallen euch evtl. noch andere Ansätze ein, die nicht auf den Light Functions fußen? Habt ihr eine Idee, wie man die beschriebene Dynamik mit Light Functions umsetzen könnte?


    Viele Grüße

    Kiwano

  • Sleepy

    Hat das Thema freigeschaltet.
  • Wichtig wäre, dass du mal schreibst, was du erreichen möchtest. Denn so, wie du es beschreibst, scheint mir das viel zu kompliziert und rechenaufwendig zu sein. Deswegen wäre es schön, mal zu lesen, was das Endergebnis sein soll. Soll es ein Diaprojektor werden, oder was genau hast du vor?

    Aber, soweit ich es verstanden habe, scheint mir das so auch nicht möglich zu sein. Es gibt zwar sowas wie ein Rendertarget, aber ich glaube nicht, dass du da gezielt Punkte setzen kannst, was natürlich auszuprobieren wäre. Also du wirst da schon irgendwie vorgefertigte Texturen verwenden müssen und diese bei Bedarf dann austauschen müssen.

    Allerdings, wie schon gesagt, habe ich dein Ziel, welches du erreichen möchtest, noch nicht so ganz verstanden.

  • Danke für deine Antwort.


    Ich beschäftige mich mit der Simulation von Fahrzeugscheinwerfern. Mein Ziel ist es, einen digitalen Zwilling eines Matrixscheinwerfers zu implementieren. Dieser soll dann im Optimalfall auch die Lichtfunktionen eines solchen Scheinwerfers, wie bspw. blendfreies Fernlicht umsetzen. Also es sollen Objekte - meinetwegen ein einfacher Quader, der ein entgegenkommendes Auto repräsentiert - erkannt und vom Scheinwerfer ausgeblendet werden.


    Dafür muss die Lichtverteilung des Spotlights angepasst werden. Das bedeutet, die Textur muss ständig aktualisiert werden. Die Textur soll aber zur Laufzeit ihren grundlegenden Aufbau (ihre Flächeneinteilung) beibehalten.

    Im Bild ist die Textur in vier Quadrate eingeteilt. Die genaue Einteilung der Textur ergibt sich aus der Auflösung des Matrixscheinwerfers (Anzahl der Lichtquellen, aus welche die Lichtmatrix besteht). Bei einem Scheinwerfer mit einer höheren Auflösung wäre die Einteilung eine andere: Die Quadrate/Rechtecke wären deutlich kleiner und die Anzahl entsprechend größer.


    Mein Ziel ist es, die Grauwerte dieser Quadrate/Rechtecke zur Laufzeit zu verändern. Zum Beispiel möchte ich eines der weißen Quadrate im Beispielbild schwarz einfärben, weil in diesem Bereich ein Objekt aufgetaucht ist, welches nicht beleuchtet werden soll.


    Ich möchte also keinen Diaprojektor bauen. Lediglich die Idee, die Lichtverteilung des Scheinwerfers als Textur darzustellen und von einem Spotlight in die Welt projizieren zu lassen, ähnelt der Funktionsweise eines Diaprojektors.


    Ich hoffe, das macht es etwas verständlicher.

  • Ja ist es. Puh. Das wird definitiv, wenn überhaupt möglich, nicht leicht. Also, da habe ich jetzt keine spontane Idee. Auch wenn ich überlege, ob man vielleicht ein Material bauen könnte, welches in einer Matrix aufgeteilt ist und dann eben halt einzelne Flächen auf Dunkel oder hell schaltet. Aber ich wüsste jetzt nicht, wie du da die Matrix einigermaßen kompakt und übersichtlich wiedergeben könntest.

    Aber, vielleicht solltest du mal in diese Richtung suchen. Da könnte die Funktionsweise von Outline-Shadern vielleicht etwas für dich sein. Modifiziert versteht sich und als Material. Da würde ich vielleicht mal schauen.

    • Offizieller Beitrag

    Eine Antwort nachdem Prinzip tue dies und dann dass gibt es nicht.


    Hier aber mal ein paar Keyword:

    Dynamische Texturen und Render Targets

    Du brauchst eine dynamische Textur, also eine Textur, die sich zur Laufzeit verändert. Du kannst hierfür beispielsweise Render Targets nutzen, um ein Material per Blueprint oder Script zu steuern. Diese kannst du mit Light Functions steuern.

    Materialparameter

    Du kannst einzelne Nodes in deinem Material über Parameter steuern, z.B. einen änderbaren Integer, womit du Farbwerte von 0 - 256 ändern kannst.



    Im Grunde könntest du bei Dunkelheit mit deinem Auto auf eine Wand leuchten, ein Foto davon machen und dieses in eine Graustufenmap umwandeln, um dann mit den Tonwertkorrekturen rumzuspielen.

    IES Lights

    IES Lichter sind Graustufenmaps, die von vielen Herstellern zum Download angeboten werden, um sie beispielsweise in Renderings zu verwenden. Diese IES Lichter sind kostenlos und können von vielen Herstellern heruntergeladen werden.

    Vielleicht findest du IES für Autoscheinwerfer.

    Hier eine IES Library aber ich glaube keine Autoscheinwerfer https://ieslibrary.com/de/durchsuchen

  • Na, ich glaube aber nicht, dass es das ist, was er sucht. Ich denke, da eher an den Kegel einer Taschenlampe, nur dynamisch hat. Deswegen kam ich auch auf die Idee, mit den Outlinern, denn das ganz große Problem wird ja sein, da den entsprechenden Ausschnitt zu finden und zu verdunkeln. Und Outliner machen ja genau das, Kanten suchen und diese dann verdunkeln.

    Allerdings ist das auch wieder nicht so unbedingt eine typische Aufgabe für eine Spieleengine. Somit bin ich mir da jetzt auch nicht sicher, wo man da jetzt genau ansetzen kann. Rendertarget klingt aber schonmal gut. Nur, wie kriegt man das entsprechende Muster auf das Rendertarget?

    • Offizieller Beitrag

    Aus dem Kopf heraus:

    Habs nicht getestet aber ganz grob müsste es so gehen.


    EDIT: Eventuell könnte man das Material auch als Decal auf eine Wand Projezieren.

  • Ja, kommt mir aber recht wackelig vor, wenn du verstehst, was ich meine. Man müsste da noch irgendein Event hineinbringen, sodass die Änderung nur feuert, wenn es relevant ist. Irgendwie mit Linetrace, Overlap oder so. Da würde man eine Menge Rechenzeit sparen können, anstelle eines Timers, der ja auch recht schnell auslösen müsst, um halt auch schnell zu reagieren. Der würde dann aber auch immer wieder laufen, wenn halt 10 Minuten nichts passiert. Allerdings, ich kenne die Vectorscheinwerfer von Audi her, ich denke mal darauf zielt das Ganze auch ab, die Scheinwerfer von Audi beziehen halt nicht nur entgegenkommende Fahrzeuge, sondern auch Radfahrer und Fußgänger mit ein. Also bräuchte man mehrere Linetraces, die einen gewissen Bereich abdecken, und dann halt auf Entfernung gehen. Bei Unterschreitung einer gewissen Distanz wird der Bereich dann halt ausgeblendet.

    Joa, grob gesehen könnte das funktionieren. Leider habe ich keine Zeit das auszuprobieren, auch wenn ich es irgendwie spannend finde.