Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
(Fast) weiche Bewegung - Tour Skript
#11
Wenn da was sein könnte, was mit der OS Version zu tun hat, dann wird es Zeit, dass ich mich darum zu kümmere, sonst fliegen unsere Vögel nach der Umstellung bei Metropolis nicht mehr Sad

Mir fehlt gerade die Zeit mich um das Script zu kümmern. Ich habe in meinem Script deine SFNotat() eingebaut. Das hat bei mir eine Änderung ergeben, aber richtig funktioniert hat es trotzdem nicht. Bei den ersten 2 Versuchen ging das Objekt bis zum 2. Wegpunkt und nach einer Änderung der Notecard landete mein Objekt auf <0.0,0.0,0.0>. Es kann aber gut sein, dass ich gestern das Script "verbastelt" habe. Ich bin gespannt wie es Cosmic ergeht. Ansonsten setze ich mich, wie in einem anderen Thread schon geschrieben, Anfangs nächster Woche damit auseinander.
Zitieren
#12
Ich habe das Script mit der Korrektur nochmals neu erstellt und es scheint jetzt bei mir zu funktionieren!
Zitieren
#13
Hi,
das Script verhält sich bei mir anders als die Vorgängerversion.
ich habe 5 Versuche gemacht:
1. geändertes Script in einen Würfel gepackt. Zunächst gleiches Verhalten wie bislang.
Nach Anstoßen über Bearbeitung ist es losgelaufen, hat sich anfänglich ein paar mal um sich gedreht und vermutlich an den Wegepunkt-Enden "Object: Fertig" ausgegeben. Nach ca. 2/3 der Wegepunkte und gleichmässigem Gleiten ist es aber auch stehen geblieben.
2. Das gleiche Script habe ich dann in eine Drone gepackt. Nach dem "Anschupsen" war die Drone im Nirwana verschwunden. Muss ich noch suchen.
3.Ursprugswürfel resetet und neu gestartet. Gleicher Würfel, gleiches Script wie unter Punkt 1, aber komplett anderes Verhalten. Würfel ist immer weiter in die Luft geschwebt (sah schön aus :-)).
4. Würfel eingefangen, resetet, Würfel macht gar nichts mehr.
5. Neuen Würfel gerezzt, Scripte rein, Funktion wieder wie unter Punkt1

Ich werde das Script morgen noch auf einer anderen 9er Standalone Plattform testen.
Schönen Abend
Zitieren
#14
Komisch. Punkt 2 und 3 hört sich an wie bei meinem ersten Versuch. Aber ich habe jetzt mehrere Tests mit OpenSimulator 0.9.0.1 gemacht und alle funktionierten. Ich habe auf zwei Single Regionen getestet, eine mit ubODE und die andere mit ODE.

P.S. Ich habe übrigens das Script aus diesem Thread genommen und nur noch die Änderung angepasst. Das Script das nicht funktionierte war das Original von Rebekka aus dem Thread im OSGrid Forum. Für die Tests bin habe ich mich auf das Prim gesetzt (geht aber auch ohne).
Zitieren
#15
Hallöschen,
habe heute morgen opensim-0.9.0.1 im standalone Modus mit SQLite installiert.
in der Opensim.ini habe ich angepasst:
Allow_osGetRegionStats = true
AllowOSFunctions = true
osslEnable.ini
Allow_osSetPrimitiveParams = true

Ich habe das modifizierte Script von Rebekka eingesetzt und mit ihrem Extra Script eine neue Notecard erstellt. Das Script wird abgearbeitet, zwar mit ein paar Drehungen des objects um die waagrechte Achse, die so mit dem Notecard Script nicht eingeben wurden, ansonsten scheinbar fehlerfrei.

Mein altes Script mit Modifikation läßt nach dem Wegepunkte lesen und touch, das object zum Startpunkt springen. Nach dem Anschubsen über Bearbeiten gleitet es auf dem Boden ganz langsam zu Simrand und bleibt stehen.

