Neuen Taster bewegen

Das Forum befindet sich im reduzierten Betrieb. Die Addon- und Supportforen bleiben weiterhin verfügbar.
Bitte beachte, dass OMSI nicht mehr weiterentwickelt wird. Ein Teil der Entwickler widmet sich inzwischen der Entwicklung eines neuen Simulators. Weitere Informationen zum LOTUS-Simulator findest Du hier.
  • Moin,


    ich habe mir ein neuen Taster auf das Dash gebaut. Wenn ich diesen mit der Maus oder über die Tastatur wird die Funktion des Tasters ausgeführt, jedoch bewegt sich dieser nicht.
    Dafür habe ich nun folgende Einträge, welche ich eigentlich vom Kneeling übernommen und angepasst habe.


    Eintrag aus der Model. cfg


    Das unter [newanim] ist ja für die Bewegung welche abgespielt werden soll (Name steht in einem Macro) dieser kann unterschiedlich sein.



    Ich habe jetzt schon unterschiedliche Namen probiert. Eigentlich müsste das doch in diesem Fall tuersperre_sw sein (?).
    Habe diesen Name schon öfters auf Fehler überprüft, jedoch will sich der Taster nicht bewegen.

    Was mache ich falsch?


    Gruß

  • Du hast einen kleinen Denkfehler.


    Jeder taster ist im Script zweimal (im Prinzip zweimal oder dreimal) eingetragen.


    Das Macro ist in sofern falsch, als das du die Funktion und die Tasterbewegung zusammen umsetzen willst. Das geht aber so nicht. Zumindest wurde es noch nie in Omsi so gemacht.



    Daher gibt es ein oder zwei Trigger für die Funktion "Tasten- / Schalterbewegung) und ein Macro oder Trigger für das Ausführen des Mausevents.
    {Trigger:tfs}
    (L.L.tuersperre) ! (S.L.tuersperre)
    {end}


    Das wäre die Funktion Taster. Für einen Schalter benötigst du zwei. Einen Trigger für das Schalten des Tasters in die eine Position und den zweiten Trigger für das zurücksetzen in die Ursprungsstellung.


    Und nochetwas. Was soll der Eintrag
    L.L.tuersperre???
    Entweder steht dort tuersperre oder eine andere variable. Aber ganz sicher nicht, das der Wert der Variable, in einen Stack eingelesen werden soll. Das ist für das Script und die model.cfg ist kein Script!

  • Stimmt, ich glaube ich verstehe was du meinst.


    Zitat

    Und nochetwas. Was soll der Eintrag


    Das war was aus den Versuchen. War mir aber schon ziemlich sicher das dass so nicht geht. Wird natürlich geändert.
    Den Rest schaue ich mir, wenn ich ausgeschlafen habe, an.


    Danke


    Edit:
    So, ich habe mir das ganze mal etwas genauer angeschaut.
    Dazu habe ich die door_manuel_3d_g vom Facelift geöffnet, wo der eine trigger der Türsperre drin ist. Dieser sieht nun so aus:



    Du sagtest ja das es noch einen weiteren Trigger geben soll. Dieser müsste dann ja auch wieder mit {trigger:...} anfangen.
    Ich habe nun gerade mal in den Scripts geschaut wo es Sinn machen würde, leider kein Ergebnis.
    Der Trigger von oben funktioniert...


    So sieht jetzt der Teil aus der Model. aus, wo alles funktioniert:


    Von meiner Überlegung her kann man ja alles vom einen Bus in den andren kopieren und dann müssen lediglich die Namen angepasst werden.
    Ich werde jetzt nochmal alles Scripts durchsuchen...

  • Bei allem was du machst, mußt du sehr genau hinsehen. Später einen Schreibfehler zu finden ist eine sehr mühsame und zeitraubende Arbeit.


    Daher nochmal zur Erinnerung
    Scripte sind Dateien in dennen Berechnungen stattfinden. Diese befinden sich in dem Scriptordner und haben die Dateiendung .osc. Alles andere sind keine Scripte, Weder die Model-, Bus- Passengercabin-, Pfad-, Hof- Sound- oder auch Textdateien.
    Nimm dir als Grundlage irgendeinen anderen Taster aus dem oder einen anderen Bus. Der Rest ist dann nur noch kopieren, einfügen und anpassen.
    Alle Variablennamen sind deine Sache. Du kannst diese benennen wie du es willst. Triggernamen sind auch frei. Allerdings solltest du dir überlegen, ob einige Sache mittels Tastaturtasten funktionieren sollen. Man kann ja nur eine Taste mit einer Funktion belegen.
    Achte in den Scripten auf eine Übersichtliche Schreibweise. Das macht später den Durchblick einfacher. Besonders für andere User. Arbeite auch mit Kommentaren, die auskommentiert werden.
    Ein Hochstrich am Zeilenanfang ist dabei wichtig. Und alle Trigger sauber beenden {end}.


    Ansonsten bist du auf dem richtigen Weg, Omsi langsam zu verstehen und Änderungen umzusetzen. Bleib dran!

  • Okay, ich habe nun nochmal einen neuen Taster testweise eingefügt. Diesen haben ich nun auch bewegt bekomme, jedoch bewegt er sich entweder gar nicht oder um gefühlte Kilometer. Das ist doch der Abschnitt für die Größe der Bewegung:



    Das habe ich jetzt einfach mal vom Warnblinker übernommen und den Befehl angepasst. (Hier nicht)
    Dann müsste sich doch der Taster wie der Warnblinker bewegen... warum tut er das aber so extrem?

  • warum tut er das aber so extrem?


    Weil in der o3d-Datei drin steht, wo sich der Objektursprung befindet. Und dieser befindet sich an der Stelle, wo sich der Rotationspunkt des Warnblickschalters befindet.


    Nun hast du den Schalter via Daueranimation verschoben. Und in der Modeldatei hast du eingetragen, das er den Objektursprung als Rotationspunkt verwenden soll.


    [newanim]
    origin_from_mesh


    Du hast NUR den Schalter via Daueranimation verschoben. Der Rotationsursprung befindet sich dort wo der Warnblinklichtschalter sitzt. Und genau diesen soll Omsi verwenden.
    Wo ist der Fehler

    ?(
  • Ich habe das Objekt via Blender verschoben. Ich bin nun kein Blender Profi aber verschiebt sich dann der Objektursprung mit? Denke ja. (?)


    [mesh]
    VER_316\Dash\button_ZSL.o3d


    [animparent]
    cockpit


    [matl_change]
    VDV_dash_buttons.dds
    0
    lights_stand


    [matl_item]


    [matl_nightmap]
    VDV_Dash_buttons_lm.dds


    Texturen bla bla


    [mouseevent]
    cp_kneel_up_toggle


    Gibt an was passiert wenn ich auf das Objekt klicke (steht im Trigger)


    [illumination_interior]
    0
    1
    2
    3


    [viewpoint]
    2


    [newanim]
    origin_from_mesh
    anim_rot
    cp_kneel_up_mode
    10


    [newanim]
    origin_from_mesh
    anim_rot
    cp_kneel_down_mode
    -10


    Was macht der Teil? Ist das nun für eine Daueranimation oder nun für die Bewegung des Tasters?


    [newanim]
    origin_rot_x
    -90
    anim_trans
    Daueranimation
    0.058


    [newanim]
    origin_rot_z
    -90
    anim_trans
    Daueranimation
    -0.015


    Was macht der Teil? Ist das nun für eine Daueranimation oder nun für die Bewegung des Tasters?


    Wenn cp_kneel... (was im Trigger steht wann es eintritt?) dann rotiert das Objekt um 8


    Weiter geht es mit den Triggern:


    {trigger:cp_kneel_up_toggle} Ist der Befehl für das Mausevent
    (T.L.ev_VDV_toggle_on) Ist ein Sound Trigger
    1 (S.L.cp_kneel_up_mode) Steht auch in der Model. wann das Objekt bewegt wird
    {end}

    {trigger:cp_kneel_up_toggle_off}
    0 (S.L.cp_kneel_up_antirepeat) (S.L.cp_kneel_up_mode) s1
    (T.L.ev_VDV_toggle_off)
    {end}


    Was macht der letze Teil?


    Diesen Trigger gibt es auch nochmal für Kneel_up....


    {trigger:cp_kneel_down_toggle}
    (L.L.cp_kneel_down_sw) ! (S.L.cp_kneel_down_sw)
    (T.L.ev_VDV_toggle_on)


    (L.L.door_0) 0 =
    (L.L.door_1) 0 = &&
    (L.L.door_2) 0 = &&
    (L.L.door_3) 0 = &&
    (L.L.door_4) 0 = &&
    (L.L.door_5) 0 = &&
    (L.L.door_6) 0 = &&
    (L.L.door_7) 0 = &&
    {if}
    0 (S.L.kneel_allowed) (S.L.kneel_locked) (S.L.kneel_auto_set)
    {endif}
    1 (S.L.cp_kneel_down_mode) s1
    {end}

    {trigger:cp_kneel_down_toggle_off}
    0 (S.L.cp_kneel_down_antirepeat) (S.L.cp_kneel_down_mode) s1
    (T.L.ev_VDV_toggle_off)
    {end}


    Hoffe das ich das dann richtig verstanden habe xD

  • aber verschiebt sich dann der Objektursprung mit? Denke ja. (?)


    Kommt drauf an. Es gibt eigentlich drei wichtige Punkte in Blender.
    1. Der Nullpunkt des Koordinatensystems in Blender. Meist nur durch helle Linien dargestellt die nie enden.
    2. Der Objektursprung. Das sind die kleinen drei Pfeile. Und diese kannst du verschieben
    3. Das Objekt ansich, was du natürlich verschoben hast.
    Ich kenne mich mit Blender nicht aus, weil ich nur mit dem zModeler arbeite. Aber dort wird es vermutlich genauso gehandhabt.
    1. Das Objekt erstellen, wobei der Objektnullpunkt an der Stelle liegt, wo Blender seinen Nullpunkt hat.
    2. Dann wird das Objekt an die Stelle verschoben, wo das Objekt hingehört.
    Beispiel
    X=0.2
    Y=4.5
    Z=1.4
    3. Nun wird der Objektursprung auf das Blender-Koordinatensystem zurück gesetzt. Also X, Y und Z = 0. Der Schalter bleibt auf seiner Position!
    4. Nun wird das Objekt und der Objektursprung nochmals verschoben, auf die Stelle wo das Objekt sitzen soll.
    Also nach Beispiel auf
    X=0.2
    Y=4.5
    Z=1.4
    Dabei verschiebt sich der Schalter auf
    X=0.4
    Y=9
    Z=2.8
    Damit haben wir drei Punkte.
    A - Den Nullpunkt von Blender = Nullpunkt des Busses.
    B - Objektursprung auf der Position des Tasters
    C - Objekt befindet sich außerhalb vor dem Bus.


    Omsi setzt den Schalter ein und setzt den Objektursprung auf die 0-Koordinate des Busses. damit ist der Schalter im Amaturenbrett. Für die Animation und nur für die Animation setzt Omsi den Bewegungsursprung dorthin, wo der Objektursprung in Blender war.
    Dann kommt in der model.cfg
    [newanim]
    origin_from_mesh


    Bleibt der Objektursprung in Blender auf der Blender-Nullkoordinate dann schreibst du
    [newanim]
    origin_trans
    0.2
    4.5
    1.4
    (siehe Beispiel oben)
    Darunter kommen dann die Verdrehungen des Objektursprung, da sich in Omsi alle Objekte ausschließlich um die X-Achse drehen und nur um die X-Achse.
    origin_rot_x
    xyz


    origin_rot_y
    xyz


    origin_rot_z
    xyz


    Prinzip soweit klar?


    ---------------------------------------------------------------------
    Zu deinen Kommentaren in rot:

    [mouseevent]
    cp_kneel_up_toggle


    Gibt an was passiert wenn ich auf das Objekt klicke (steht im Trigger)


    Das ist die Triggervariable. Also im Prinzip hast du recht. Diese Variable soll sich ändern, wenn die Maus dort geklickt wird. Aber richtig heißt es: Die Variable cp_kneel_up_toggle wird von Zustand 0 auf 1 gesetzt, wenn der Zustand vorher 0 war. Ansonsten wird er von 1 auf 0 zurück gesetzt.

    {trigger:cp_kneel_up_toggle} Ist der Befehl für das Mausevent
    (T.L.ev_VDV_toggle_on) Ist ein Sound Trigger
    1 (S.L.cp_kneel_up_mode) Steht auch in der Model. wann das Objekt bewegt wird
    {end}


    Genau das wird ausgeführt
    Ein weiterer Klick und es wird ein weiterer Trigger ausgeführt.

    {trigger:cp_kneel_up_toggle_off}
    0 (S.L.cp_kneel_up_antirepeat) (S.L.cp_kneel_up_mode) s1
    (T.L.ev_VDV_toggle_off)
    {end}


    Mit dem ersten Klick wird die variable cp_kneel_up_mode auf den Zustand 1 gesetzt. Ein weiterer Klick geht bei diesem Trigger nicht, weil die Variable cp_kneel_up_mode schon den Zustand 1 hat. Also wird der folgende Trigger ausgelöst. Damit wird der Zustand des Objektes auf den Zustand 0 gesetzt. Das ganze wiederholt sich immer wieder, solange die Klickst. Jeder klick verändert den Trigger einmalig und beläst ihn dann dort. Das kannst du dann auch in der lastsnt.osc im Mapordner überprüfen
    cp_kneel_up_mode
    0
    oder
    cp_kneel_up_mode
    1



    Die Frage kannst du dir allein beantworten, wenn du das grüne liest.


    Das ganze nochmal:


    Das sollte deine frage beantworten.



    Wenn cp_kneel... (was im Trigger steht wann es eintritt?) dann rotiert das Objekt um 8


    Um 20°. Alle Angaben sind in Grad. Somit rotiert das Objekt um den (in Blender positionierten) Objektursprung. Dabei verändert sich der Winkel um 20 °. Also von 10° nach -10° = 20° gesamt.


    Wenn der erste Teil den Schalter von Position 0 in Position 1 bringt, was soll der Schalter dann machen? Sofort wieder in Stellung 0 zurückgehen? Ist das dann ein Schalter oder ein Taster???
    Also macht der erste Trigger nur eine Bewegung. Er versetzt den Schalter von Position 0 auf Position 1. Wie soll der Schalter wieder zurück kommen? Das macht der zweite Trigger. Wenn die Variable cp_kneel_up_mode 1 ist, dann wird der erste Trigger ignoriert und der zweite Trigger wird berechnet. Also setzt der zweite Trigger das Objekt in den Originalzustand zurück und alles beginnt von vorn.


    Was macht der letze Teil?


    Der Teil ist eigentlich ein Macro. Er hat nichts mit dem Schalter zu tun, sondern mit dem Kneeling.
    (L.L.cp_kneel_down_sw) ! (S.L.cp_kneel_down_sw)
    Lese den Wert der Variable cp_kneel_down_sw aus.
    Dann negiere den Wert (also von 0 auf 1 oder von 1 auf 0) und speichere ihn in den Stack.


    (L.L.door_0) 0 =
    (L.L.door_1) 0 = &&
    (L.L.door_2) 0 = &&
    (L.L.door_3) 0 = &&
    (L.L.door_4) 0 = &&
    (L.L.door_5) 0 = &&
    (L.L.door_6) 0 = &&
    (L.L.door_7) 0 = &&
    Wenn alle Türen den Zustand 0 haben (also geschloßen sind) dann:
    0 (S.L.kneel_allowed) (S.L.kneel_locked) (S.L.kneel_auto_set)
    sind diese drei Variablen auch 0. Ist eine der Türen nicht geschloßen (oder nicht vollständig geschloßen) dann (ansonsten):
    1 (S.L.cp_kneel_down_mode) s1
    bleibt die Variable auf Zustand 1, solange bis alle Türen vollständig geschloßen sind.


    Vorsicht: Das ganze ist jetzt sehr vereinfacht erklärt und stimmt nicht zu 100%, denn das Kneeling wird hier garnicht berechnet, sondern nur ob das Kneeling ausgeführt werden soll oder nicht, bzw ob das Kneeling zurückgesetzt werden darf oder nicht. Hier wurden einige Sachen anders umgesetzt als es normalerweise gemacht wir. So wird ein Schalter nicht von 10° nach -10° bewegt, sondern von 0 nach 20°. Dann kommt die Kontrollabfrage, ob das Kneeling ausgeführt werden darf oder nicht in den Abschnitt Kneeling. Diese zusätzlichen Eintragungen sind der Grund dafür warum die Performance leiden kann, wenn viele solcher Fehldinge eingesetzt wurden. Also ist dein Ausschnitt für Erklärungen etwas ungeeignet. Daher habe ich es etwas anders erklärt, als es in Omsi wirklich passiert. Die grundlegende Wirkungsweise ist aber vollkommen gleich.

  • Auch wenn ich schon den danke Button gedrückt habe möchte ich mich nochmal für deine Mühe schriftlich bedanken. Nicht nur hier sondern auch zu anderen Themen versuchst du alles so kurz wie möglich aber immer das wichtigste zu erklären, auch wenn die Themen für Neulinge nicht einfach sind.


    Habe das jetzt wie gewollt hinbekommen. Bei evtl. Fragen werde ich mich nochmal melden.


    Gruß

  • Tschuldigung wenn ich den Thread nochmal ausgrabe, aber ich hab ne leichte Gehirnblockade (Grippe und 39° Fieber) =O


    Ich hab grad nen Schalter im Armaturenbrett verschoben (Ohne Blender mit Daueranimation (hat gefühlte 5h gedauert X/)

    Eventuell kann mir nochmal jemand erklären, wie sich die Animation des Schalters nun berechnet. Hab totalen Blackout. Hab jetzt einfach die Werte der Daueranimation auf die bestehende Animation drauf gerechnet, aber das scheint nicht so zu funktionieren. Der Schalter verschwindet im Nirvana, wenn ich da drauf dück...



    mfg

    Daniel

  • Wenn dein Schalter beim Anklicken verschwindet, dann befindet sich der Fehler an folgender Stelle:


    Hier sind die Koordinaten eingetragen, wo dein Rotationspunkt für die Animation stehen soll. Der Rotationspunkt muß also genau unter dem Schalter liegen, wo das "Garnier" des Schalters ist. Den Wert kannst du nicht wirklich sauber errechnen. Teste es aus oder nutze den Positionswürfel, um die genaue Position zu finden (auch ohne Blender).

    Mit diesem Wert legst du fest um (bei einer Rotation) wieviel GRAD, das Objekt animiert werden soll. Fange mit kleineren Werten an.


    Im übrigen verschwindet dein Schalter nicht, sondern wird nach Ausführung der Animation von anderen Objekten verdeckt. In welche Richtung er sich dabei bewegt, erkennst du, wenn du den grünen Wert auf ein Minimum setzt (z.B. 0.5). Je näher du mit dem Rotationspunkt dem Objekt kommst, desdo geringer die Bewegung des Objektes (bei gleichbleibender Animationsweite).