• 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.

[Tutorial] llDetectedTouchST(0); (Koordinaten auf einer Flaeche (2D) abfragen)

Daemonika Nightfire

Forumsgott/göttin
huhu,

ich habe mal ein paar kleine Beispiele zum Thema llDetectedTouchST(0); vorbereitet.

Vorwort:
llDetectedTouchST(0) gibt einen Vector <x, y, z,> aus, wobei die Z-Achse nicht beruecksichtigt wird, da eine Flaeche 2 Dimensional ist. Dennoch wuerde es zu Fehlermeldungen kommen, wenn man diesen Eintrag ganz weg laesst, weil die Funktion halt einen Vector verlangt.
Zudem sollte man noch erwaehnen, das ein Vector auch zerlegt und veraendert werden kann, da es sich um 3 Float's (komma-werte) innerhalb dieses Vector's handelt <float.x, float.y, float.z>. Das ist aber nur wichtig wenn man vor hat, entsprechende Eintraege zu veraendern.

Fangen wir mal mit einem einfachen Beispiel an.
Dieses Script dient erst einmal nur dazu, zu verstehen wie die Koordinaten auf der Flaeche verteilt sind. Dazu halte die Maus auf der Flaeche gedrueckt und schiebe sie herum, dabei kannst du am Hovertext die aktuellen Koordinaten deiner Maus ablesen.
TouchST 512px.jpg
*DS* TouchST Default
Code:
default
{
    state_entry()
    {
        llSetTexture("1825a910-58bd-ddc9-530a-963c1df6875d", 0);
    }
    
    touch(integer total_number)
    {
        if(llDetectedTouchFace(0) == 0)
        {
            vector offset = llDetectedTouchST(0); // erkennt die Koordinaten wo die Flaeche geklickt wurde
            llSetText("Vector " + (string)offset, <1,1,0>, 1.0); // einfacher Hovertext mit den aktuellen Koordinaten
        }
    }
    
    on_rez(integer Dae)
    {
        llResetScript();
    }
}


Im naechsten Beispiel geht es darum, einen bestimmten Bereich auf der Flaeche abzustecken.
Hier habe ich eigentlich das obere Script lediglich um eine Abfrage erweitert. In dieser Abfrage vergleiche ich ob die aktuellen Koordinaten innerhalb meines abgesteckten Bereiches liegen. Wenn das der Fall ist, aendert der Hovertext beim drueber fahren oder klicken mit der Maus die Farbe.
TouchST2 512px.jpg
*DS* TouchST Sector
Code:
default
{
    state_entry()
    {
        llSetTexture("c730adb7-6813-f256-8f7f-ce699b0a68c9", 0);
    }
    
    touch(integer total_number)
    {
        if(llDetectedTouchFace(0) == 0)
        {
            vector pos = llDetectedTouchST(0); // erkennt die Koordinaten wo die Flaeche geklickt wurde
            llSetText("Vector " + (string)pos, <1,1,0>, 1.0); // einfacher Hovertext mit den aktuellen Koordinaten
            
            // Diese beiden Vectoren sind ausschliesslich fuer diesen einen abgesteckten Bereich auf der Flaeche
            vector UntenLinks = <0.10000, 0.50000, 0.00000>; // untere linke Ecke
            vector ObenRechts = <0.50000, 0.90000, 0.00000>; // obere rechte Ecke
            
            if(pos.x > UntenLinks.x && pos.y > UntenLinks.y && pos.x < ObenRechts.x && pos.y < ObenRechts.y)
            {
                llSetText("Vector " + (string)pos, <0,1,0>, 1.0); // einfacher Hovertext mit den aktuellen Koordinaten
            }
        }
    }
    
    on_rez(integer Dae)
    {
        llResetScript();
    }
}
Jetzt stellt ihr euch wahrscheinlich die Frage, wie ich an die Koordinaten des Bereichs heran gekommen bin. Nun, das ist relativ einfach.
Dazu habe ich lediglich ein kleines Helfer Script hinein gelegt und die Flaeche von unten links nach oben rechts markiert.
Zwei Vectoren sind voellig ausreichend um einen vier-eckigen Bereich auf einer Flaeche zu begrenzen.
*DS* TouchST Helper
Code:
default
{
    touch_start(integer total_number)
    {
        vector pos = llDetectedTouchST(0);
        llSay(0,(string)pos);
    }
}
Mit Hilfe diesem kleinen Tools habe ich lediglich die Ausgaben vom Chat ins Script uebertragen.


Folgendes Beispiel ist schon etwas anspruchsvoller.
Hier wird die gesamte Flaeche in ein Raster zerlegt und man kann jeden Sektor separat abfragen.
Ich habe das Script so vorbereitet, das man mittels der oberen beiden Floats die Spalten und Zeilen individuell anpassen kann. Das Script rechnet die Werte automatisch um. Bei der aktuellen Einstellung verwendet das Script ein Raster von 100 Quadraten beginnend mit der Zahl 1.
Hierbei ist zu beachten, das es hier den selben Regeln folgt, wie die Verteilung der Vectoren, naemlich von unten links nach oben rechts.
Folgene Textur wird lediglich zur optischen Darstellung verwendet.
rahmen 128px.jpg
Der rote Bereich im Script ist ausschliesslich fuer diese Textur vorgesehen und hat mit dem eigentlichen Script herzlich wenig am Hut und kann bei eigenen Projekten komplett weg gelassen werden.

*DS* TouchST Grid
Code:
// Anzahl Spalten und Zeilen
float X = 10; // Spalten
float Y = 10; // Zeilen

[COLOR="#FF0000"]// ↓ ---------------------- Textur Parameter -------------------------- ↓
// Folgende Funktion verschiebt den Offset bei ungeraden Teilschritten, damit am Rand keine halben Kaestchen entstehen.
// Dient nur zur optischen Darstellung dieses Beispiels und wird eigentlich nicht benoetigt.
float offset(float val)
{
    if((integer)val % 2 == 0)
    {
        return val = 0.5;
    }
    return val = 0.0;
}
// ↑ ------------------------------------------------------------------- ↑[/COLOR]

default
{
    state_entry()
    {
        [COLOR="#FF0000"]// ↓ ---------------------- Textur Parameter -------------------------- ↓
        // Dient nur zur optischen Darstellung dieses Beispiels und wird eigentlich nicht benoetigt.
        llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_TEXTURE, 0, "76c310f8-f813-6cb5-b7dd-f9402a0c3a51", <X, Y, 0.0>, <offset(X), offset(Y), 0.0>, 0.0]);
        // ↑ -------------------------------------------------------------------↑[/COLOR]
    }
    
    touch_start(integer total_number)
    {
        if(llDetectedTouchFace(0) == 0)
        {
            vector pos = llDetectedTouchST(0); // erkennt die Koordinaten wo die Flaeche geklickt wurde
            llSetText("Vector " + (string)pos, <1,1,0>, 1.0); // einfacher Hovertext mit den aktuellen Koordinaten
            
            integer number = llFloor(pos.y*Y) * (integer)X + llCeil(pos.x*X); // rechnet die Koordinaten in ein Raster um
            llSay(0,"Sector Nr. " + (string)number); // gibt die errechneten Koordinaten als integer im Chat aus
            
            // Nun kann man auf diesem Raster beliebige Sektoren abfragen und das Script entsprechend reagieren lassen
            if(number == 15)
            {
                llSay(0,"Gratuliere, du hast die Nr. " + (string)number + " gefunden.");
            }
        }
    }
    
    on_rez(integer Dae)
    {
        llResetScript();
    }
}
PS: Bevor sich jemand genoetig fuehlt die Richtung von unten links nach oben rechts zu beanstanden, schaut mal auf euren Nummernblock.


Beim naechsten Beispiel wird es etwas Tricky.
Als ich dieses Beispiel Fertig hatte, wollte ich mal in der Wiki nachsehen, ob es vielleicht eine elegantere Methode gibt. Naja, gibt es nicht und das Beispiel von dort funktioniert irrational, oder ist nicht fertig.

Hier soll die Textur dem Mauszeiger folgen.
Damit die Textur sich nicht voellig daneben benimmt, habe ich ganz einfach einen negativen Vector hinzu gegeben um das Zentrum der Textur unter der Maus zu halten. Weiterhin werdet ihr feststellen, das ich bei den Parametern im Befehl ganz einfach ein Minus Zeichen vor den Offset gesetzt habe, dadurch verhaelt sich die Bewegung der Textur nicht spiegelverkehrt zur Bewegung mit der Maus.

Grid Schwarz 512px.jpg
Diese Textur habe ich nur Verwendet, damit man eindeutig sieht, wie sie sich verhaelt.

*DS* TouchST Offset
Code:
default
{
    state_entry()
    {
        llSetTexture("cc41beb3-0d13-3e05-df36-e00caa3372a7", 0);
    }
    
    touch(integer total_number)
    {
        if(llDetectedTouchFace(0) == 0)
        {
            vector offset = llDetectedTouchST(0); // erkennt die Koordinaten wo die Flaeche geklickt wurde
            llSetText("Vector " + (string)offset, <1,1,0>, 1.0); // einfacher Hovertext mit den aktuellen Koordinaten
            
            offset += <-0.5,-0.5,0.0>; // schiebt das Zentrum der Textur zur geklickten Position
            llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_TEXTURE, 0, "cc41beb3-0d13-3e05-df36-e00caa3372a7", <1.0,1.0,0.0>, -offset, 0.0]);
        }
    }
    
    on_rez(integer Dae)
    {
        llResetScript();
    }
}


Das war es erst einmal von mir. Anregungen und Verbesserungsvorschlaege sind natuerlich erwuenscht.

LG
Dae
 
Zuletzt bearbeitet:

Users who are viewing this thread

Zurück
Oben Unten