hier füge ich mal den bei mir eingesetzten unmodifizierten Code an:
Code:
osWarpPos (key id, vector destpos ) {
         vector primPos = llList2Vector(osGetPrimitiveParams(id, [PRIM_POSITION]), 0);
         integer jumps = (integer)(llVecDist(destpos, primPos) / 0.3) + 1;
         // Try and avoid stack/heap collisions
         if (jumps > 411)
             jumps = 411;
         list rules = [ PRIM_POSITION, destpos ];  //The start for the rules list
         integer count = 1;
         while ( ( count = count << 1 ) < jumps)
             rules = [] + rules + rules;   //should tighten memory use.
         osSetPrimitiveParams(id, rules + llList2List( rules, (count - jumps) << 1, count) );
         vector primPos2 = llList2Vector(osGetPrimitiveParams(id, [PRIM_POSITION]), 0);
         if ( llVecDist( primPos2, destpos ) > .001 ) //Failsafe
             while ( --jumps )
                osSetPrimitiveParams(id, [PRIM_POSITION, destpos]);
    }


    vector      SF_spos;        //start position
    rotation    SF_srot;        //starting rotation
    float       SF_stime;       //starting time
    vector      SF_epos;        //ending position
    rotation    SF_erot;        //ending rotation
    float       SF_seconds;     //time to move that distance
    integer     SF_target=-1;      //handle of last target position
    integer     continuous=0;    //loop back through path

    SFrame()
    {
       SF_spos=llGetPos();
       SF_stime=llGetTime();
       SF_epos = llList2Vector(Points, Count);
       SF_seconds=llVecDist(SF_epos, llGetPos()) / TIME;
       llTargetRemove(SF_target);
       SF_target=llTarget(SF_epos, 0.1);
    }

    integer SFnotat()
    {
       if (SF_target== -1) return TRUE;
       float time=llGetTime();
       time = (time-SF_stime)/SF_seconds;
       if (time>1.0)
       {
          llTargetRemove(SF_target);
          SF_target=-1;
          llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_POSITION,SF_epos]);
          return TRUE;
       }
       float emit= 1.0-time;
       vector pos=SF_epos*time+SF_spos*emit;
      
       vector v = <0.0, 0.0, 1.0>;
       llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_POSITION,pos]);
       return FALSE;
    }

    // ab hier hab ich das geschrieben :-)

    // Mach dir eine Notecard mit den folgenden Einträgen
    // Gross/Kleinschreibung ist nicht wichtig, also DRIVE ist genauso gut wie drive oder Drive

    // DRIVE = Position = Rotation      die Wegpunkte eben, mit Position und Rotation

    // nach dem Wegpunkt (muss aber nicht sein)

    // PAUSE = Sekunden               hält das Objekt ne Weile an
    // TEXT = text                  sagt den Text im Chat

    // now that's my part :-)

    // Make a notecard with the folling entries
    // it's not case sensitive, for example drive is accepted as DRIVE or Drive

    // DRIVE = Position = Rotation      the waypoints with given params

    // after the waypoint (optionally but but not required)

    // PAUSE = seconds               makes the object to stay for a while
    // TEXT = text                  says the text in chat

    // wie es oben steht, die Schlüsselwörter
    // as above, the keywords
    string DRIVE = "drive";
    string PAUSE = "pause";
    string TEXT = "text";
    // Name der Notecard
    // name of the notecard
    string NCNAME = "config";
    // Trennzeichen für die Schlüsselwörter
    // separator for keywords
    string SEPARATOR = "=";
    // wie schnell sich das Objekt bewegt
    // 1 ist ungefähr 1 Meter pro Sekunde
    // Grösser = schneller, aber auch mehr ruckeln
    // how fast your object will move
    // 1 means appr. 1 m per second
    // a greater number ist faster but less smoothly
    float TIME = 1.0;
    // Stell es auf TRUE, dann kommen Infos im Chat über die Wegpunkte
    // set it to TRUE to get informations about the waypoints in chat
    integer DEBUG = FALSE;
    // Wähle die Sprache, ich kann nur die beiden unten sprechen
    // 0 = deutsch, 1 = englisch
    // choose language, I speak only the two below
    // 0 for german, 1 for english
    integer LANGUAGE = 0;

    list Points;
    list Rots;
    list Pause;
    list Text;
    integer NCLine;
    key NCid;
    integer Count;

    // liest ein Zeile aus der Notecard und speichert sie
    // reads a notecard line and saves it
    Read(string data)
    {
       list l = llParseString2List(data, [SEPARATOR], []);
       string s1 = llToLower(llStringTrim(llList2String(l, 0), STRING_TRIM));
       vector v1 = (vector)llToLower(llStringTrim(llList2String(l, 1), STRING_TRIM));
       rotation r1 = (rotation)llToLower(llStringTrim(llList2String(l, 2), STRING_TRIM));
       integer x;
       if(s1 == DRIVE)
       {
          if(v1 != ZERO_VECTOR)
          {
             Points += [v1];
             Rots += [r1];
             Pause += [0];
             Text += [""];
          }
       } else if(s1 == PAUSE)
       {
          x = llGetListLength(Pause) - 1;
          Pause = llListReplaceList(Pause, [(float)llToLower(llStringTrim(llList2String(l, 1), STRING_TRIM))], x, x);

       } else if(s1 == TEXT)
       {
          x = llSubStringIndex(data, SEPARATOR);
          data = llDeleteSubString(data, 0, x);
          x = llGetListLength(Text) - 1;
          Text = llListReplaceList(Text, [llStringTrim(data, STRING_TRIM)], x, x);
       }
    }

    // Sagt was in der Notecard steht (TEXT = text), ohne den Objektnamen
    // es muss aber ein Leerzeichen drin sein und mindestens zwei Wörter haben
    // sonst kommt nur der normale Chat mit dem Objektnamen
    // says what you wrote in the notecard (TEXT = text) without the object name
    // it has to be a space in it and at least two words
    // otherwise you'll get only the normal chat with the object name
    Say(string s)
    {
       string s1 = llGetObjectName();
       integer x = llSubStringIndex(s, " ");
       if(x != -1)
       {
          string s2 = llGetSubString(s, 0, x - 1);
          s = llDeleteSubString(s, 0, x -1);
          s = "/me" + s;
          llSetObjectName(s2);
       }
       llSay(0, s);
       llSetObjectName(s1);
    }

    default
    {
       on_rez (integer start_param) {
            llResetScript();
        }

       state_entry()
       {
          llSetText("", <1,1,1>, 1.0);
          Points = [];
          Rots = [];
          Pause = [];
          Text = [];
          if(llGetInventoryType(NCNAME) == INVENTORY_NONE)
          {
             if(LANGUAGE == 0) llOwnerSay("Keine config-NC gefunden.");
             else if(LANGUAGE == 1) llOwnerSay("No config nc found.");

          } else
          {
             if(LANGUAGE == 0) llOwnerSay("Lese config, bitte warten...");
             else if(LANGUAGE == 1) llOwnerSay("Reading config nc, please wait...");
             NCLine = 0;
             NCid = llGetNotecardLine(NCNAME, NCLine++);
          }
       }
       dataserver(key requested, string data)
       {
          if(requested == NCid)
          {
             if(data != EOF)
             {
                Read(data);
                NCid = llGetNotecardLine(NCNAME, NCLine++);
             } else
             {
                if(LANGUAGE == 0) llOwnerSay("Fertig.");
                else if(LANGUAGE == 1) llOwnerSay("Ready.");
                if(llGetListLength(Points) == 0)
                {
                   if(LANGUAGE == 0) llOwnerSay("Keine Wegpunkte gefunden.");
                   else if(LANGUAGE == 1) llOwnerSay("No waypoints found.");
                }
                else
                {
                   if(LANGUAGE == 0) llOwnerSay((string)llGetListLength(Points) + " Wegpunkte gelesen.");
                   else if(LANGUAGE == 1) llOwnerSay((string)llGetListLength(Points) + " waypoints read.");
                   state running;
                }
             }
          }
       }
    }

    state running
    {
       state_entry()
        {
            if(continuous == 1) {
            state drive;
                
            }
       }
       touch_start(integer total_number)
        {
            continuous = 1;
            list homeList = llParseString2List(osGetNotecardLine("config", 0), "=", "");
            vector homePos = llList2Vector(homeList,1);
            osWarpPos(llGetKey(), homePos);
            llSleep(2.0);

            state drive;
       }
    }
    state drive
    {
       state_entry()
       {
          llSetText("", <1,1,1>, 1.0);
          Count = 0;
          SFrame();
        }
        changed (integer change) {
            if (change & CHANGED_REGION_START) {
                SFrame();
            }
    
        }

       not_at_target()
       {
          if(SFnotat())
          {
             if(DEBUG)
             {
                if(LANGUAGE == 0) llOwnerSay("Wegpunkt Nr. " + (string)(Count + 1) + " bei " + (string)llList2Vector(Points, Count));
                else if(LANGUAGE == 1) llOwnerSay("waypoint no. " + (string)(Count + 1) + " at " + (string)llList2Vector(Points, Count));
             }
             if(llList2String(Text, Count) != "") Say(llList2String(Text, Count));
             if(llList2Float(Pause, Count) > 0) llSleep(llList2Float(Pause, Count));
             rotation newRot = llList2Rot(Rots, Count);
             llSetRot(newRot); //Do the Rotation...

             Count++;
             if(Count == llGetListLength(Points)) state running;
             SFrame();
          }
       }
    }
