1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Bitte schaltet eure Ad Blocker aus. SLinfo kann nur betrieben werden, wenn es durch Werbung Einnahmen erzielt. Vielen Dank!!
    Information ausblenden
  3. Wir freuen uns, wenn du dich in unserem Forum anmeldest. Bitte beachte, dass die Freigabe per Hand durchgeführt wird (Schutz vor Spammer). Damit kann die Freigabe bis zu 24 Stunden dauern.
    Information ausblenden

llSetKeyframedMotion KFM_LOOP

Dieses Thema im Forum "Scripting" wurde erstellt von Archon Short, 7. Oktober 2016.

  1. Archon Short

    Archon Short Administrator Mitarbeiter

    Beiträge:
    5.134
    Zustimmungen:
    724
    Punkte für Erfolge:
    124
    Moinsen, eventuell weiß hier ja jemand Rat

    Ich hab eine schöne Tour, die ich mit llSetKeyframedMotion abfahre.
    Leider stoppt sie immer am letzten Punkt, wenn ich KFM_LOOP nutze.

    Aktuell behelfe ich mir mit einem Timer, der das Script nach Ablauf einer Runde zurücksetzt.
    Das ist jedoch nicht Sinn und Zweck der Geschichte, da ich ja auch zwischendrin KFM_CMD_PAUSE nutzen möchte.

    Hier die Behelfslösung:
    Code:
    // HIER DIE DATEN FÜR DIE STRECKE A ZU B EINTRAGEN
    //                                  POSITION                             ROTATION
    list    L_Wegpunkte_hin         = [ <262221.00000, 262233.60000, 24.08972>, <0.00000, 0.00000, 180.00000>,   // Start
                                        <262067.90000, 262233.60000, 24.08972>, <0.00000, 0.00000, 180.00000>,
                                        <262055.30000, 262220.50000, 24.08972>, <0.00000, 0.00000, -90.00000>,
                                        <262055.30000, 262066.80000, 24.08972>, <0.00000, 0.00000, -90.00000>,
                                        <262048.80000, 262054.20000, 24.08972>, <0.00000, 0.00000, 180.00000>,
                                        <261997.40000, 262054.20000, 24.08972>, <0.00000, 0.00000, 180.00000>,
                                        <261984.70000, 262046.50000, 24.08972>, <0.00000, 0.00000, -90.00000>,
                                        <261984.70000, 262023.60000, 24.08972>, <0.00000, 0.00000, -90.00000>,
                                        <261991.30000, 262010.80000, 24.08972>, <0.00000, 0.00000, -45.00000>,
                                        <262006.80000, 261995.10000, 24.08972>, <0.00000, 0.00000, -45.00000>,
                                        <262020.70000, 261989.30000, 24.08972>, <0.00000, 0.00000, -0.00001>,
                                        <262036.70000, 261989.30000, 24.08972>, <0.00000, 0.00000, -0.00001>,
                                        <262046.30000, 261985.70000, 24.08972>, <0.00000, 0.00000, -90.00001>,
                                        <262057.90000, 261976.60000, 24.08972>, <0.00000, 0.00000, 0.00000>,
                                        <262225.20000, 261976.60000, 24.08972>, <0.00000, 0.00000, 0.00000>,
                                        <262235.40000, 261986.20000, 24.08972>, <0.00000, 0.00000, 90.00001>,
                                        <262245.90000, 261991.20000, 24.08972>, <0.00000, 0.00000, 0.00000>,
                                        <262262.80000, 261991.20000, 24.08972>, <0.00000, 0.00000, 0.00000>,
                                        <262276.10000, 261995.70000, 24.08972>, <0.00000, 0.00000, 45.00000>,
                                        <262292.70000, 262011.50000, 24.08972>, <0.00000, 0.00000, 45.00000>,
                                        <262297.50000, 262022.20000, 24.08972>, <0.00000, 0.00000, 90.00001>,
                                        <262297.50000, 262042.00000, 24.08972>, <0.00000, 0.00000, 90.00001>,
                                        <262303.60000, 262052.00000, 24.08972>, <0.00000, 0.00000, 0.00000>,        
                                        <262344.10000, 262052.00000, 24.08972>, <0.00000, 0.00000, 0.00000>,
                                        <262351.50000, 262057.80000, 24.08972>, <0.00000, 0.00000, 90.00001>,
                                        <262351.50000, 262101.60000, 24.08972>, <0.00000, 0.00000, 90.00001>,
                                        <262346.80000, 262108.20000, 24.08972>, <0.00000, 0.00000, 180.00000>,
                                        <262239.10000, 262108.20000, 24.08972>, <0.00000, 0.00000, 180.00000>,
                                        <262232.70000, 262114.80000, 24.08972>, <0.00000, 0.00000, 90.00001>,
                                        <262232.70000, 262221.30000, 24.08972>, <0.00000, 0.00000, 90.00001>]; // End
                                       
    // Speed of the vehicle
    float   F_Geschwindigkeit       = 3.1;
    
    list    L_aktuelle_Strecke;
    float   F_sekunden;
    
    Berechne_Fahrt()
    {
        integer I_Schritt;
        list    L_USE;
        F_sekunden = 0;
        L_aktuelle_Strecke=[];
        L_USE = L_Wegpunkte_hin;
       
            for(I_Schritt = 0; I_Schritt < llGetListLength(L_USE)-1; I_Schritt = I_Schritt+2)
            {
                vector v1a;//Position
                vector v1b = (vector)llList2String(L_USE,I_Schritt);
                vector v2a;//Rotation
                vector v2b = (vector)llList2String(L_USE,I_Schritt + 1);
                if(I_Schritt == 0)
                {
                    v1a = llGetRegionCorner() + llGetPos();
                    v2a = llRot2Euler( llGetRot())* RAD_TO_DEG;
                }
                else
                {
                    v1a = (vector)llList2String(L_USE,I_Schritt-2);
                    v2a = (vector)llList2String(L_USE,I_Schritt-1);
                }
           
                float distance = llVecDist(v1b, v1a);
                float seconds = distance / F_Geschwindigkeit;
                vector diff_p = v1b - v1a;
                vector diff_r = v2b - v2a;
                L_aktuelle_Strecke += [diff_p, llEuler2Rot(diff_r* DEG_TO_RAD), seconds];
                F_sekunden += seconds;
            }
        llMessageLinked(LINK_THIS,20,"a",NULL_KEY);
        Fahrt_zur_naechsten_Position();
    }
    
    Fahrt_zur_naechsten_Position()
    {
        //llOwnerSay(llList2CSV(L_aktuelle_Strecke));
        llSetKeyframedMotion(L_aktuelle_Strecke,[KFM_MODE,KFM_FORWARD]);
        llSleep(F_sekunden);
        llResetScript();
    }
    
    default
    {
        state_entry()
        {
            llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_PHYSICS_SHAPE_TYPE, PRIM_PHYSICS_SHAPE_CONVEX]);
            Berechne_Fahrt();
        }
               
        //link_message(integer s_link, integer s_chan, string s_msg, key id)
        //{
            //if(s_chan == 100)Berechne_Fahrt();
        //}
    }
    
     
  2. Whitefalcon

    Whitefalcon Nutzer

    Beiträge:
    20
    Zustimmungen:
    4
    Punkte für Erfolge:
    3
    Hi Archon,

    poste doch bitte mal den code der nicht funktioniert.

    Chris
     
  3. Archon Short

    Archon Short Administrator Mitarbeiter

    Beiträge:
    5.134
    Zustimmungen:
    724
    Punkte für Erfolge:
    124
    Hab hier jetzt KFM_FORWARD in KFM_LOOP geändert, sowie das llSleep und llResetScript deaktiviert.
    Das ist es dann schon was nicht läuft.
    Sleep und Reset sind halt die Behelfslösung.

    Code:
    // HIER DIE DATEN FÜR DIE STRECKE A ZU B EINTRAGEN
    //                                  POSITION                             ROTATION
    list    L_Wegpunkte_hin         = [ <262221.00000, 262233.60000, 24.08972>, <0.00000, 0.00000, 180.00000>,   // Start
                                        <262067.90000, 262233.60000, 24.08972>, <0.00000, 0.00000, 180.00000>,
                                        <262055.30000, 262220.50000, 24.08972>, <0.00000, 0.00000, -90.00000>,
                                        <262055.30000, 262066.80000, 24.08972>, <0.00000, 0.00000, -90.00000>,
                                        <262048.80000, 262054.20000, 24.08972>, <0.00000, 0.00000, 180.00000>,
                                        <261997.40000, 262054.20000, 24.08972>, <0.00000, 0.00000, 180.00000>,
                                        <261984.70000, 262046.50000, 24.08972>, <0.00000, 0.00000, -90.00000>,
                                        <261984.70000, 262023.60000, 24.08972>, <0.00000, 0.00000, -90.00000>,
                                        <261991.30000, 262010.80000, 24.08972>, <0.00000, 0.00000, -45.00000>,
                                        <262006.80000, 261995.10000, 24.08972>, <0.00000, 0.00000, -45.00000>,
                                        <262020.70000, 261989.30000, 24.08972>, <0.00000, 0.00000, -0.00001>,
                                        <262036.70000, 261989.30000, 24.08972>, <0.00000, 0.00000, -0.00001>,
                                        <262046.30000, 261985.70000, 24.08972>, <0.00000, 0.00000, -90.00001>,
                                        <262057.90000, 261976.60000, 24.08972>, <0.00000, 0.00000, 0.00000>,
                                        <262225.20000, 261976.60000, 24.08972>, <0.00000, 0.00000, 0.00000>,
                                        <262235.40000, 261986.20000, 24.08972>, <0.00000, 0.00000, 90.00001>,
                                        <262245.90000, 261991.20000, 24.08972>, <0.00000, 0.00000, 0.00000>,
                                        <262262.80000, 261991.20000, 24.08972>, <0.00000, 0.00000, 0.00000>,
                                        <262276.10000, 261995.70000, 24.08972>, <0.00000, 0.00000, 45.00000>,
                                        <262292.70000, 262011.50000, 24.08972>, <0.00000, 0.00000, 45.00000>,
                                        <262297.50000, 262022.20000, 24.08972>, <0.00000, 0.00000, 90.00001>,
                                        <262297.50000, 262042.00000, 24.08972>, <0.00000, 0.00000, 90.00001>,
                                        <262303.60000, 262052.00000, 24.08972>, <0.00000, 0.00000, 0.00000>,      
                                        <262344.10000, 262052.00000, 24.08972>, <0.00000, 0.00000, 0.00000>,
                                        <262351.50000, 262057.80000, 24.08972>, <0.00000, 0.00000, 90.00001>,
                                        <262351.50000, 262101.60000, 24.08972>, <0.00000, 0.00000, 90.00001>,
                                        <262346.80000, 262108.20000, 24.08972>, <0.00000, 0.00000, 180.00000>,
                                        <262239.10000, 262108.20000, 24.08972>, <0.00000, 0.00000, 180.00000>,
                                        <262232.70000, 262114.80000, 24.08972>, <0.00000, 0.00000, 90.00001>,
                                        <262232.70000, 262221.30000, 24.08972>, <0.00000, 0.00000, 90.00001>]; // End
                                     
    // Speed of the vehicle
    float   F_Geschwindigkeit       = 3.1;
    
    list    L_aktuelle_Strecke;
    float   F_sekunden;
    
    Berechne_Fahrt()
    {
        integer I_Schritt;
        list    L_USE;
        F_sekunden = 0;
        L_aktuelle_Strecke=[];
        L_USE = L_Wegpunkte_hin;
     
            for(I_Schritt = 0; I_Schritt < llGetListLength(L_USE)-1; I_Schritt = I_Schritt+2)
            {
                vector v1a;//Position
                vector v1b = (vector)llList2String(L_USE,I_Schritt);
                vector v2a;//Rotation
                vector v2b = (vector)llList2String(L_USE,I_Schritt + 1);
                if(I_Schritt == 0)
                {
                    v1a = llGetRegionCorner() + llGetPos();
                    v2a = llRot2Euler( llGetRot())* RAD_TO_DEG;
                }
                else
                {
                    v1a = (vector)llList2String(L_USE,I_Schritt-2);
                    v2a = (vector)llList2String(L_USE,I_Schritt-1);
                }
         
                float distance = llVecDist(v1b, v1a);
                float seconds = distance / F_Geschwindigkeit;
                vector diff_p = v1b - v1a;
                vector diff_r = v2b - v2a;
                L_aktuelle_Strecke += [diff_p, llEuler2Rot(diff_r* DEG_TO_RAD), seconds];
                F_sekunden += seconds;
            }
        llMessageLinked(LINK_THIS,20,"a",NULL_KEY);
        Fahrt_zur_naechsten_Position();
    }
    
    Fahrt_zur_naechsten_Position()
    {
        //llOwnerSay(llList2CSV(L_aktuelle_Strecke));
        llSetKeyframedMotion(L_aktuelle_Strecke,[KFM_MODE,KFM_LOOP]);
        //llSleep(F_sekunden);
        //llResetScript();
    }
    
    default
    {
        state_entry()
        {
            llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_PHYSICS_SHAPE_TYPE, PRIM_PHYSICS_SHAPE_CONVEX]);
            Berechne_Fahrt();
        }
             
        //link_message(integer s_link, integer s_chan, string s_msg, key id)
        //{
            //if(s_chan == 100)Berechne_Fahrt();
        //}
    }
     
  4. Archon Short

    Archon Short Administrator Mitarbeiter

    Beiträge:
    5.134
    Zustimmungen:
    724
    Punkte für Erfolge:
    124
    Die Streckenkoordinaten sind auf den Burn2 Sims, die erst in ein paar Tagen der Öffentlichkeit freigegeben werden.
     
  5. Rebekka Revnik

    Rebekka Revnik Superstar

    Beiträge:
    1.081
    Zustimmungen:
    21
    Punkte für Erfolge:
    48
    Warum so umständlich? llSetkeyFramedMotion ist ja dafür bekannt, dass es Punkte nicht korrekt anfährt. Ich hab mir auch sone Tour gebastelt, allerdings nicht alles auf eimal rein, sondern immer nur eine Strecke, und den Endpunkt mit moving_end ausgewertet, da kannst auch ne Pause einlegen und/oder nen Text ausgeben, und dann weiter zum nächsten Punkt. Bei mir ist es immer nur eine Runde, aber du kannst das ja auch zyklisch machen, bei Bedarf geb ich dir die Skripte.
     
  6. Archon Short

    Archon Short Administrator Mitarbeiter

    Beiträge:
    5.134
    Zustimmungen:
    724
    Punkte für Erfolge:
    124
    An moving_end hatte ich auch schon gedacht.
    Aktuell hab ich mir anders geholfen, da das Ganze Ding doch ziemlich seltsam ist und teilweise die Punkte um etliche Meter verpasst.
    Ich hab es bei einer Strecke mit 4 Punkten auf einer Sim zum laufen bekommen, da gab es keine Probleme, eventuell ist die Strecke ja zu lang oder es liegt daran, daß sie über 4 Sims geht.

    Meine jetzige Version funktioniert gut genug um beim Burn2 die geführte Tour abzufahren und Zwischenstops einzulegen.
    Bei einer größeren Auftragsarbeit arbeite ich aber an einer weit besseren Lösung, da dort auch die Möglichkeit der Streckenänderung an bestimmten Punkten gewährleistet sein muss.