Fahrzeuge für LOTUS bauen

  • Es gibt einige Punkte zu beachten, um Fahrzeuge-Modelle für LOTUS zu erstellen und dabei für alle Spieler eine optimale Performance zu gewährleisten.

    1 Performance

    Dieses erste Kapitel kann natürlich nur einen groben Rahmen und Hintergrundinformationen liefern; präzise Richtlinien wie Texturauflösungen, Polygon-Zahlen u.Ä. können und wollen wir nicht vorgeben, da diese immer sehr stark davon abhängen, welche Prioritäten der Fahrzeug-Modellierer festlegt und natürlich auch, wie groß seine Zielgruppe sein soll bzw. wie sehr er auf schlechtere Rechenleistungen Rücksicht nehmen möchte.

    1.1 Polygonzahlen, Texturgrößen und Detaillierungsgrad

    Fangen wir am Besten gleich mal hiermit an! :)


    Es gibt niemals einen Grund, mit Polygonzahlen und Auflösungen verschwenderisch zu sein, d.h. sich keine Gedanken zu machen und einfach die Stellschrauben blind oder nach simplen/sinnlosen Vorgaben ("Texturen mindestens 1024x1024" oder "Kreise mindestens mit 24 Eckpunkten") einzustellen. Bei der Wahl der jeweiligen Detaillierung sollten folgende Punkte stets beachtet werden:


    Technisch:

    • Heutige Grafikkarten rechnen wesentlich länger an den Materialeigenschaften, als an den Polygonen.
    • Für die Framerate ist es unerheblich, wie groß die Texturen sind. Der Renderer arbeitet ohnehin pro Bildschirm-Pixel und greift jeweils auf eine bestimmte Stelle im Textur-Speicherbereich zu. Ob dieser Speicherbereich (entsprechend der Auflösung) groß oder klein ist, ist dabei egal. Der Zugriff auf einer 3 TB Festplatte ist ja auch genauso schnell wie auf eine 1 TB-Festplatte - und nicht etwa dreimal so lange!
    • Meshs und Texturen müssen im Grafikspeicher liegen, damit sie gerendert werden können! LOTUS erlaubt dem Nutzer aber das Laden der Texturen mit geringeren Auflösungen; daher ist es den Nutzern schlechterer Grafikkarten durchaus möglich, ursprünglich hochauflösende designte Texturen zu laden.
    • Texturen sind im Grafikspeicher kritischer als Meshs - eine einzige 1024x1024-Textur enthält über eine Million Pixel – ein Vertex verbraucht so viel, wie nur ein paar Pixel - in diesen Größenordnungen bewegen wir uns also erst bei hundertausenden von Vertices.
    • Nicht zu vergessen sind aber neben der Performance und dem Grafikspeicherbedarf auch die Ladezeiten! Der Speicherbedarf auf der Festplatte dagegen ist heutzutage schlichtweg irrelevant.

    Strategisch:

    • Immer berücksichtigen, wie lange, wie oft und wie nah der Nutzer dem jeweiligen Modell-Bereich kommt! Den Fahrerarbeitsplatz und dort insbesondere alles, was beim Blick geradeaus im Sichtfeld liegt, also gerne sehr detailliert bauen! Der Fahrgastraum darf und sollte sparsam detailliert werden.
    • Immer überlegen, aus welchen Blickwinkeln welche Polygone nötig sind! Senkrechte Haltestangen sieht man quasi immer von der Seite. Es fällt hier also wesentlich weniger stark auf, wenn diese nur über 8 Eckpunkte verfügen, als wenn die Türtaster nur über 8 Eckpunkte verfügt!
    • Weitere Kriterien sind der Kontrast gegenüber dem Hintergrund und auch, wie sehr das Objekt die Aufmerksamkeit auf sich zieht. Den Türtaster betrachtet man wesentlich öfter als den Heizlüfter unter dem Sitz.

    1.2 Drawcalls

    Unter einem Drawcall versteht man einen einzelnen Zeichen-Befehl. Die Grafikkarte verwendet jeweils einen Effekt, eine Textur und eine Transformation (Animation) und zeichnet dann alle zugehörigen Polygone. Dann folgt (mit anderer Textur, anderem Effekt oder anderer Transformation) der nächste Drawcall usw., bis das Bild komplett aufgebaut ist.


    Drawcalls lassen sich nicht vermeiden, wenn unterschiedliche Bauteile unterschiedlich animiert werden oder z.B. unter verschiedenen Bedingungen leuchten sollen (Leuchtmelder usw.). An dieser Stelle sparsam zu sein (sofern überhaupt möglich), lohnt sich aber nicht.


    Drawcalls lassen sich aber insbesondere dann vermeiden, wenn gleich animierte und mit gleichen Materialeigenschaften zu versehene Bauteile auch auf derselben Textur liegen! Dem Innenraum für die rechte und die linke Seitenwand getrennte Texturen zuzuweisen wäre also unnötig und von Nachteil.


    Beim Import von 3D-Objekten werden diese im ContentTool automatisch nach Drawcalls aufgeteilt. Demzufolge entspricht jeder Eintrag in der Liste rechts einem Drawcall, hier genannt Mesh. Jedes Mesh verfügt über genau eine Texturierung/Material und über eine Animation.


    In einem bestimmten Fall ist allerdings die Trennung von Texturen von Vorteil:


    Da oft eine große Anzahl von verschiedenen Anstrichen eines bestimmten Fahrzeuges installiert, geladen und gerendert werden, jeder Repaint allerdings eine komplette Textur bedeutet, sollte nur so wenig wie möglich auf der "repaintfähigen" Textur liegen und deren Auflösung besonders kritisch beäugt werden. Es sollte beispielsweise nicht noch der komplette Innenraum enthalten sein, da dieser dann für jedem Repaint noch ein weiteres (unnötiges) Mal im Speicher liegt! Selbstverständlich können ungenutzte Teile der Textur durchaus noch für andere Dinge genutzt werden - sie sind ja ohnehin vorhanden. Wenn z.B. in irgendeine Ecke noch die Fahrgastsitz-Textur passt, dann wäre dies ganz nett, denn einerseits spart man wieder an anderer Stelle Texturplatz und andererseits ist es dann sogar möglich, die Sitze mit zu repainten! :-) Ebenso verhält es sich, wenn es einem gelingt, das gesamte KI-Mesh auch mit seinem (dann in der Auflösung wesentlich reduziert texturiertem) Innenraum auf diese Außentextur zu bekommen, was dann natürlich dem Drawcalls- und dem Speicherbedarf der KI-Fahrzeuge zugute kommt.


    Zuletzt soll nicht unerwähnt bleiben, dass es durchaus normal ist, dass ein Fahrzeug durchaus über ein paar hundert Drawcalls bestehen kann. Von diesen sollten aber nur die wenigstens verwendet werden, wenn es nicht das eigene Fahrzeug ist - was eine direkte Überleitung zum folgenden Kapitel darstellt:

    1.3 Sichtbarkeits-Bedingungen

    LOTUS erlaubt die sehr flexible Anpassung der Sichtbarkeits-Bedingungen einzelnen Meshs (Drawcalls). Es kann sehr präzise festgelegt werden, welche Meshs aus welcher Perspektive zusehen sind.


    Auf diese Weise können KI-Fahrzeuge ein anderes (einfacheres) Außenmesh haben, als das eigene Fahrzeug oder können Schalter u.Ä. beim Betrachten von außen komplett weggelassen werden. Bei einem Zweirichter können aber auch alle Elemente des einen Fahrerraums ausgeblendet werden, wenn sich der Nutzer im anderen Fahrerraum befindet.

    2 Wie funktioniert was

    Bereits bei Baubeginn des 3D-Objektes kann das Wissen nicht schaden, wie was funktioniert. Dabei soll hier weniger ins Detail gegangen werden (hierfür sind dann ggf. andere Artikel da).

    2.1 Objekte und Meshs

    In Blender besteht ein 3D-Modell aus mehr oder weniger vielen Objekten. Jedes Objekt hat sein eigenes Koordinatensystem und besteht aus Vertices ("Eckpunkten"), Edges ("Kanten") und Faces ("Flächen"). Den Vertices sind Texturkoordinaten, den Faces sind ggf. unterschiedliche Texturen zugeordnet.


    Beim Import ins ContentTool werden die Objekte nach den verwendeten Texturen aufgetrennt, wobei jede Einheit als "Mesh" bezeichnet und als künftige "Verwaltungseinheit" verwendet wird.


    Ein Mesh wird charakterisiert durch:

    • die Vertices/Faces, aus denen es besteht
    • das zugeordnete Material
    • eine ggf. zugeordnete Animation
    • Events für das Anklicken mit der rechten oder linken Maustaste
    • weitere Eigenschaften

    2.2 Materialien

    Ein Material ist eine Zusammenstellung der Eigenschaften der Oberfläche. Insbesondere sind das:

    • Haupttextur
    • Glanz
    • Nachttextur und die Variable, die jene steuert
    • Transparenzen oder andere Überblendungen mit dem Hintergrund
    • Weitere Texturen, z.B. die Normalen-Textur ("Bump")
    • Weitere Einstellungen, z.B. Überblendungscharakteristik der Nachttextur

    Jedem Mesh muss genau ein Material zugewiesen sein, aber Materialien können durchaus "mehrfach" verwendet werden. Aber jede kleine Unterschied der Materialeigenschaften erfordert ein separates Material. Dem Leuchtmelder "Blinker rechts" muss also ein anderes Material zugewiesen werden als dem Leuchtmelder "Blinker links", weil sich die die Nachttextur-steuernde Variable unterscheidet.

    2.3 Animationen

    Animationen stehen grundsätzlich erstmal "für sich", d.h. man kann eine beliebig komplexe Animationshierarchie aufbauen, ohne auch nur ein Mesh importiert zu haben! Animationen verfügen u.A. über folgende Eigenschaften:

    • Animationstyp, also ob es sich um eine Rotation, Translation oder spezielle Drehgestell- oder Wagenkasten-Animation handelt
    • Steuernde Variable
    • Übertragungsfunktion (wenn Variable = A, dann Rotation = B)
    • Grenzen und Verzögerungen

    Wenn die jeweilige Animation angelegt wurde, können ihr beliebig viele Meshs zugeordnet werden.


    Wenn das erste Mal einer Animation ein Mesh hinzugefügt wird und die Animation bisher über keine Informationen zur Lage der Rotations- oder Translationsachse bzw. dem Drehpunkt aufweist, können diese Informationen aus dem lokalen Koordinatensystem des ursprünglichen Objektes entnommen werden. Es lohnt sich also, im 3D-Programm den Aufwand zu leisten und den Drehpunkt sowie die Achse des lokalen Koordinatensystem der künftigen Animation anzupassen; das erspart späteres manuelles Eingeben der Daten.


    Man kann im ContentTool einstellen, welche Achse (X, Y oder Z) nach dem Import als Rotations- oder Translationsachse verwendet werden soll. Ist ein Mesh bereits importiert, hat diese Einstellung keine Wirksamkeit mehr. Erst nach erneutem Import wird dann die jeweils andere Achse verwendet.


    Falls die Z-Achse die "Lieblingsachse" sein soll, dann stellt man im ContentTool die Z-Achse ein, baut dann die zu animierenden Objekte (z.B. Drehschalter) so, dass deren lokale Z-Achse genau der Rotationsachse entspricht (wie das geht bitte in den entsprechenden Dokumentationen der 3D-Programme nachlesen) und schließlich importiert man sie ins ContentTool, wobei dann die Z-Achse vorgemerkt wird.


    Ist das mit den Achsen komplett in die Hose gegangen, dann kann man sie aber zur Not auch manuell einstellen. Das ist auch kein Problem, wenn die Achse quer, längs oder vertikal liegt; einzig, wenn es sich um schräge Achsen handelt, wird es etwas kniffeliger.

    2.4 Wie baut man...

    Um nicht erst aufwändig recherchieren zu müssen, wie man dieses oder jenes Bauteil modellieren soll(te), finden sich hier einige Beispiele und deren typische Realisierung.

    2.4.1 Glänzende und matte Oberflächen

    Sofern ein ganzes Objekt gleichmäßig glänzen oder matt sein soll, reicht es, wenn die entsprechenden Parameter der Materialeigenschaften angepasst werden. Es ist aber auch möglich, innerhalb eines Meshs unterschiedliche Glanzintensitäten zu realisieren - unter Zuhilfename des Alphakanals der Textur. Dort, wo der Alphakanal weiß ist, werden dann die Glanzparameter der Materialeigenschaften direkt übernommen, dort wo er schwarz ist, ist das Material komplett matt.

    2.4.2 Transparente Oberflächen

    Transparenzen können ebenfalls - wie der Glanz - wahlweise über den Alphakanal oder kontinuierlich realisiert werden. Es kann wahlweise "schwarz/weiß", d.h. hart ausgeschnitten werden oder "weich" überblendet werden. Da es nur einen Alphakanal gibt, können nicht Transparenz und Glanz gleichzeitig über den Alphakanal gesteuert werden.

    2.4.3 Schalter

    Schalter werden als separates Objekt angelegt und es wird darauf geachtet, dass die Lage des lokalen Koordinatensystems bereits der künftigen Rotation entspricht. Im ContentTool werden dann die Meshs, die aus diesem Objekt hervorgehen, alle der neu zu erstellenden Animation zugeordnet und es werden die nötigen Klick-Events eingegeben.

    Wagenkasten

    Im einfachen Fall (einteiliger Wagen mit zwei Achsen oder zwei Drehgestellen) ist dem Wagenkasten keine Animation zugeordnet. Gelenkwagen dagegen werden nicht in einzelne Fahrzeuge aufgeteilt, sondern alle Wagenkästen werden in ein Fahrzeug importiert. Dementsprechend müssen dann je nach Konfiguration Wagenkasten-Animationen angelegt werden, denen die Wagenkästen und alles, was ansonsten noch zum jeweiligen Fahrzeugteil gehört (Sound- und Partikelquellen, Lichter usw.) zugeordnet werden. Auch müssen die Animationen der beweglichen Teile innerhalb des Wagenkastens ebenfalls dieser Wagenkasten-Animation untergeordnet werden.

    2.4.4 Drehgestell und Achsen

    Drehgestelle und Achsen werden als separate Objekte angelegt und können dann den jeweils anzulegenden Animationen zugeordnet werden.

    2.4.5 Leuchtmelder

    Damit Leuchtmelder leuchten, muss eine passende Nachttextur angelegt werden. Ferner müssen die Leuchtmelder in separate Objekte aufgeteilt werden (zusammenbleiben dürfen nur solche Leuchtmelder, die immer gemeinsam aufleuchten). Im ContentTool werden entsprechende Materialkopien angelegt, dort die Nachttextur eingestellt und die Variable ausgesucht.

    3 Ausblick hin zum Import

    Das Importieren der Rohdateien des Fahrzeuges soll kein Gegenstand dieses Artikels sein. Daher möchten wir hier nur einen groben Ausblick geben, wie sich der Import gestaltet - gewissermaßen um vorbereitet zu sein! :)

    3.1 Modell

    Das 3D-Modell kann entweder komplett und/oder nacheinander und in "Einzelteilen" erfolgen. Insbesondere in der Phase der Nacharbeiten kann so der Import wesentlich vereinfacht und beschleunigt werden, weil nur die Objekte importiert werden, die sich geändert haben.


    Hierbei werden die aus den importierten Objekten generierten Meshs abhängig davon, ob es bereits ein Mesh mit dem jeweiligen Namen und der jeweiligen Textur vorhanden ist, entweder ergänzt oder ersetzt. Dies bedeutet aber auch, dass ein Umbenennen eines Objektes, was bereits einmal importiert wurde, dann doppelt vorhanden sein wird. Dies ist aber grundsätzlich kein Problem, weil auch jederzeit Meshs wieder gelöscht werden können. Allerdings zeigt dies, dass bereits während der Entwicklungsphase eindeutige Namen vergeben werden.