Gruß
Zitieren
#16
Ganz ähnlich war es bei mir mit dem alten Script nach dem Austausch von SFNotat() auch. Zweimal war es so, dass nach dem Touch nichts passiert ist. Ich habe dann die Sim verlassen und mich ausgeloggt. Als ich wieder zurückgekommen bin war mein Prim einmal am Sim-Rand in der Nähe des zweitletzten Wegpunktes und einmal in der Ecke am bereits erwähnten Punkt <0.0, 0.0, 0.0>.

Mit dem neuen Script funktioniert es bei mir. Das mit den Drehungen ist mir bisher noch nicht aufgefallen. Ich habe aber nicht immer hingeschaut, da meine Tour etwa 10 Minuten dauert und ich keine Zeit habe.
Zitieren
#17
Ich habe gestern Abend noch ein wenig herum getestet.
Vereinfacht erstellte ich eine notecard mit hin und zurück auf 1m Höhenunterschied. Am Wendepunkt eine 180 Grad Drehung, insgesamt 4 config-Einträge.
Auf meiner 9er Sim mit Robust Server startet das Programm nach touch und bewegt das object mit der Steigung ans erste Ziel (Wendepunkt).
Erhalte "Object: Fertig" und das object stopt. Ein erneuter touch ist nicht möglich.
Script wurde an der Stop Stelle zurückgesetzt.
Jetzt wandert das object, nach touch, an den eigentlichen Startpunkt zurück, bringt dort "Object: Fertig", hält aber nicht an, sondern wandert zurück zur Startposition (erstes Ziel/Wendepunkt). Dort wieder "Object: Fertig" in der Ausgabe und Stop.


