Fahrzeug-SDK

Aus OMSIWiki
Wechseln zu:Navigation, Suche

Fahrzeug-SDK

Verfasser: Rüdiger Hülsmann

Import ins OMSIWiki: Marcel Kuhnt

Vorbemerkungen

Ziel des SDKs

Ziel dieses SDKs und Tutorials ist der Import von Fahrzeugen nach OMSI, deren Animation sowie die Einstellung fahrzeugspezifischer Parameter.

Dieses SDK behandelt weder die 3D-Modellierung von Fahrzeugen in Blender noch den Umgang mit Bildbearbeitungssoftware zum Erstellen von Texturen. Dies wird im Rahmen des vorliegenden SDKs als bekannt vorausgesetzt. Hinweise und Tipps zu 3D-Modellierung, den Umgang mit Blender und Bildbearbeistungssoftware beschränken sich somit auf den Umfang, der für den korrekten Import der Fahrzeuge notwendig ist.

Aufbau der Bus-Datei

Die Bus-Datei (*.bus, alternativ auch *.ovh) ist das wesentliche Element zur Definition eines Fahrzeugs. Sie enthält den Fahrzeugnamen, die zu verwendenden Modell- und Soundkonfigurationen, die Verweise auf die Scriptdateien sowie die allgemeinen physikalischen Daten. Im Aufbau ist sie eine normale OMSI-Konfigurationsdatei, das heißt, die bereits bekannten Konventionen zu Schlüsselwörtern und Kommentaren gelten auch hier.

Im Folgenden werden die enthaltenen Schlüsselwörter und die dazugehörigen Datensätze kurz erklärt.

Fahrzeugname und -beschreibung

[friendlyname]
{Hersteller}
{Fahrzeugtyp}
{Anstrich}

Definition der Einträge im Fahrzeugauswahlmenü. "Anstrich" ist der Name des Standardanstrichs, wenn keine Sonderlackierung (z.B. Werbung) aktiv ist.

[description]
{Beschreibung}
[end]

Fahrzeugbeschreibung im Fahrzeugauswahlmenü. "Beschreibung" ist ein Fließtext beliebiger Länge, welcher auch Zeilenwechsel enthalten darf. [end] markiert dann das Ende dieses Textes.

Fahrzeugnummer

[number]
{Dateiname.org}

Hiermit wird eine Wagennummerndatei festgelegt, welche sämtliche verfügbaren Wagennummern definiert. Der Eintrag fällt weg, wenn für das Fahrzeug keine Wagennummern vergeben werden sollen (bspw. bei privaten Fahrzeugen).

Kfz-Kennzeichen

Es kann gewählt werden zwischen zwei Varianten:

  1. Freie Wahl des Kennzeichens (bei KI-Fahrzeugen wird dann auf die Liste "registrations.txt" zurückgegriffen)
  2. Automatische Erzeugung des Kennzeichens anhand der Wagennummer

Für das erste Verfahren reicht der Befehl

[registration_free]

Für das zweite Verfahren wird der folgende Befehl verwendet:

[registration_automatic]
{Präfix}
{Postfix}

Das Kfz-Kennzeichen wird dann aus Präfix + Nummer + Postfix zusammengesetzt.

Beispiel: Sei die Wagennummer 3313, der Präfix "B-V" und der Postfix "H", dann ist das resultierende Kennzeichen für diese Wagennummer "B-V3313H".

Fahrzeuge, bei denen Wagennummer und Kfz-Kennzeichen voneinander abweichen, benötigen sowohl den Eintrag [number] als auch [registration_free]. Eine automatische Zuordnung von voneinander abweichenden Wagenummern und Kfz-Kennzeichen ist momentan noch nicht möglich.

Kilometerstand

[kmcounter_init]
{Baujahr}
{Jahreslaufleistung}

Aus diesen beiden Werten (Jahreslaufleistung in km) errechnet OMSI beim Platzieren des Fahrzeuges einen zum aktuellen OMSI-Datum passenden Kilometerstand

Zu verwendende Konfigurationsdateien

Konfigurationsdatei für den Fahrzeugsound:

[sound]
{Dateiname.cfg}

Konfigurationsdatei für den Fahrzeugsound im Falle des Einsatzes als KI-Fahrzeug (ist diese Datei nicht angegeben, wird auf die normale Sound-Konfigurationsdatei zurückgegriffen):

