Hallo zusammen,
Ich übernehme hier mal aus dem alten Forum.
Wie bereits im alten Forum erwähnt, beschäftige ich mich derzeit mit dem OMSI-Code, da ich des 3D-Modellings vollkommen untalentiert scheine und auch sonst ein großes Interesse für's Programmieren habe.
Ich habe meine Codes in keiner logischen Reihenfolge geschrieben sondern nach Lust und Laune. Und ich werde die Skripts auch nicht nach logischer Reihenfolge vorstellen, sondern, wie es sich ergibt.
Ich möchte in diesem Thread meine Ansätze zu Problemlösungen vorstellen, die in neuen Fahrzeugen eingesetzt werden können. Daher gibt es hier keine Codes zum Download, da sie keine Mods in dem Sinne darstellen.
Da es mich als erstes interessiert hat, wie Außenschwingtüren in OMSI funktionieren könnten, hab ich das mal versucht, zu realisieren.
Die Antriebsstangen der Türen bewegen den Türflügel in einer Kreisbahnbewegung. Der Knick in der Stange dient ausschließlich dazu, nicht mit der Karosserie zu kollidieren. Das brachte mich auf die Idee, den Türflügel mit einer Art Parameterdarstellung zu animieren. Ich animiere also X- und Y-Achse getrennt, um die Schwingbewegung darzustellen. Zusätzlich wäre eine Bewegung entlang der Z-Achse möglich, um das Entriegeln der Türen zu simulieren.
Daher braucht die Bewegung pro Flügel 2 oder 3 Variablen, je nachdem, wie viele Achsen animiert werden.
Bei meinem Beispiel sieht also die Varlist-Datei so aus:
posx_T1_F1
posy_T1_F1
posx_T1_F2
posy_T1_F2
posx_T2_F1
posy_T2_F1
posx_T2_F2
posy_T2_F2
Die Positionen in X und Y sind von einer gemeinsamen Variable abhängig: dem Öffnungswinkel des Türflügels, daher sind noch weitere Variablen nötig:
pos_T1_F1
pos_T1_F2
pos_T2_F1
pos_T2_F2
Damit lässt sich die Bewegung des Türflügels grundsätzlich bereits beschreiben. Eine Vereinfachung habe ich getroffen: In der Modell.cfg ist die Drehung der Türstange so definiert, dass 0 zu bedeutet und der max. Schwingwinkel, in meinem Testmodell 135°, ganz offen. Dadurch muss ich alle Formeln nur für einen Flügel entwickeln und kann alles für die anderen Flügel durch einfaches Kopieren und Variablenersetzen adaptieren.
Als nächstes zunächst eine Skizze:
den Öffnungswinkel der Tür bezeichne ich gewohnheitshalber mit einem kleinen phi. Ich vermute, ihr würdet alpha für die Beschriftung vorziehen, aber alpha ist in der Technik die Winkelbeschleunigung und die könnte später noch im Code gebraucht werden.
Die Variable pos_T?_F? ist also der Winkel phi in der Zeichnung und der Radius r (in der Skizze gleich der Dreieckseite c) ist durch die Türstange fixiert.
Apropos fixiert: Also ab in's Const-File mit dem Wert. Und zweitens entspricht der Winkel, der die Nullposition darstellt, nicht einem Winkel von 0°. Diesen Offset muss man auch ins Const-File eintragen.
Als nächstes müssen posx_T?_F? und posy_T?_F? endlich von pos_T?_F? abhängig gemacht werden.
Am einfachsten kann man sich die Umsetzung des Winkels in X- und Y-Komponente mit einem rechtwinkligen Dreieck darstellen.
Die längste Seite, meist als c bezeichnet, ist unsere Hypotenuse bzw. der Radius des Kreisbogens.
Die Seite b ist die X-Komponente der Hypotenuse, während die Seite a die Y-Komponente darstellt.
Per Definition ist der Sinus eines Winkels das Verhältnis zwischen Hypotenuse und Gegenkathete des Winkels phi.
Das Verhältnis Hypotenuse zu Ankathete wird mit dem Cosinus des Winkels beschrieben. Da das OMSI-Skript keine Cosinus-Funktion bietet, muss man sich mit dem Wissen helfen, dass Sinus und Cosinus um 90° phasenverschoben sind.
Der Winkel, von dem die X- und Y-Komponenten berechnet werden sollen, ist immer um den Winkel phi_null, den die Türstange im geschlossenen Zustand bereits hat, größer als der Wert in der Variable pos_T?_F?.
Daher ist X=Radius_Türstange*sin(phi_null+pos_T?_F?)
und Y=Radius_Türstange*sin(phi_null+pos_T?_F?+90)
als nächstes muss beachtet werden, dass OMSI, wie viele Programme Winkel nicht in Grad sondern in Radiant berechnet. Der Umrechnungsfaktur hierzu beträgt. rad=Grad*(pi/180)
somit ist X=Radius_Türstange*sin((phi_null+pos_T?_F?)*(pi/180))
und Y=Radius_Türstange*sin((phi_null+pos_T?_F?+90)*(pi/180))
Da der Nullpunkt des Objektes Türflügel nicht dem Rotationspunkt der Türstange entspricht, muss noch einmal ein Offset bemüht werden, der das berücksichtigt:
X=Radius_Türstange*sin((phi_null+pos_T?_F?)*(pi/180))±Offset_x
und Y=Radius_Türstange*sin((phi_null+pos_T?_F?+90)*(pi/180))±Offset_y
Transferieren in die OMSI-Code-Syntax ergibt:
(C.L.phi_Null) (L.L.pos_T?_F?) + pi * 180 / sin (C.L.radius_Turstange) * (C.L.Offset_x_T?_F?) ± (S.L.posx_T?_F?)
(C.L.phi_Null) (L.L.pos_T?_F?) + 90 + pi * 180 / sin (C.L.radius_Turstange) * (C.L.Offset_y_T?_F?) ± (S.L.posy_T?_F?)
Die Türstange kann nun über pos_T?_F? beliebig beschleunigt/verzögert/animiert werden, der Türflügel folgt der Türstange wie gewünscht.
Wenn Fragen auftauchen, einfach stellen.
Schönen Abend noch,
Busfanat