[texchanges] - bisher recht unbekannte Möglichkeit für einfachen Texturtausch bei Objekten und Fahrzeugen

Willkommen in der OMSI-WebDisk!
Als Gast kannst du nur Inhalte in deiner ausgewählten Sprache sehen. Registrierte Nutzer können die Sichtbarkeit anderer Sprachen in ihrem Kontrollzentrum aktivieren, weitere Infos hier.
Alle Themen sind in den Foren mit einer Sprachflagge gekennzeichnet: = Englisch [EN], = Deutsch [DE], = Französisch [FR]. Wenn du die angegebene Sprache nicht beherrschst, schreibe auf Englisch!
  • Moin liebe OMSI-Gemeinde,


    Dass im Zusammenhang mit Fahrzeugen oder Szenerieobjekten manchmal auf einem bestimmten Mesh eine statische Textur nicht ausreicht, sondern es stattdessen notwendig wird, während des Spiels zwischen verschiedenen Texturen zu wechseln, ist erstmal nichts besonderes und findet häufig Verwendung (man denke z.B. an Repaints bei Bussen, Fahrscheindrucker mit verschiedenen Menüs oder Haltestellenwerbungen bzw. seperate Werbetafeln, gerade bei letzterem soll oft auch eine zufällige Textur gewählt werden).


    Gerade weil das ein relativ triviales Problem ist, biete OMSI gleich mehrere Möglichkeiten an, einen solchen Texturtausch umzusetzen, zwei davon sind (würde ich mal sagen) relativ weit verbreitet und bekannt, allerdings gibt es noch eine dritte Möglichkeit, die scheinbar in der OMSI-Community bisher noch kaum Verwendung findet, die ich deshalb hier nun einmal kurz vorstellen möchte. - Vielleicht gibt es hier den ein oder anderen der das Prinzip schon kennt, in meinem ganzen OMSI-Verzeichnis habe ich jedoch keinerlei Objekte und Fahrzeuge finden können, die es verwenden - mit Ausnahme des Spandauer Doppeldeckers von Marcel eben - dort wird es verwendet, um die Rollbandtexturen durchzuwechseln.


    Bevor ich jetzt damit anfange, vielleicht nochmal eine ganz kurze Übersicht über die anderen Möglichkeiten:

    1. [matl_freetex]

    Die mMn. simpelste und am einfachsten zu verstehende Möglichkeit ist die Verwendung des [matl_freetex]-Befehls, damit können wir einfach eine auf einem Mesh bestehende Textur als Variabel definieren und mit einer Stringvariable verbinden, die Stringvariable kann dann während des Spiels beliebig von einem Script verändert werden und somit sehr einfach die Textur durchgetauscht werden. [matl_freetex] findet vor allem bei Fahrscheindruckern Anwendung, um die Bildschrimtexturen (=Menüs) durchzuschalten - je nach dem, was gerade angezeigt werden soll. Der Vorteil hier ist, dass man sehr flexibel ist, da man im Script in die jeweilige Variable quasi alles eintragen kann, weshalb es vor allem praktisch ist, wenn man aus einem Pool von sehr vielen (teilweise in Unterordnern sortierten) Texturen auswählen muss. Allerdings ist die Gefahr auch groß, versehentlich eine Textur zuzuweisen, die garnicht existiert, was im Spiel dann natürlich unschön aussieht. Außerdem ist es mit Freetex ziemlich aufwendig, eine Textur zufällig auszuwählen (man würde dafür ein recht komplexes Script mit vielen if-Blöcken benötigen - je nach dem, wie viele mögliche Texturen es gibt.

    Daher gibt es noch eine andere, sehr bekannte, Möglichkeit:

    2. Klassische "Repaints" ([CTCTexture])

    Überlicherweise bei Fahrzeugen für das Repaint verwendet - aber auch bei Objekten (z.B. Werbetafeln) oft gesehen bzw. selbst früher immer dafür verwendet. Das "CTC"-System. Das Prinzip ist hier etwas anders: Man definiert separat in einer CTI-Datei ein Texturschema und legt die Datei in einem Ordner ab. Per Script kann dann über eine Index-Variable einfach entschieden werden, welches Farbschema aktiviert werden soll (für zufällige Texturen weist man dann eben eine zufällige Zahl in richtiger Range zu). Auch hier gibt es noch zwei weitere große Vorteile gegenüber dem Freetex-System (abgesehen von der einfacheren Umsetzbarkeit von Zufallstexturen):

    Zum einen ist das ganz sehr einfach mit neuen Texturen erweiterbar: Ich kann einfach neue Texturen im Ordner ablegen, eine cti-Datei erzeugen, mein Repaint entsprechend eintragen und zack - fertig ist es. Keine Notwendigkeit, irgendwo im Script, der model.cfg oder dergl. etwas herum pfuschen zu müssen (gut bei Zufallstexturen müsste man ggf. noch die Range bei der Generierung der Zufallszahl anpassen, aber trotzdem: mit freetex wäre es um einiges einfacher).

    Außerdem ist dies die einzige, elegante Möglichkeit, Texturwechsel als "Paket" zu definieren. Wir kennen das alle von Bus-Repaints. Wir haben eine Textur für den Wagenkasten, aber dann noch eine weitere für den Innenraum, Sitze nochmal separat usw. Dennoch sollen alle diese Texturen als ein Paket zu verstehen sein und gemeinsam ausgetauscht werden. Auch das geht hier natürlich sehr leicht.

    Doch es gibt auch hier natürlich aus meiner Sicht auch einen Nachteil: Aufgrund der hohen Flexibilität ist die erstmalige "Einrichtung" einer CTC relativ aufwendig - gerade bei Objekten ist das konfigurieren in der sco, sowie das anlegen der Werbungen in cti-Dateien relativ viel Schreibarbeit für ein paar Tauschtexturen. Geht das nicht einfacher? Lange dachte ich "nein", aber doch es geht! Und wie? Das zeige ich jetzt:

    3. [texchanges]

    Hier haben wir nun die neue "Entdeckung". Das Prinzip der texchanges ist ähnlich, wie bei CTC. Es wird eine separate Konfigurationsdatei angelegt, in der alle eintauschbaren Texturen eingetragen und mit einer Zahlvariable verbunden werden können. Über diese Variable kann dann einfach indexbasiert gesteuert werden, welche Textur verwendet werden soll. Im Gegensatz zu CTC können wir hier keine Texturpakete definieren, sondern immer nur einzelne Texturen tauschen, das ist aber in den meisten Fällen (z.B. bei Haltestellenwerbungen ja auch völlig ausreichend). Dafür ist das ganze doch um einiges kompakter und dennoch relativ Robust, da wir die Texturnamen dennoch separat in einer Datei festlegen und nicht (wie bei freetex) direkt in das Script schreiben müssen.


    Als Beispiel und zu Demonstrationszwecken soll nun mal eine Werbeteafel mit vier verschiedenen Testwerbungen erstellt werden. (Bitte nicht über das Model beschweren, das ist hier ein spontaner "One Minute Craft" - es geht ja nur um das Prinzip.

    Wichtig ist - wie eigentlich - immer, dass ich in Blender auf der Texturfläche, die später getauscht werden soll, eine entsprechende Textur zuweise, überlicherweise verwendet man für so etwas eine Dummy- oder "Leer"-Textur, in meinem Fall habe ich nun einfach die erste Werbung "Werbung_01.dds" zugewiesen. An sich ist das völlig egal. Ihr müsst nur genau wissen, welche Textur ihr in Blender zugewiesen habt. :D


    Ansonsten habe ich einfach nur ein ganz normales Szenerieobjekt mit sco-Datei, model-Ordner mit o3d-Datei und texture-Ordner mit meinen Werbungen erstellt. In meinem Fall liegen alle Werbetexturen direkt im Texture-Ordner und heißen "Werbung_01.dds" bis "Werbung_04.dds". Natürlich kann man auch noch einen Unterordner verwenden, das geht genau so. Man muss dann eben nur die Texturpfade entsprechend anpassen.


    Aber jetzt kommt die Magie:

    Zusätzlich zur sco-Dateie erstelle ich noch eine cfg-Datei, die ich nun "Werbetafel_chtex.cfg" nenne. Auch hier gilt. Der Name ist aber völlig egal, ich muss ihn nur gleich richtig in der sco einbinden.

    Diese cfg-Datei bekommt nun folgenden Inhalt:


    Code: Werbetafel_chtex.cfg
    [newtexchangemaster]
    Werbung_01.dds
    WerbungIndex
    
    [entries]
    4
    texture\Werbung_01.dds
    texture\Werbung_02.dds
    texture\Werbung_03.dds
    texture\Werbung_04.dds

    Was bedeutet das jetzt? Oben unter [newtexchangemaster] wird als erstes eine Textur angegeben. Hier muss die jeweilige Textur eingetragen werden, die ihr in Blender auf das Objekt gemappt habt. D.h., wenn ihr eine Dummy-Textur verwendet habt, tragt ihr hier den Dummy ein, damit Blender weiß, welche Textur überhaupt auszutauschen ist (im Zweifelsfall kann man auch direkt die o3d in einem Texteditor öffnen, relativ weit unten, sind die Texturen im Klartext zu finden, die dort angegebene Textur muss exakt mit der eingetragenen übereinstimmen.

    Darunter folgt eine Variable - in meinem Fall WerbungIndex - die dient als Steuervariable, mit der wir festlegen, welche der Unten angegebenen Texturen verwendet werden soll. (Natürlich tragen wir die nachher noch richtig in eine Varlist ein. ^^)

    Tja, und dann folgt unter [entries] einfach nur eine Auflistung meiner "registrierten" Tauschtexturen. Zuerst die Anzahl der folgenden Einträge, dann die Einträge selbst. Wichtig ist hier, dass diese Pfade immer ausgehende von der cfg angegeben sein müssen. Ich könnte die Datei theoretisch auch genau so gut mit in den texture-Unterordner legen, dann müsste bei allen Einträgen das texture\-Präfix jedoch wegfallen.


    Dann tragen wir diese cfg-Datei noch in der sco unter unserem Mesh-Eintrag, wiefolgt ein:

    Code: Werbetafel.sco
    [mesh]
    Werbetafel.o3d
    
    [texchanges]
    Werbetafel_chtex.cfg

    Auch hier nochmal als reminder: Wenn ich die cfg-Datei mit in den texture-Ordner gelegt hätte, müsste ich hier dann natürlich texture\Werbetafel_chtex.cfg schreiben. :)


    Zuletzt müssen wir jetzt nur noch die Variable und ein Script definieren, das die Variable steuert. Dazu erzeuge ich eine Varlist und ein Script im script-Unterordner und trage beide Dateien auf dem bekannten Wege in der sco mit ein:

    Code: Werbetafel.sco
    [varnamelist]
    1
    script\Werbetafel_varlist.txt
    
    [script]
    1
    script\Werbetafel.osc

    In der Varlist wird einfach nur die vorhin verwendete Variable WerbungIndex eintragen:

    Code: script\Werbung_varlist.txt
    WerbungIndex

    Im Script kann ich nun eine beliebige Logik programmieren, mit der die Variable einen Wert bekommt, der dann einfach als Index entscheidet, welche der Texturen in der cfg verwendet werden soll.

    Da es sich in meinem Fall um eine Werbetafel handelt, die bei der Initialisierung einmal eine zufällige Textur bekommen soll, sieht mein Script wiefolgt aus:

    Code
    {init}
        4 random (S.L.WerbungIndex)
    {end}

    Die 4 steht dort, weil wir insgesamt vier Werbungen haben und somit eine zufällige Zahl zwischen 0 und 3 ausgewählt wird (nullbasierter Index). Diese Zahl müsste ich also ändern, wenn ich weitere Werbungen hinzufüge. Allerdings könnte man ihn auch z.B. in eine constfile auslagern.


    Das ist tatsächlich schon alles. Die Werbetafel funktioniert und erhält jedes mal eine zufällige Textur:


    Man sieht also, das ganze ist deutlich einfacher und "schlanker" als ein CTC, aber dennoch auch robuster und somit ebenfalls in gewisser Weise einfacher als mit freetex zu arbeiten.

    Übrigens. Es ist ohne Probleme möglich, in einer chtex.cfg-Datei auch mehrere [newtexchangemaster]-Einträge mit jeweils eigenen Entries einzutragen, wenn man verschiedene Variablen verwendet, kann man dann auch mehrere Tauschtexturen separat voneinander umsetzen.

    Ich empfehle dazu nochmal einen Blick in die folgende Datei aus der OMSI-Basisinstallation: OMSI 2\Vehicles\Anzeigen\Rollband_SD79\chtex_rollband.cfg


    Ich hoffe, das hilft einigen weiter. Es ist - aus meiner Sicht - gerade für Werbetafeln oder Haltestellenhäuser wirklich eine viel einfachere Möglichkeit, Tauschtexturen umzusetzen und es funktioniert bei Objekten genau wie bei Fahrzeugen.

    Als Referenz findet ihr auch nochmal meine komplette Werbetafel im Anhang als Download zum angucken und nachvollziehen. :)

  • ma7t3

    Hat den Titel des Themas von „[texchanges] - bisher recht unbekannte Möglichgeit für einfachen Texturtausch bei Objekten und Fahrzeugen“ zu „[texchanges] - bisher recht unbekannte Möglichkeit für einfachen Texturtausch bei Objekten und Fahrzeugen“ geändert.