• Bitte schaltet eure Ad Blocker aus. SLinfo kann nur betrieben werden, wenn es durch Werbung Einnahmen erzielt. Vielen Dank!!
  • 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.
  • Wir verwenden Cookies, um Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anbieten zu können und die Zugriffe auf unsere Website zu analysieren. Sie geben Einwilligung zu unseren Cookies, wenn Sie unsere Webseite weiterhin nutzen.

llSetKeyframedMotion KFM_LOOP

Archon Short

Forumsgott/göttin
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();
    //}
}
 
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();
    //}
}
 
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.
 
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.
 

Users who are viewing this thread

Zurück
Oben Unten