[sound_ai]
{Dateiname.cfg}

Konfigurationsdatei für das 3D-Modell

[model]
{Dateiname.cfg}

Konfigurationsdatei für die Laufpfade im Innenraum

[paths]
{Dateiname.cfg}

Konfigurationsdatei für Sitzplätze, Fahrscheinpositionen usw.

[passengercabin]
{Dateiname.cfg}

Import des 3D-Modells

Kommen wir nun zum interessanten Part: Dem Import eines fertigen Fahrzeugs in OMSI. An dieser Stelle werden die Bedienung von Blender und grundlegende Modellierungstechniken als bekannt vorausgesetzt, es soll hier rein um die OMSI-spezifische Ausrüstung der Modelle sowie deren Export und Import gehen. Werfen wir zunächst einen Blick auf das Modell, welches wir nun nach OMSI importieren wollen:

SDK-Demobus in Blender

Dieses auf die Schnelle entstandene Modell fiktiven Vorbilds ist natürlich nur sehr sparsam detailliert, dennoch verfügt es über die wesentlichen Funktionen, die für die Verwendung in OMSI wichtig sind.

Sinnvoll ist es, beim Durcharbeiten dieses Tutorials die beigefügte Modelldatei "Testbus.blend" [Hinweis: Ist hier im Wiki noch nicht verfügbar!!!] geöffnet zu haben, um das Beschriebene sogleich am echten Modell nachvollziehen zu können.

WICHTIG

Allgemeine OMSI-Baukonvention ist folgendes Koordinatensystem:

  • x-Achse nach rechts
  • y-Achse nach vorne
  • z-Achse nach oben

Außenmodell

Wagenkasten und Spiegel

Der erste Schritt zu einem neuen Fahrzeugmodell ist in der Regel die Einbindung des Wagenkastens.

Außenmodell des Wagenkastens

Das ist das Modell des Wagenkastens, also die reine Außenhülle des Fahrzeuges. Die Außen- und Innenspiegel sind hierbei bereits enthalten, da diese dieselbe Textur wie der Rest des Wagenkastens verwenden.

BAUTIPP

Starre, also nichtanimierte Bauteile, die später in OMSI die gleichen Materialeigenschaften haben sollen, sind nach Möglichkeit in einer o3d-Datei zusammenzufassen, wenn in den jeweiligen Einzelobjekten stets dieselbe Textur verwendet wird.

Für die Funktion der Spiegel genügt es, den Spiegelflächen eine Standard-Reflexionstextur zuzuweisen, die von OMSI automatisch als solche anhand des Dateinamens erkannt wird:

Rückspiegel

Hierbei handelt es sich um Texturen mit dem Dateinamen reflexion0.bmp, reflexion1.bmp, usw. Der Index 0...n verweist auf den dazugehörigen Eintrag der Reflexionskameras, die in der Bus-Datei definiert sind. Ist also die Reflexionskamera 1 für den rechten Außenspiegel zuständig, muss in Blender für den rechten Spiegel die Textur reflexion1.bmp verwendet werden. Alles Weitere erledigt OMSI automatisch.

Für den OMSI-Import erzeugen wir nun zunächst eine 3D-Datei im X-Format. Hierzu wird der Wagenkasten im Object Mode selektiert, danach folgende Funktion im Menü aufgerufen:

Aufrufen des X-Exporters unter Blender Korrekte Einstellungen für die folgende Konvertierung ins o3d-Format

Stellen Sie sicher, dass alle Optionen wie gezeigt eingestellt sind und exportieren Sie den Wagenkasten mit Klick auf Export Sel, wodurch nur das selektierte Objekt exportiert wird. Geben Sie der Datei einen entsprechenden Namen, z. B. testbus_body.x.

Nun muss die X-Datei noch ins OMSI-eigene o3d-Format konvertiert werden. Rufen Sie hierzu den O3D-Konverter auf:

O3D-Konverter

Klicken Sie auf Convert... und wählen Sie die eben erstellte X-Datei aus. Die O3D-Datei wird nun erzeugt.

Um diese nun in OMSI darzustellen, muss der Dateipfad in die model.cfg des Fahrzeugs eingetragen werden:


-------------------
Body
-------------------

[mesh]
modeldata\testbus_body.o3d