Der nächste Test ist eine Variante mit 3 Wegepunkten (ohne 180 Grad Drehung).
Das object gleitet schön hin und zurück wie es soll. Die "Hand auf dem object" ist für einen erneuten touch vorhanden, aber die Wiederholung funktioniert nicht. Selbst ein Scriptreset bringt nichts. Packe ich die Scripte von einem object in ein neues, ist die Funktion gegeben, aber nur wie zuvor, für einen Durchlauf.
Beide Tests lassen sich mit dem selben Ergebnis beliebig wiederholen.
Zitieren
#18
Hallo liebe Leute,
ich habe auf der neuen Opensim 0.9.1.1 das Script wieder getestet.
Anfänglich hat es auch nach der ersten Drehung abgebrochen siehe Abbruchstelle in rot:

DRIVE = <660.414063, 349.335541, 21.250000> = <0.000000, 0.000000, 0.000000, 1.000000>
DRIVE = <662.274902, 349.335541, 22.270514> = <0.000000, 0.000000, 0.000000, 1.000000>
DRIVE = <662.274902, 349.335541, 22.270514> = <0.000000, 0.000000, -1.000000, 0.000000>
DRIVE = <660.025513, 349.335541, 22.270514> = <0.000000, 0.000000, -1.000000, 0.000000>
DRIVE = <660.025513, 349.335541, 22.270514> = <0.000000, 0.000000, 0.000000, 1.000000>

Wenn ich auf einer Zielposition nur eine reine Drehung durchführe, läuft das Script nicht weiter.
Wenn ich die Drehung in der config Datei z.B. in der Y Bewegung leicht anpasse, läuft das Script fehlerfrei.
Die Anpassungen sind im folgenden funktionierenden Beispiel rot dargestellt:

DRIVE = <660.414063, 349.335541, 21.250000> = <0.000000, 0.000000, 0.000000, 1.000000>
DRIVE = <662.274902, 349.335541, 22.270514> = <0.000000, 0.000000, 0.000000, 1.000000>
DRIVE = <662.274902, 349.135541, 22.270514> = <0.000000, 0.000000, -1.000000, 0.000000>
DRIVE = <660.025513, 349.235541, 22.270514> = <0.000000, 0.000000, -1.000000, 0.000000>
DRIVE = <660.025513, 349.335541, 22.270514> = <0.000000, 0.000000, 0.000000, 1.000000>

Mit diesem Vorgehen habe ich alle meine bewegten Objekte wieder zum Laufen gebracht.
Zitieren
#19
Danke für den Hinweis. Ich werd das mal ins Skript einbauen, man muss ja nicht alles von Hand machen.
Leider ist meine Signatur ausserhalb Sachsens nicht verfügbar.
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste