Juli 2009 "Howto"-Dokument "Gleise und Weichen" Version v0.01 – Step 0020









SrrTrains: Do-it-yourself-virtuelle-multiplayer-Modelleisenbahn



Wie baue ich meine eigenen SRR



Gleise und Weichen



Inhaltsverzeichnis

1 Einführung 2

2 Modellierung der Gleisanlage 3

3 Klassendiagramm für Gleise und Weichen 4

4 Wie Fahrzeuge mit Gleisen und Weichen interagieren 6

4.1 SrrTransformation 6

5 Die beispielhafte Gleisgeometrie 8

5.1 SrrTrackGeometryABI 8

5.1.1 Initialisierung 8

5.1.2 Berechung der Transformation 9

5.2 SrrTrackSectionA 10

5.3 SrrTurnoutLeftA, SrrTurnoutRightA 10

6 Eine eigene Gleisgeometrie entwickeln 10

6.1 Die beispielhafte Gleisgeometrie um weitere Elemente ergänzen 11

6.2 Eine gänzlich neue Gleisgeometrie entwickeln 11



1 Einführung

Eines der wichtigsten Ziele des SRR Frameworks ist es, eine allgemein gültige Kinematik für Schienenfahrzeuge zur Verfügung zu stellen, die man in virtuellen Modelleisenbahnen auf X3D/VRML-Basis verwenden kann.

Das "Rollercoaster"-Projekt von 2008 hat folgendes Konzept nahe gelegt:

2 Modellierung der Gleisanlage

Abbildung 1 zeigt ein Beispiel eines Doppelpunktgraphen, wie er verwendet wird, um eine Gleisanlage zu modellieren.

Dabei gelten folgende Regeln:


Abbildung 1: Modellierung der Gleisanlage als Doppelpunktgraph







Der Doppelpunktgraph wird mit Hilfe der SRR-Objekte SrrTrackNode und SrrTrackEdge aufgebaut.

Kanten und Knoten werden durch die übergeordneten Elemente Gleisabschnitt und Weiche organisiert (siehe die gestrichelten Kästchen in Abbildung 1). Gleisabschnitt und Weiche werden zur Zeit durch die Prototypen SrrBasicTrackSection und SrrBasicTurnout2Way realisiert.

Mit SRR wird auch eine beispielhafte Gleisgeometrie veröffentlicht, die durch eine andere ersetzt werden könnte. Diese Gleisgeometrie stellt Prototypen zur Verfügung, die bereits die graphische Repräsentation von Schienen und Weichen enthalten und einfach in einem Modul vom Modulautor instanziiert werden können.

3 Klassendiagramm für Gleise und Weichen


Abbildung 2: Klassendiagramm für Gleise und Weichen







Abbildung 2 zeigt die Beziehungen der SRR-Objekte, die benötigt werden, um eine Gleisanlage zu modellieren. SrrTrackGeometryABI ist gestrichelt umrandet, da dieser Prototyp eigentlich kein SRR-Objekt ist, sondern ein Teil der beispielhaften Gleisgeometrie.

Der Endbenutzer (Modulautor) muss nicht alle Details dieses Diagramms kennen, da es genügt, die beispielhafte Gleisgeometrie zu benutzen, um Gleise und Weichen anzulegen (siehe Kapitel 5 ).

SrrBasicTrackSection bekommt die Parameter

und initialisiert die referenzierten Knoten.

Der Knoten trackEdge muss einen trackGeometry Knoten enthalten, welcher ebenfalls initialisiert wird.

Der Prototyp SrrTrackSectionA aus der beispielhaften Gleisgeometrie (in Abbildung 2 nicht gezeigt) reagiert auf die trackCoordinates-, alongVectors- und normalVectors-Ereignisse des trackGeometry-Knotens, um die graphische Repräsentation des Gleisabschnitts zu erzeugen.

Der Knoten trackEdge bekommt die Objekt-ID <objId>

Der Knoten trackNodeA bekommt die Objekt-ID <objId>.A

Der Knoten trackNodeB bekommt die Objekt-ID <objId>.B

SrrBasicTurnout2Way bekommt die Parameter

und initialisiert die referenzierten Knoten.

Die Knoten trackEdge0 und trackEdge1 müssen je einen trackGeometry Knoten enthalten, welcher ebenfalls initialisiert wird.