Die Überschrift Body dient hierbei als Kommentar zum leichteren Auffinden, was im Sinne der Lesbarkeit auch konsequent fortgeführt werden sollte. Jede O3D-Datei wird mit dem [mesh]-Schlüsselwort aufgerufen, welches als Parameter den relativen Dateipfad zur O3D-Datei benötigt. In diesem Fall liegt die O3D-Datei also im Unterordner modeldata.

Dann wollen wir uns das erste Ergebnis einmal in OMSI ansehen:

Erster Screenshot in OMSI!

Schon nicht schlecht, der Wagen wirkt aber noch ein wenig matt und spielzeughaft. Wir sollten noch ein bisschen metallischen Glanz hinzufügen.

Reflexionstexturen

Die für den Wagenkasten verwendete Textur testbus01.tga verfügt über einen Alphakanal, der wie folgt aussieht:

Alphakanal der Haupttextur


Schwarze Flächen sind hierbei vollständig matt, weiße Flächen komplett verspiegelt. Zu sehen ist beispielsweise das verchromte "SDK"-Logo sowie die matten Gummieinfassungen von Fenstern und Türen.

Achtung: Dieser Alphakanal wird in diesem Fall nicht für Transparenzen verwendet!

Um die Glanzeffekte einzubinden, muss in der model.cfg beim Eintrag des Wagenkastens Folgendes hinzugefügt werden:


[matl]
testbus_01.tga
0

[matl_envmap]
envmap_unscharf.bmp
1

[matl_bumpmap]
SD80_bump.bmp
0.05

[matl_transmap]

Das Schlüsselwort [matl] definiert eine neue Materialeigenschaft für die Textur testbus_01.tga. Mit der 0 wird festgelegt, dass diese Eigenschaften nur für die erste ("nullte") Instanz dieser Textur in der betreffenden O3D-Datei gelten (eine O3D-Datei kann mehrere Texturen gleichen Namens enthalten, dazu später mehr).

[matl_envmap] definiert eine bestimmte Reflexionstextur, die für den Spiegel- und Glanzeffekt verwendet werden soll. Der Glanz kann mit dem darunterliegenden Faktor (hier =1) auch abgeschwächt werden, ohne den Alphakanal der Textur bearbeiten zu müssen.

[matl_bumpmap] erzeugt eine sogenannte Bumpmap, mit der der Eindruck einer konturierten Oberfläche erzeugt werden kann, in diesem Fall der Eindruck einer leicht welligen Beblechung. Durch den Faktor von 0.05 tritt dieser Effekt aber nur schwach in Erscheinung.

Durch das Schlüsselwort [matl_transmap] wird OMSI mitgeteilt, dass der Alphakanal der Textur NICHT als Transparenz-Alphakanal interpretiert werden soll sondern als Reflexions-Alphakanal. Sollte eine externe tga- oder dds-Datei als Transparenztextur ("Transmap") verwendet werden, so wäre diese unter dem Schlüsselwort einzutragen. Da das hier nicht der Fall ist, kann das Schlüsselwort auch allein stehen.

WICHTIG

Wenn kein Transmap-Dateiname angegeben wird, ist unter dem Schlüsselwort trotzdem mindestens eine Leerzeile freizuhalten!

Das Ergebnis in OMSI:

Bus nun mit Reflexionseffekt

Das sieht doch schon deutlich realer aus! Zu erkennen ist, dass tatsächlich nur der Lack und das Frontlogo reflektieren, der Rest bleibt wie gewünscht matt.

Wagennummer und Kennzeichen

Um das Fahrzeug mit individuellen Nummern und Kennzeichen zu versehen, sind nun zwei weitere Arbeitsschritte nötig: Die Erstellung zweier zusätzlicher Objekte, auf denen in OMSI dann die Beschriftung angebracht wird.

Da die Beschriftung exakt in der Ebene des Wagenkastens liegen muss (um später vom Dreck teilweise verdeckt werden zu können), sind im Blender-Objekt des Wagenkastens diejenigen Flächen zu selektieren, auf denen später die Beschriftung angebracht werden soll, mit [Shift] + [D] zu duplizieren und mit [P] als separates Objekt abzuspalten:

Erstellen des Polygons für das Kennzeichen durch Dublizieren

WICHTIG

Um Fehler bei der Darstellung (z. B. Flimmern) in OMSI zu vermeiden, ist es zwingend erforderlich, dass Wagenkasten und Beschriftungsobjekt in Blender denselben Objektursprung (rosa Punkt) haben!

