Blink-Animation für einfache Scenery-Objekte

  • Guten Abend!


    Wie kann ich eine Blink-Animation für einfache Scenery-Objekte erstellen? Das Objekt soll abwechselnd sichtbar und wieder unsichtbar gemacht werden. Ein Beispiel für eine Anwendung wäre ein Blinklicht, das einfach nur in regelmäßigen Abständen an und wieder aus gehen soll. Muss ich den Weg über eine Blender-Animation gehen oder gibt es auch einen Weg mit LUA-Script?

  • Du kannst ein Lichtnode in Blender erstellen und das Node per Script ein - und ausblenden lassen, kommt dann einem Blinkeffekt gleich, die Ampeln an Levelcrossings funktionieren zum Beispiel auch so.

    -Hier steht nichts-

    2 Mal editiert, zuletzt von 99 245 ()

  • Node auf 0 skalieren funktioniert leider nicht, laut Briage-Manual nimmt das IA-Format nur Position und Rotationen. Ich habe auch bereits probiert, bei einem "Scriptable Scenery Blueprint" bei Script Component ein Testskript einzutragen, aber in der Logmate-Datei habe ich keine Ausgabe von dem Skript finden können. (Also keine Zeile mit "Hello World!") Eine andere Möglichkeit wären ja noch animierte Texturen, die abwechselnd die richtige Textur und eine transparente Textur darstellen, aber das ist halt nicht der sauberste Weg.


    Testskript:

    Code: testscript.lua
    function Initialise()
        Print( "Hello World!" )
    end
  • Es kommt immer darauf an, was Du bauen willst.

    Skalierungsanimationen gehen natürlich nicht. Vielleicht kannst Du aber den node einfach um 180 Grad drehen oder irgendwohin schieben, wo er nicht gesehen wird?

    Aber warum sind animierte Texturen nicht der sauberste Weg?

  • Wenn ich das Blinklicht durch eine animierte Textur darstellen will, dann muss ich extra zur normalen Textur noch eine "unsichtbare" Textur erstellen, was ich unnötig finde.Außerdem lässt sich dann das Verhältnis von der Ein-Zeit zur Aus-Zeit nicht mehr so einfach steuern, d.h. wenn das Licht unregelmäßig blinken soll. Das Licht ist dann immer gleich lang ein wie aus, es kann nicht länger ein als aus, oder umgekehrt, sein.

  • Skalierungsanimationen wären in vielen Situationen ein Träumchen, werden aber leider nicht unterstützt *shau*

    Der einfachste Weg ist aus meiner Sicht auch das gleichzeitige bewegen der An- und Aus-Optik oder wegdrehen des Blinklichts, auf dessen Rückseite sich die Aus-Optik befindet. Aber da mir das Drehen da etwas unsicherer war - trotz harter Übergänge der Animationen - hab ich bei meinem Andreaskreuzen das mit der Austausch-Bewegung gemacht. Nicht dass man doch mal ein flipping sieht :ugly:


  • Es ist natürlich praktisch, wenn man noch ein Mesh hat, worin man das Licht verstecken kann. Aber gibt es eine Möglichkeit, eine ViewerFacing-Plane (eine Fläche, die sich immer zum Spieler dreht, zB bei Vegetation oder Lichtern) ohne irgendein anderes zusätzliches Objekt, worin man die Plane verstecken kann, "unsichtbar" zu machen? Ein anderer Weg als über eine transparente Textur fällt mir da nicht mehr ein. Um 180° Rotieren (mit Backface Cullling) geht auch nicht, da die Fläche trotzdem immer zum Spieler gerichtet sein wird.


    Anwendungsfall wäre ein Standalone-Licht, das blinken soll.

  • Andere Frage: Kann man in ein Scenery-Objekt ein blinkendes Spot-Light integrieren? Gibt es überhaupt eine Möglichkeit, Lua-Skript in ein Objekt einzubinden, das nicht mit dem Gleis verbunden ist (wie zB BÜs, Signale etc.)? Wofür ist der sog. "Scriptable Scenery Blueprint" dann überhaupt gut?


    Edit: Ich habe es nun nach stundenlangem Herumprobieren und mithilfe von Kollegen aus dem Train Sim Modding-Discord geschafft, das Licht skriptgesteuert und mit Point Light blinken zu lassen.

    2 Mal editiert, zuletzt von RelaxXio () aus folgendem Grund: Update der Situation

  • RelaxXio

    Hat das Label gelöst hinzugefügt.
  • Man könnte auch mit einer Animationsschleife das Polgon mit der Lichttextur hin und her verschieben. (Move) Dabei keine Interpolierungkeys setzen. Der Move Anim bestände nur aus 2 Keys.(AN und Aus-Move vor -Move zurück)

    Im ausgeschalteten Zustand läge das Polygon im Lichtkasten um im eingeschalteten Zustand in den Vordergrund (Move nach vorne) und damit aus dem Lichtgehäuse ragt. Würde Niemand merken.

    Die Animation wäre sehr klein und müsste mit der Animation des Bahnüberganges einhergehen.

  • Es ist schon wieder ein paar Tage her, seit ich zuletzt etwas zu diesem Thema geschrieben habe, aber jetzt habe ich das blinkende Standalone-Warnlicht mit Point Light fertiggestellt.


    Als erstes braucht man dazu ein klassisches Scenery-Objekt, in Blender erstellt. Dieses enthält einen "licht_day" Node, welches ein ausgeschaltetes Licht mit TexDiff-Shader darstellt, und einen "licht_night" Node mit dem eingeschalteten Licht (Tex) und einem runden Lichtschein (AddATex, ViewFacing). (Man kann auch noch einen 1x1x1m großen, unsichtbaren Würfel hinzufügen, um das Objekt im Editor leichter auswählbar zu machen.) Bei der statischen, nicht-blinkenden Versionen im TS des Lichts sorgen die Anhängsel "_day" und "_night" dafür, dass die jeweiligen Nodes zum richtigen Zeitpunkt angezeigt werden.


    Als nächstes erstellt man im BlueprintEditor einen "Scriptable Scenery Blueprint", referenziert die IGS-Datei mit dem Licht als Geometry ID und fügt bei der Script Component das LUA-Skript ein, welches abwechselnd die Nodes licht_day und licht_night sichtbar macht.


    Im nächsten Schritt erstellt man einen "Point Light Blueprint", weist ihm irgendeine IGS zu und wählt eine Farbe.


    Im wiederum nächsten Schritt erstellt man einen normalen "Scenery Blueprint" und fügt ihm zwei Child-Objekte hinzu: Einmal den vorhin erstellten "Scriptable Scenery Blueprint" und das Point Light. Beim Scenery Blueprint wird auch der Name und die Kategorie eingestellt, unter der das Licht im TS später gefunden werden soll. Dann exportiert man den Scenery Blueprint mit allen dazugehörigen Objekten ("Export With References").


    Auf das geskriptete Blinklicht haben die Anhängsel _day und _night allerdings keinen Einfluss, weshalb das Licht durchgehend blinken würde, ungeachtet der Tageszeit im Spiel. Das muss im Skript Pi mal Daumen mit voreingestellten Zeiten geregelt werden. (Es geht meines Wissens leider nicht besser.) Nodes werden im Skript mit "ActivateNode" aktiviert/deaktiviert, das Point Light mit "Activate". Mehr dazu siehe hier und hier.


    Womit ich außerdem noch Probleme hatte, war die Regelung der An- und Aus-Zeiten im TS für verschiedene Tages- und Jahreszeiten. SysCall("GetSeason"); gibt nur, wenn es aus dem Update()-Loop aufgerufen wurde, korrekte Werte zurück. Da man aber pro Szenario nicht für jeden Frame die Jahreszeit erneut abfragen muss, lässt sich das mit einer Funktion regeln, die nur beim ersten Durchlauf ausgeführt wird:


    Das war bei mir schlussendlich der Weg, der zur Lösung geführt hat.