Die Prototypen SrrTurnoutRightA und SrrTurnoutLeftA aus der beispielhaften Gleisgeometrie (in Abbildung 2 nicht gezeigt) reagieren auf die trackCoordinates-, alongVectors- und normalVectors-Ereignisse der trackGeometry-Knoten, um die graphische Repräsentation der Weiche zu erzeugen.

Der Knoten trackEdge0 bekommt die Objekt-ID <objId>.0

Der Knoten trackEdge1 bekommt die Objekt-ID <objId>.1

Der Knoten trackNodeA bekommt die Objekt-ID <objId>.A

Der Knoten trackNodeB0 bekommt die Objekt-ID <objId>.B0

Der Knoten trackNodeB1 bekommt die Objekt-ID <objId>.B1

SrrSwitchB

ist fast identisch zu SrrSwitchA. Einzig das actualState-Ereignis wird nicht als SFBool (true oder false), sondern als SFInt32 (0 oder 1) geliefert. SrrAxis benötigt dies, um damit die Arrays trackEdges[] und isNodeA[] (Eigenschaften des SrrTrackNode Prototypen) zu indizieren.

Dreiwegweichen sind noch nicht realisiert.

4 Wie Fahrzeuge mit Gleisen und Weichen interagieren

Die Interaktion zwischen Fahrzeugen und der Gleisanlage beruht auf dem Prototypen SrrAxis.

Jedes Fahrzeug/jeder Zug ist verantwortlich, alle seine Achsen zu initialisieren und ihnen bei jedem Frame ein deltaEss-Ereignis zu schicken.

Nachdem SrrAxis das deltaEss-Ereignis erhalten hat, berechnet es seine Eigenschaften

neu.

Dafür benötigt SrrAxis die length-Eigenschaft des trackGeometry Knotens, der in der Elternkante enthalten ist.

Danach wird SrrAxis ein calculateAxisTransformation-Ereignis an den trackGeometry Knoten der Elternkante senden.

Dieser wird den Inhalt der transformation-Eigenschaft der Achse neu berechnen (unter Benutzung der ess, inverse und isAtoB Eigenschaften der Achse).

Das Fahrzeug wird auf die Änderung des Inhalts der transformation-Eigenschaft reagieren und die Achsen und das Fahrzeug an der neuen Position und mit der neuen Orientierung darstellen.

4.1 SrrTransformation

Der trackGeometry -Knoten, der in der Elternkante enthalten ist, berechnet für jedes deltaEss Ereignis eine SRR Standardtransformationsmatrix, die aus 4 Vektoren besteht.




Abbildung 3: Transformation einer Achse







Im Fall von (isAtoB && absolutInverse) || (!isAtoB && !absolutInverse) wird der "forward" – Vektor (x-Achse) von B nach A zeigen, ansonsten von A nach B.

isAtoB ist dabei ein Flag das angibt, ob die x-Achse des Zuges auf dieser Kante von A nach B zeigt oder umgekehrt.

absolutInverse ist ein Flag, das angibt, ob die Achse relativ zum Zug "vorwärts" oder "rückwärts" eingebaut ist. Dieses Flag wird aus den inverse-Eigenschaften der Achse und des Elternfahrzeuges zusammengesetzt.

SrrTransformation bietet eine Übersetungsfunktion transfToX3D, die die vier Vektoren in 3 X3D-Werte umrechnet, welche als Eingabewerte für zwei geschachtelte <Transform>-Knoten verwendet werden können:

Die Werte translation und rotation1 werden als Eingabe für die äußere Transformation verwendet, welche den Ursprung an den richtigen Punkt in der Gleisachse transformiert und die x-Achse in die Längsachse des Gleises rotiert.

Der Wert rotation2 wird als Eingabe für die innere Transformation verwendet, welche das Objekt um die lokale x-Achse in die korrekte Lage dreht.

5 Die beispielhafte Gleisgeometrie

Mit dem SRR Framework wird eine beispielhafte Gleisgeometrie veröffentlicht, die aus folgenden Prototypen besteht:

5.1 SrrTrackGeometryABI

SrrTrackGeometryABI repräsentiert die geometrischen Eigenschaften einer Kante.

Während der Initialisierung berechnet dieser Prototyp auch die grundlegenden Daten, um die graphische Darstellung des Gleisabschnittes zu ermöglichen.

