TrafficDrive

Eine Fahrzeugsimulation in der Godot Engine

Dies ist die Projektseite für TrafficDrive, einer Fahrsimulation erstellt in der Godot Engine.
Es wurde im Verlaufe des Anfängerpraktikums zum Thema “Fahrzeugsimulation in der Godot Engine” von Frederick Schenk erstellt.

Der Entwickler

Frederick Schenk war (Stand August 2021) Student an der Universität Heidelberg und im 6. Semester eines Studiums für Angewandte Informatik.

Motivation

Die Motivation für die Ausführung des Praktikums kam von der Idee einer Verkehrsimplementierung in einer Game-Engine. Da dies sich als ein relativ komplexes Thema für ein Anfängerpraktikum herausstellte, wurde die schlussendliche Zielsetzung zur Erstellung einer authentischen Fahrzeugsimulation innerhalb der Godot Engine definiert.

Das finale Projekt besteht daher in einer kleinen Umgebung, in der man mit verschiedenen Fahrzeugen fahren kann, welche ein vollständiges Lichtsystem, Gangschaltung und Tempomat beinhalten.

Grundlegendes

Sedan bei einer Baustelle

Für dieses Projekt wurde das POLYGON City Asset Pack von Synty Studios verwendet. Somit gab es einige Assets, wodurch das Projekt selber auf die Umsetzung des Codes konzentriert werden konnte.

Die Fahrzeuge von TrafficDrive basieren im Grundlegenden auf der Klasse VehicleBody. Diese stellt einige grundlegende Funktionen (Beschleunigen, Bremsen und Lenken) sowie die Physikimplementation bereit, was die Umsetzung vereinfacht hat.

Im Laufe des Projekts wurde weitere Funktionalität durch eine Erweiterung des Codes hinzugefügt, welche neben der Gangschaltung und dem Tempomaten auch Steuerung durch den Spieler, Animation des Lenkrads und Wechseln zwischen einer flexiblen Anzahl an Kameras beinhaltet.

Außerdem wurde zusätzlicher Code für ein besseres Lenkverhalten implementiert. Der Parameter fürs Lenken wird in VehicleBody direkt angewandt und nimmt auch keine Abhängigkeit von Geschwindigkeit und Lenkwinkel in Betracht.
Dies wurde angepasst, indem Code hinzugefügt wurde, welcher den maximalen Lenkwinkel bei hohen Geschwindigkeiten reduziert, sowie den Lenkwinkel beim Lenken interpoliert, anstelle ihn direkt anzuwenden.

Gangschaltung und Tempomat

Muscle Fahrzeug in der Stadt

Die größte Herausforderung bei dem Gangsystem stellte die Simulation der Drehzahl dar, da VehicleBody selber nur den Parameter engine_force zum Setzen einer Beschleunigungskraft bereitstellt.
Daher wurde ein System implementiert, welches die Drehzahl “rückwärts” berechnet. Ausgehend von der Rotation der Räder wird die Drehzahl unter Beachtung der Getriebeübersetzung berechnet. Die berechnete Drehzahl wird anschließend verwendet, um aus einer “Engine Power Curve” die abrufbare Leistung des Motors zu ermitteln. Dies ergibt im Anschluss mit der aktuellen Umsetzung dann die Leistung, die auf die Räder einwirkt.

Zusammen mit einem System zum Wechseln der Gänge (welches den Gang langsam aus- und einkuppelt) erhält man ein verhältnismäßig authentisches Fahrverhalten für das Fahrzeug.

Das Gangsystem wird mit einer automatischen Gangschaltung abgeschlossen, welche beim Erreichen gewisser Drehzahlen einen Gangwechsel durchführt. Diese Implementierung wird in vielen Rennspielen verwendet, da echte Automatikgetriebe ein komplexes System zum Erreichen bester Motoreffizienz sind, was sich schlecht mit dem hier vorhandenem System simulieren lässt.


Der Tempomat stellte eine andere Herausforderung:
Als Ziel sollte eine gewisse Geschwindigkeit erreicht werden, als Steuerungsparameter steht aber nur die Einwirkung einer Kraft auf die Räder zur Verfügung.

Als Lösung hierfür wurde daher eine Feedback-Loop implementiert. Auf Basis der Differenz zwischen Ziel- und Fahrgeschwindigkeit wird ein Kontrollwert berechnet, mit welchem die Zielgeschwindigkeit erreicht werden soll.

Die eigentliche Implementierung dieses Konzepts wurde anschließend mithilfe eines Skripts für einen PID-Controller umgesetzt.

Das Lichtsystem

SUV bei Nacht mit aktiviertem Licht

Die Lichter an den Fahrzeugen verwenden eine Kombination von mehreren Lichtsystemen. Die Mesh von dem Licht wird mithilfe eines Materials mit Emissionstextur so dargestellt, als wenn es leuchtet, während ein Spotlight für eine angemessene Ausleuchtung der Umgebung mit dem Licht sorgt.

Die somit erzeugten Lichter werden mit der Klasse VehicleLight definiert und konfiguriert, sodass sie anschließend vom VehicleLightManager verwaltet werden. Dieser Manager übernimmt die Anweisungen der Fahrzeugklasse und stellt dem Mesh das passende Material und den Lichtern die passende Sichtbarkeit je nach Gegebenheit ein und ist auch für das Timing der Blinker verantwortlich.

Stadtbau und Kollision

Blick auf die Stadt von TrafficDrive

Für einen Großteil des Projekts wurde die Demo-Szene aus dem Asset Pack für Testzwecke verwendet. Da diese aber durch eine hohe Anzahl an Meshes und TrimeshCollision sehr rechenaufwendig war, wurde die Struktur der Stadt komplett überarbeitet.

Die nun implementierte Stadt basiert auf der in Godot eingebauten GridMap. Modelle sind in einer MeshLibrary organisiert, sodass man die Umgebung leicht im Editor bearbeiten kann. Dank der GridMap wäre es leicht möglich, die Umgebung um weitere Gegenden zu erweitern.


Einer der Hauptgründe für Performanceeinbuße während des Projekts waren die in der Demo-Szene verwendeten TrimeshCollision, wo die komplette Mesh kopiert und als Kollisionsmodell definiert wird. Während dies für eine sehr präzise Kollisionsabfrage sorgt, so wird es bei vielen Polygonen schnell sehr rechenaufwendig die Kollisionen zu berechnen.

Die Fahrzeuge verwenden ConvexCollision, wo ein einfaches Polyeder über das komplette Modell gespannt wird. Während dies für eine schnelle Berechnung sorgt, so kann es nicht mit Einlassungen wie einer Bordsteinrinne umgehen, was bei der Umgebung für keine gute Kollision sorgte.

Die am Ende implementierte Kollision basiert daher auf vereinfachten Modellen der verwendeten Asset-Meshes, mit welchen eine TrimeshCollision erzeugt wird. Dadurch besteht das Kollisionsmodell nur aus den notwendigen Formen, während Details ausgelassen werden, wodurch eine angemessene Rechenzeit bei zufriedenstellender Präzision ermöglicht wird.

Testfahren

Polizeiwagen bei Sonnenuntergang

Wer sich TrafficDrive ansehen möchte, der kann die Demo über folgende Links herunterladen und starten:

Windows

Linux

macOS

Der Quellcode für das Projekt befindet sich auf GitHub, allerdings ohne die Assets.