In diesem Beitrag möchte ich einige Möglichkeiten von der Linden Scripting Language (kurz LSL) zusammenfassen. Dazu stelle ich im Anhang auch mein erstes Mini-Tutorial für Secondlife als PDF zum Download bereit.
In diesem, meinen ersten Secondlife-Techtalk möchte ich zeigen, wie einfach es ist, in Secondlife ein 3D-Objekt zu modellieren und es mit spezieller Funktionalität zu versehen. Modelliert wirdImage may be NSFW.
Clik here to view. sozusagen “In-Game”, d.h. in Secondlife selbst. Es gibt, soweit mir bekannt, keine Möglichkeiten, einen “Offline-3D-Modeller” zu verwenden oder gar Modelle zu importieren. Deshalb beziehen sich meine Ausführungen hier auf den “In-Game”-Modeller. Das Beispiel zeigt, wie man mit einfachen Mitteln ein kleine transparente Wand modellieren kann. Mittels LSL-Script habe ich meiner transparenten Wand folgende Funktionen hinzugefügt:
- Die Wand reagiert mit einem Text, wenn man sie berührt
- Die Wand blinkt alle 5 Sekunden in einer zufälligen Farbe
- Die Wand ist mit einem Sensor ausgestattet. Der Sensor ermittelt alle Avatare im näheren Umkreis und gibt die Namen der Avatare auf den Bildschirm aus.
- Ändert sich die Anzahl der sie umgebenden Avatare, spielt die Wand einen Sound ab
Modellierung
Image may be NSFW.
Clik here to view.
Modelliert wird in Secondlife mit sogenannten Primitives, geometrischen Grundfiguren. Dies sind primitive 3D-Objekte aus deren Kombination die gesamte 3D-Welt gebaut ist. Ein Rechtsklick in die Welt öffnet ein Control-Element mit den Optionen “Sit Here”, “Go Here”, “Edit Terrain”, “About Land” und “Create”. Wählt man “Create” aus, erscheint die Oberfläche mittels der man 3D-Objekte modellieren kann. Von hier aus kann man Objekte in Secondlife bauen und verändern. Mit dem Zauberstab-Symbol (“Create”) kann man 3D-Objekte erzeugen. Unter der Symbolleiste sieht man die Prims, 15 Stück an der Zahl. Image may be NSFW.
Clik here to view. Aus dem Screenshot ist ersichtlich, dass ich hier als Prim den Cubus gewählt habe. Wenn man nun mit der Maus in die 3D-Welt navigiert, erscheint das Zauberstab-Symbol. Ein Klick auf die linke Maustaste erzeugt an dieser Stelle in der Welt ein Prim mit einer Standardtextur. Der Modeller wechselt dadurch direkt in den “Edit-Mode”, die Radio-Box steht auf Position. In der Abbildung sehen wir ein Cubus mit der gelben Standardtextur. Nun kann man den frisch erzeugten Cubus im Raum auf der X,Y und Z-Achse mit der Maus bewegen. Dies geschieht über die dafür vorgesehenen Pfeile am Objekt. Mit den roten Pfeilen bewegt man das Objekt entlang der X-Achse, mit den grünen Pfeil entlang der Y-Achse und mit den blauen Pfeilen entlang der Z-Achse. Image may be NSFW.
Clik here to view.
Das Objekt lässt sich nun rotieren und in seinen Dimensionen verändern. Die erreicht man durch klicken auf die Radio-Buttons “Rotate” bzw. “Stretch” oder durch das Halten der Ctrl-Taste (Rotate) bzw. Ctrl+Shift-Taste (Stretch).
Image may be NSFW.
Clik here to view.
Mit ein wenig Fingerfertigkeit wird aus einem Cubus also eine Wand. Fehlt also nur noch ein wenig Transparenz und das Entfernen der Standardtextur. Befindet man sich im Edit-Modus kann man die Registerkarte “Texture” wählen, rechts von “Features” und links von “Content”.
Image may be NSFW.
Clik here to view. Mit einem Klick auf Color kann man die Grundfarbe des Prims verändern. Mit einem Klick auf Texture öffnet sich ein weiteres Fenster, in dem man die Standardtextur verändern kann. An dieser Stelle kann man eine 32×32 Pixel große Textur aus dem Inventory auf das 3D-Objekt legen. Für meine transparente “Zauberwand” habe ich mittels “Blank”-Button die Standardtextur entfernt, da ich ja eine transparente Wand haben möchte. An dieser Stelle möchte ich erwähnen das man zwischen zwei Arten von Inventories unterscheiden muss: (a) dem Inventory des Avatars und (b) dem Inventory des Prims. Darauf möchte ich allerdings später im LSL-Teil dieses Artikels noch einmal zurückkommen. Möchte man nämlich aus der Scriptsprache LSL, z.B. auf Texturen, Sounds etc. zugreifen, ist dies nur auf das Prim-Inventory möglich (!)
Image may be NSFW.
Clik here to view.
Last but not Least, kann man noch die Transparenz des Objektes zwischen 0 und 100 wählen, unter Transparency im Edit-Mode. Dies könnt ihr im nächsten Screenshot sehen, eine magentafarbene “Zauberwand”. Image may be NSFW.
Clik here to view.
Im nächsten Schritt möchte ich diesem einfachen 3D-Objekt noch etwas Magie hinzufügen. Sie soll auf Berührung reagieren, in zufälligen Farben im Abstand von 5 Sekunden blinken und die Umgebung auf neugierige Avatare scannen. Und einen Sound abspielen, sobald sich ihr ein neuer Avatar nähert. All dies geht mit LSL, der Linden Scripting Language.
LSL-Programmierung
Als Voraussetzung, um in LSL programmieren zu können sind natürlich Programmierkentnisse aus anderen Sprachen von Vorteil. Wer sich also schon einmal in einer Hochsprache wie C/C++ oder Java bewegt hat, wird es relativ einfach haben. LSL ist allerdings keine Programmiersprache im Sinne der Objektorientierung mit Polymorphismus und Vererbung etc. Man sollte also nicht zuviel von LSL erwarten. Ein gutes Wiki zum Thema LSL habe ich hier gefunden. Weitere gute LSL-Beispiele habe ich unter http://www.kan-ed.org/second-life/using-LSL.html gefunden. Im Edit-Mode unter der Registerkarte “Content” ist das Prim-Inventory erreichbar. Image may be NSFW.
Clik here to view.
An dieser Stelle ist es auch möglich, eigene LSL-Scripte zu schreiben, die an das 3D-Objekt gebunden sind. LSL ist dabei eventgesteuert. Es gibt zahlreiche Events, wie z.B. das touch_start-Event.
Nachfolgender Code wird ausgeführt, wenn der Prim mit der linken Maustaste angeklickt wird.
touch_start(integer total_number) { float red1 = llFrand(1); float green1 = llFrand(1); float blue1 = llFrand(1); vector color1 = ; llSay(0, "angefasst." + (string)total_number); llSetText("die ist ein test", color1, 1.0); llSetTimerEvent(5); }
Damit wir alle 5 Sekunden ein weiteres Stück Code ausführen können, habe ich mit der llSetTimerEvent()-Funktion den Timer gesetzt. Dieser Aufruf führt dazu, das alle 5 Sekunden die Funktion timer() aufgerufen wird.
Mein Timer berechnet alle 5 Sekunden einen neuen Farbvektor mit Zufallsfarbwerten und verändert die Farbe der Wand auf allen Seiten. Außerdem aktiviert mein Timer alle 5 Sekunden das Sensor-Objekt, welches im näheren Umkreis alle Avatare scannt. Dies geschieht über den Aufruf der Funktion llSensor().
timer() { float red = llFrand(1); float greed = llFrand(1); float blue = llFrand(1); vector color = ; llSetColor(color, ALL_SIDES); llSensor("", NULL_KEY, AGENT, 96, PI); llSay(0, "timer"); }
Findet mein Sensor Avatare in er Nähe wird der Event-Handler sensor() (bzw. die Callback-Funktion) aufgerufen.
Werden Avatare entdeckt, werden die Namen aller Avatare in einer Schleife mit der Funktion llDetectedName() ausgegeben. Wenn sich die Anzahl der Avatare zwischen zwei Senoraufrufen ändert, wird zusätzlich ein Sound abgespielt mit der Funktion llPlaySound().
sensor(integer total_number) { if(total_number!=numOfDetectedObj) { llPlaySound("Soundtrack",1); numOfDetectedObj=total_number; } integer i =0; for(i=0; i<total_number; i++) { string s = llDetectedName(i); llSay(0,"something found by sensor = " + s); } }
Die Funktion llPlaySound() erhält als ersten Parameter “Soundtrack”. Hierbei handelt es sich um einen symbolischen Namen eines Audioobjektes, welches über das Prim-Inventory erreichbar sein muss. Man kann aus dem Avatar-Inventory Objekte in das Prim-Inventory via Drag & Drop ziehen.
Das war es dieses Mal. Das Tutorial werde ich demnächst als PDF bereitstellen. Viel Spaß beim ausprobieren mit LSL.
Downloads
Image may be NSFW.
Clik here to view.
Hier das komplette LSL-Script zum downloaden.