Bei jedem deltaEss-Ereignis unterstützt SrrTrackGeometryABI das SrrAxis-Objekt durch die Berechnung der neuen Transformation für die Achse, basierend auf den geometrischen Eigenschaften der Kante und den aktuellen Eigenschaften der Achse.

5.1.1 Initialisierung

Der Benutzer setzt die Parameter

Die Bedeutung dieser Parameter ist in Abbildung 4 veranschaulicht.


Abbildung 4: Geometrische Eigenschaften einer Kante







SrrTrackGeometryABI berechnet in der Initialisierung

sowie die weiteren externen Parameter

Die Parameter

werden berechnet und intern gespeichert, um später schneller die Transformationen der Achsen zu berechnen.

5.1.2 Berechung der Transformation

Immer, wenn SrrAxis die eigene Transformation anpassen möchte, sendet es ein SFNode-Ereignis an das Feld calculateAxisTransformation des trackGeometry Knotens der Elternkante..

Die isAtoB Eigenschaft der Achse entscheidet, ob ein positives deltaEss von A nach B oder von B nach A zeigt. D.h., wenn isAtoB gleich true ist, zeigt die x-Achse des Zuges auf dieser Kante von A nach B.

Die inverse Eigenschaft entscheidet, ob eine Achse relativ zum Fahrzeug vorwärts oder rückwärts eingefügt worden ist.

5.2 SrrTrackSectionA

SrrTrackSectionA nimmt die Parameter

entgegen, um eine SrrTrackEdge (mit einer SrrTrackGeometryABI) zwei SrrTrackNode zusammen mit einem SrrBasicTrackSection zu kreieren.

SrrTrackSectionA enthält eine <TriangleStripSet>, deren Koordinaten und Texturkoordinaten mit Hilfe der Ausgabewerte trackCoordinates, alongVectors und normalVectors von SrrTrackGeometryABI berechnet werden.

Die Gleiselemente werden dabei durch eine vordefinierte Texturdatei realisiert.

5.3 SrrTurnoutLeftA, SrrTurnoutRightA

Diese Prototypen nehmen die Parameter

entgegen, um 30°-Weichen zu kreieren (SrrBasicTurnout2Way). Ein Gleis ist gerade (von A zu B0), das andere ist eine 30°-Kurve mit Radius R.

Ein Hebel mit einem roten Knauf und touch sensor wird kreiert, um das Umstellen der Weiche (des enthaltenen SrrSwitchB-Knotens) zu ermöglichen.

6 Eine eigene Gleisgeometrie entwickeln

Es gibt zwei Ansätze dazu

a) Die beispielhafte Gleigeometrie um weitere Elemente ergänzen

b) Eine gänzlich neue Gleisgeometrie entwickeln

In beiden Fällen ist folgendes zu berücksichtigen: Die Python-Scripts für Blender, die in Step 0050 entwickelt werden sollen, werden auf einer konkreten Gleisgeometrie aufbauen. Wenn man eigene Gleisgeometrien entwickelt, sollte man sich also auch Gedanken über Blender Python-Scripts machen.

6.1 Die beispielhafte Gleisgeometrie um weitere Elemente ergänzen

Dieser Ansatz bedeutet, dass man weiterhin auf die Geometrie von SrrTrackGeometryABI aufsetzt. D.h. man wird Kreisbögen und Geradenstücke mit einer verlaufenden Querneigung modellieren können.

Man könnte zum Beispiel

realisieren.

Um 3-Wegweichen zu realisieren, wird man analog zum SRR-Objekt SrrBasicTurnout2Way ein eigenes SRR-Objekt SrrBasicTurnout3Way implementieren müssen (der Schalter SrrSwitchB ist bereits auf 3-Wegweichen vorbereitet).

6.2 Eine gänzlich neue Gleisgeometrie entwickeln

Hierzu müsste man analog zu SrrTrackGeometryABI einen eigenen Prototypen entwickeln, der z.B. eine parabolische Gleisgeometrie ermöglicht. Weiters müssten dazu die neuen User (analog zu SrrTrackSectionA, SrrTurnoutLeftA, SrrTurnoutRightA) entwickelt werden.

Es ist z.B. denkbar, eine "starre" Gleisgeometrie zu entwickeln, bei der die graphische Repräsentation der Kurvenstücke und Geradenstücke mit "DEF" und "USE" wiederverwendet werden kann, um Speicherplatz zu sparen.

Seite 11 von 11