Diese Flächen werden nun mit einer Platzhalter-Textur überzogen, deren Maße der späteren OMSI-Beschriftung entsprechen (Texturauflösung und Schriftgröße müssen mit dem zu verwendenden OMSI-Font übereinstimmen). Wie auf dem Screen zu sehen, wird die Textur auf dem Polygon in Blender mehrfach gekachelt, dies wird später in der model.cfg durch einen speziellen Eintrag unterdrückt. Auf diese Weise können auch großflächige Polygone als Basis einer kleinen Beschriftung verwendet werden, ohne dass sich diese auf der Fläche mehrfach wiederholt.

WICHTIG

Aufgrund der besonderen Behandlung der Text-Textur ist es erforderlich, die Textur in Blender eine Höhe (hier also 64 Pixel) tiefer zu mappen, als eigentlich gewünscht!

Mapping-Besonderheit Blender vs. OMSI

Dieser gesamte Prozess muss einmal für die Wagennummer und einmal für das Kfz-Kennzeichen durchgeführt werden. Am Ende stehen zwei neue Blender-Objekte zum Export bereit. Diese werden auf dieselbe Weise wie oben beschrieben exportiert und konvertiert.

Für die Einbindung hingegen sind einige Dinge in der model.cfg zu ergänzen. Zunächst werden im "Header" der model.cfg die Text-Texturen für Wagennummer und Kennzeichen definiert:



###################
Text-Texturen:
###################

Nummer:
0
[texttexture]
number
Kennz_DtAlt
64
64
1
0
0
0


1
[texttexture]
ident
Kennz_DtAlt
128
64
1
0
0
0

[texttexture] definiert eine neue Text-Textur, auf der die Stringvariable number, also die Wagennummer, dargestellt werden soll. Kennz_DtAlt ist der zu verwendende OMSI-Font. Ferner soll die Text-Textur eine Auflösung von 64*64 Pixel besitzen. Die dahinter stehende 1 besagt, dass die Originalfarbe des OMSI-Fonts (bei diesem Font schwarz, die TÜV-Plakette ist jedoch farbig) verwendet werden soll. Mit den drei folgenden Werten (hier alle = 0) kann aber auch ein beliebiger RGB-Wert definiert werden, sofern darüber statt der 1 eine 0 eingetragen wird (die native OMSI-Font-Farbe bleibt im Falle einer 0 unberücksichtigt).

Analog wird für das Kennzeichen vorgegangen, welches aber wegen des unterschiedlichen Seitenverhältnisses eine Breite von 128 Pixeln benötigt.

Nachdem diese Formalitäten erledigt sind, können die neuen O3D-Objekte unterhalb des Wagenkastens hinzugefügt werden:


-------------------
Bus number
-------------------
[mesh]
modeldata\testbus_busnumber.o3d

[matl]
D_wagennummer.bmp
0

[useTextTexture]
0

[matl_alpha]
2

[matl_texadress_clamp]

-------------------
Bus registration
-------------------
[mesh]
modeldata\testbus_busregistration.o3d

[matl]
D_kennzeichen.bmp
0

[useTextTexture]
1

[matl_alpha]
2

[matl_texadress_clamp]


Die Schlüsselwörter [mesh] und [matl] haben hier dieselbe Funktion wie schon beim Wagenkasten. Allerdings wird der Materialeintrag noch um folgende Parameter erweitert:

[useTextTexture] Gibt den Index der Text-Textur an, die statt des Platzhalters "D_wagennummer.bmp" bzw. "D_kennzeichen.bmp" verwendet werden soll. Gemäß der obigen Definition ist die Wagennummer Text-Textur 0 und das Kennzeichen Text-Textur 1.
[matl_alpha] Definiert die Art und Weise, wie die transparenten Teile der Textur ausgeschnitten werden sollen: 1 = hart (1-bit-Alphakanal) oder 2 = weich
[matl_texadress_clamp] Sorgt dafür, dass die Textur nicht mehrfach gekachelt wird. Die Randpixel der Text-Textur werden hierbei ohne Wiederholung bis zu den Rändern des Polygons gestreckt.

Nun kann das Ergebis wieder einer kurzen Prüfung unterzogen werden:

Bus nun mit Kennzeichen

Funktioniert :-)