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
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:
Die Gleisanlage wird durch einen Doppelpunktgraphen entsprechend der Dissertation von Daniel Hürlimann (ETH Zürich) modelliert
Jede Achse wird unabhängig von den anderen Achsen über die Gleisanlage bewegt. Basis dafür ist das deltaEss-Ereignis
Jede Achse hat eine Transformations-Eigenschaft (Position und Orientierung), die mit jedem Bild neu berechnet wird
Position und Orientierung der Fahrzeuge wird von Position und Orientierung der Achsen abgeleitet
Jede Kante des Doppelpunktgraphen hat auch geometrische Eigenschaften, die es ermöglichen, Position und Orientierung aller Achsen basierend auf deren Eigenschaften ess, parentEdge, isAtoB und inverse zu berechnen
Weichen werden durch Switch-Objekte modelliert (genau genommen SrrSwitchB-Objekte), die als Kinder von Knoten des Doppelpunktgraphen auftreten. Die actualState-Eigenschaft der Switch-Objekte dient als Basis der Wegefindung der Achsen durch den Doppelpunktgraphen.
Abbildung 1 zeigt ein Beispiel eines Doppelpunktgraphen, wie er verwendet wird, um eine Gleisanlage zu modellieren.
Dabei gelten folgende Regeln:
Jede Kante referenziert zwei Endknoten, Knoten "A" und Knoten "B"
Jeder Knoten hat genau einen Nachbarknoten
Jeder Knoten referenziert 0, 1 oder mehrere Kanten
Wenn ein Knoten auf mehr als eine Kante zeigt, enthält er einen Schalter(Switch) für die Weiche

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.

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
objId
trackEdge (Referenz auf einen uninitialisierten SrrTrackEdge-Knoten)
trackNodeA (Referenz auf einen uninitialisierten SrrTrackNode-Knoten)
trackNodeB (Referenz auf einen uninitialisierten SrrTrackNode-Knoten)
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
objId
trackEdge0 (Referenz auf einen uninitialisierten SrrTrackEdge-Knoten)
trackEdge1 (Referenz auf einen uninitialisierten SrrTrackEdge-Knoten)
trackNodeA (Referenz auf einen uninitialisierten SrrTrackNode-Knoten)
trackNodeB0 (Referenz auf einen uninitialisierten SrrTrackNode-Knoten)
trackNodeB1 (Referenz auf einen uninitialisierten SrrTrackNode-Knoten)
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.
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
parentEdge
parentEdgeName
isAtoB
ess
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.
Der trackGeometry -Knoten, der in der Elternkante enthalten ist, berechnet für jedes deltaEss Ereignis eine SRR Standardtransformationsmatrix, die aus 4 Vektoren besteht.
transformation[0] ist der Ortsvektor des Ursprungs des lokalen Koordinatensystems
transformation[1] ist die x-Achse des lokalen Koordinatensystems ("vorwärts")
transformation[2] ist die y-Achse des lokalen Koordinatensystems ("aufwärts")
transformation[3] ist die z-Achse des lokalen Koordinatensystems ("rechts")

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:
translation
rotation1
rotation2
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.
Mit dem SRR Framework wird eine beispielhafte Gleisgeometrie veröffentlicht, die aus folgenden Prototypen besteht:
SrrTrackGeometryABI
SrrTrackSectionA
SrrTurnoutLeftA
SrrTurnoutRightA
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.
Der Benutzer setzt die Parameter
vectorA (Ortsvektor des Ausgangspunktes)
vectorB (Ortsvektor des Endpunktes)
vectorI (Ortsvektor eines Zwischenpunktes)
normalA (Vektor, um die Querneigung am Punkt A festzulegen)
normalB (Vektor, um die Querneigung am Punkt B festzulegen)
trackElementLength (Länge eines Gleiselementes)
Die Bedeutung dieser Parameter ist in Abbildung 4 veranschaulicht.

Abbildung
4: Geometrische Eigenschaften einer Kante
SrrTrackGeometryABI berechnet in der Initialisierung
trackElementLength (sodass eine ganze Zahl von Gleiselementen in die Kante passt)
sowie die weiteren externen Parameter
length (Länge der Kurve von A über I nach B)
trackCoordinates ("numberOfTrackElements + 1" Ortsvektoren)
alongVectors ("numberOfTrackElements + 1" Einheitsvektoren, die "von A nach B" zeigen)
normalVectors("numberOfTrackElements + 1" Einheitsvektoren, die "aufwärts" zeigen)
Die Parameter
center
radius
crossSlopeA
crossSlopeB
werden berechnet und intern gespeichert, um später schneller die Transformationen der Achsen zu berechnen.
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.
SrrTrackSectionA nimmt die Parameter
objId
vectorA
vectorB
vectorI
normalA
normalB
neighbourA
neighbourB
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.
Diese Prototypen nehmen die Parameter
objId
vectorA
vectorB0
R
neighbourA
neighbourB0
neighbourB1
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.
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.
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
Y-Weichen
anderes Erscheinungsbild (z.B. Betonschwellen)
andere Weichenhebel
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).
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