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

Terraforming - Minimale Grösse der Planierraupe verkleinern

A

Auryn Nayar

Guest
Beim Bauen mit dem Landtool ist mir die minimal einstellbare Grösse der Planierraupe noch zu gross. Um feinere Formen und Uebergänge zu machen, möchte ich sie verkleinern. Kann man das irgendwie machen?

Ich benutze den Firestorm Viewer.
 
Zuletzt bearbeitet von einem Moderator:
Beim Bauen mit dem Landtool ist mir die minimal einstellbare Grösse der Planierraupe noch zu gross. Um feinere Formen und Uebergänge zu machen, möchte ich sie verkleinern. Kann man das irgendwie machen?

Ich benutze den Firestorm Viewer.

Leider verwendet der Firestorm da auch nur den Code des LL-Viewers.
Wenn du das Land feiner bearbeiten willst, dann geht das wohl nur über Scrits, d.h. über Funktionen wie http://wiki.secondlife.com/wiki/LlModifyLand. Kleiner als ein 2x2m "Pinsel" geht aber auch damit nicht.
 
Leider verwendet der Firestorm da auch nur den Code des LL-Viewers.
Wenn du das Land feiner bearbeiten willst, dann geht das wohl nur über Scrits, d.h. über Funktionen wie http://wiki.secondlife.com/wiki/LlModifyLand. Kleiner als ein 2x2m "Pinsel" geht aber auch damit nicht.

Mist! Aber das habe ich mir schon fast gedacht, weil ich im Marketplace keine feineren Tools gefunden habe.

Danke für deine Antwort, Shirley!
 
Ich hab da möglicherweise etwas für dich in meinen selbsterstellten Tools.
Das Ganze funktioniert ein wenig wie eine Planierraupe, auf der du sitzt.
keine Sorge wegen irgendwelcher Bebauung, das Ding fährt im Phantommodus durch alles durch.

1) erstelle einen Würfel und lege folgende 3 Skripte rein:

TF-Brush
PHP:
integer brushsize   = 0;
integer brushtool   = 0;
vector  pos;

default
{
    state_entry()
    {
        llSetTimerEvent(0);
        llSetColor(<0.5,0.5,0.5>,ALL_SIDES);
        pos = llGetPos();
    }

    link_message(integer sender, integer num, string str, key id)
    {
        if(str == "start")
        {
            pos = llGetPos();
            llSetTimerEvent(0.2);
            llSetColor(<1.0,0.0,0.0>,ALL_SIDES);
        }
        else if(str == "stop")
        {
            pos = llGetPos();
            llSetTimerEvent(0);
            llSetColor(<0.5,0.5,0.5>,ALL_SIDES);
        }
        else if(str == "brushsize")
        {
            brushsize = num;
        }
        else if(str == "brushtool")
        {
            brushtool = num;
        }
    }

    timer()
    {
        vector p = llGetPos();
        if(p.z != pos.z)
        {
            llSetTimerEvent(0);
            llSetColor(<0.5,0.5,0.5>,ALL_SIDES);
        }
        else
        { 
            integer n = 20;
            while(n--) llModifyLand(brushtool,brushsize);
        }
    }
}

TF-Position
PHP:
vector lastPos;

string Float2String(float f) { return llGetSubString((string)f,0,-6); }
string Vector2String(vector v) { return Float2String(v.x)+", "+Float2String(v.y)+", "+Float2String(v.z); }

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

    state_entry()
    {
        lastPos = llGetRootPosition();
        llSetText(Vector2String(lastPos),<0,1,1>,1);
        llSetTimerEvent(0.3);
    }

    timer()
    {
        vector pos = llGetRootPosition();
        if(pos != lastPos) llSetText(Vector2String(pos),<0,1,1>,1);
    }
}

TF_Menu
PHP:
string  BTN_UP      = "▲";
string  BTN_ZUP1    = "z +1.0";
string  BTN_ZUP01   = "z +0.1";
string  BTN_ZDN1    = "z -1.0";
string  BTN_ZDN01   = "z -0.1";
list    STATES      = ["[[ON]]","[OFF]"];
list    BRUSHSIZES  = ["2x2","4x4","8x8"];
integer brushSize   = 0;
list    BRUSHTOOLS  = ["Level","Raise","Lower","Smooth","Noise","Revert"];
integer brushTool   = 0;
list    STEPSIZES   = ["1","2","4","8","16","32","64"];
integer stepSize    = 0;

integer active;
integer moving;
vector  scale;
integer menu_handler;
integer menu_channel;

string Float2String(float f) { return llGetSubString((string)f,0,-6); }
string Vector2String(vector v) { return Float2String(v.x)+","+Float2String(v.y)+","+Float2String(v.z); }

Menu(key user,string title,list buttons)
{
    menu_channel = (integer)(llFrand(99999.0) * -1);
    menu_handler = llListen(menu_channel,"","","");
    title += "\nBrush Tool: "+llList2String(BRUSHTOOLS,brushTool);
    title += "\nBrush Size: "+llList2String(BRUSHSIZES,brushSize);
    title += "\nStep Size: "+llList2String(STEPSIZES,stepSize);
    llDialog(user,title,buttons,menu_channel);
}

MainMenu(key user)
{
    Menu(user,"MainMenu",["Brush Size","Brush Tool","Step Size",BTN_ZUP01,llList2String(STATES,active),BTN_ZDN01,BTN_ZUP1,"Reset",BTN_ZDN1]);
}

FixPosition()
{
    vector pos = llGetPos();
    pos.x = llRound(pos.x);
    if(pos.x > 255) pos.x = 255; else if(pos.x < 0) pos.x = 0;
    pos.y = llRound(pos.y);
    if(pos.y > 255) pos.y = 255; else if(pos.y < 0) pos.y = 0;
    pos.z = llCeil(pos.z*10);
    pos.z /= 10;
    llSetPos(pos);
}

default
{
    state_entry()
    {
        scale = <2,2,0.1>;
        llSetText("",<0,1,1>,1);
        llSetKeyframedMotion([],[KFM_COMMAND, KFM_CMD_STOP]);
        llSetTimerEvent(0.0);
        llSitTarget(<-0.2, -0.2, 0.7>, ZERO_ROTATION);
        llSetCameraEyeOffset(<-10.0, 0.0, 2.0>);
        llSetCameraAtOffset(<6.0, 0.0, 2.0>);
        vector pos = llGetPos();
        pos.z = llGround(<0,0,scale.z/2>);
        llSetLinkPrimitiveParamsFast(0,[PRIM_POSITION,pos,
                                        PRIM_ROTATION,ZERO_ROTATION,
                                        PRIM_SIZE,scale,
                                        PRIM_PHYSICS_SHAPE_TYPE, PRIM_PHYSICS_SHAPE_CONVEX,
                                        PRIM_PHANTOM,TRUE]);
        FixPosition();
        moving = FALSE;
        active = FALSE;
        llMessageLinked(LINK_THIS,0,"stop","");
    }
    
    changed(integer change)
    {
        if (change & CHANGED_LINK)
        {
            llSetKeyframedMotion([],[]);
            key agent = llAvatarOnSitTarget();
            if (agent)
            {
                llSetKeyframedMotion([],[KFM_COMMAND, KFM_CMD_STOP]);
                llSetKeyframedMotion([],[]);
                if (agent == llGetOwner())
                {
                    llRequestPermissions(agent,PERMISSION_TAKE_CONTROLS|PERMISSION_TRIGGER_ANIMATION);
                }
            }
            else
            {
                llSetKeyframedMotion([],[KFM_COMMAND, KFM_CMD_STOP]);
                llReleaseControls();
                if(llGetPermissions() & PERMISSION_TRIGGER_ANIMATION) llStopAnimation(animation);
                llResetScript();
            }
        }
        
    }
    
    run_time_permissions(integer perm)
    {
        if(perm & PERMISSION_TRIGGER_ANIMATION)
        {
            llStopAnimation("sit");
            llStartAnimation(llGetInventoryName(INVENTORY_ANIMATION,0));
        }
        if(perm & PERMISSION_TAKE_CONTROLS)
        {
            llTakeControls((CONTROL_FWD|CONTROL_BACK|CONTROL_ROT_RIGHT|CONTROL_ROT_LEFT), TRUE, FALSE);
        }
    }

    touch_start(integer num_detected)
    {
        key toucher = llDetectedKey(0);
        if(toucher != llGetOwner()) return;
        if(moving) return;
        MainMenu(toucher);
    }

    control(key id, integer level, integer edge)
    {
        if(level & (CONTROL_FWD|CONTROL_BACK|CONTROL_ROT_RIGHT|CONTROL_ROT_LEFT))
        {
            if(moving) return;
            vector pos = llGetPos();
            float step = (float)llList2String(STEPSIZES,stepSize);
            float speed = step;
            if(active) speed = step; else speed = step/4;
            if (level & edge & CONTROL_FWD)             { llSetKeyframedMotion([<step,0,0>,speed],[KFM_DATA, KFM_TRANSLATION]); }
            else if(level & edge & CONTROL_BACK)        { llSetKeyframedMotion([<-step,0,0>,speed],[KFM_DATA, KFM_TRANSLATION]); }
            else if(level & edge & CONTROL_ROT_RIGHT)   { llSetKeyframedMotion([<0,-step,0>,speed],[KFM_DATA, KFM_TRANSLATION]); }
            else if(level & edge & CONTROL_ROT_LEFT)    { llSetKeyframedMotion([<0,step,0>,speed],[KFM_DATA, KFM_TRANSLATION]); }
            moving = TRUE;
        }
    }
    
    moving_end()
    {
        llSetKeyframedMotion([],[KFM_COMMAND, KFM_CMD_STOP]);
        moving = FALSE;
        FixPosition();
    }

    listen( integer channel, string name, key id, string message )
    {
        llListenRemove(menu_handler);
        if(message == BTN_UP)
        {
            MainMenu(id);
        }
        else if(message == "reset")
        {
            llResetOtherScript("TF_brush");
            llResetScript();
        }
        else if(message == BTN_ZUP01)
        {
            vector pos = llGetPos();
            if(pos.z > 399.9) return;
            pos.z += 0.1;
            llSetPos(pos);
            FixPosition();
            MainMenu(id);
        }
        else if(message == BTN_ZUP1)
        {
            vector pos = llGetPos();
            if(pos.z > 399) return;
            pos.z += 1;
            llSetPos(pos);
            FixPosition();
            MainMenu(id);
        }
        else if(message == BTN_ZDN01)
        {
            vector pos = llGetPos();
            if(pos.z < 0.1) return;
            pos.z -= 0.1;
            llSetPos(pos);
            FixPosition();
            MainMenu(id);
        }
        else if(message == BTN_ZDN1)
        {
            vector pos = llGetPos();
            if(pos.z < 1.0) return;
            pos.z -= 1;
            llSetPos(pos);
            FixPosition();
            MainMenu(id);
        }
        else if(message == "Brush Size")
        {
            Menu(id,"BrushSize",BRUSHSIZES+[BTN_UP]);
        }
        else if(~llListFindList(BRUSHSIZES,[message]))
        {
            brushSize = llListFindList(BRUSHSIZES,[message]);
            if      (brushSize == 0)    llSetLinkPrimitiveParamsFast(LINK_ROOT,[PRIM_SIZE,<2,2,scale.z>]);
            else if (brushSize == 1)    llSetLinkPrimitiveParamsFast(LINK_ROOT,[PRIM_SIZE,<4,4,scale.z>]);
            else if (brushSize == 2)    llSetLinkPrimitiveParamsFast(LINK_ROOT,[PRIM_SIZE,<8,8,scale.z>]);
            llMessageLinked(LINK_THIS,brushSize,"brushsize","");
            Menu(id,"BrushSize",BRUSHSIZES+[BTN_UP]);
        }
        else if(message == "Brush Tool")
        {
            Menu(id,"Brush Tool",BRUSHTOOLS+[BTN_UP]);
        }
        else if(~llListFindList(BRUSHTOOLS,[message]))
        {
            brushTool = llListFindList(BRUSHTOOLS,[message]);
            llMessageLinked(LINK_THIS,brushTool,"brushtool","");
            Menu(id,"Brush Tool",BRUSHTOOLS+[BTN_UP]);
        }
        else if(message == "Step Size")
        {
            Menu(id,"Step Size",STEPSIZES+[BTN_UP]);
        }
        else if(~llListFindList(STEPSIZES,[message]))
        {
            stepSize = llListFindList(STEPSIZES,[message]);
            Menu(id,"Step Size",STEPSIZES+[BTN_UP]);
        }
        else if(~llListFindList(STATES,[message]))
        {
            active = llListFindList(STATES,[message]);
            active = !active;
            if(active) llMessageLinked(LINK_THIS,0,"start",""); else llMessageLinked(LINK_THIS,0,"stop","");
        }
    }
}

für eine hübschere Animation ggf. noch eine Stand- oder SDitzanimation rein.

2: Draufsetzen

3: gewünschte Höhe einstellen übers Menü (draufklicken), ggf vorher manuell etwas ausgraben, da man Objekte per Skript nicht unterhalb des Bodens bewegen kann.

4: Pinselgrösse und Schrittgrösse Einstellen

5: Anschalten

6: Bewegen mit den Pfeiltasten

Damit Ebenest du erst einmal dein Land, die kleinste Pinselgröße ist Systembedingt wie schon gesagt 2x2 Meter
Schrägen unn Kurven erst einmal als "Treppen" terraformen.

Dannach über die Viewerlandtools Glätten mit mittlerer Pinselgrösse und -stärke.
Damit musst du ein wenig herumspielen, und nicht zu schnell.
Der gesamte Regionshape muss ständig upgdatet werden, daher auch öfters mal "Rebake Region" ausführen

---

Lizenz: Attribution-NonCommercial-ShareAlike 4.0 International
 
Zuletzt bearbeitet:
... Der gesamte Regionshape muss ständig upgdatet werden, daher auch öfters mal "Rebake Region" ausführen
Meinst Du 'Bake Terrain' (Singularity Bezeichnung) ?

Das macht man eigentlich nur, wenn das Terrain simweit in einem finalen Zustand ist - damit man den mit der 'Revert'-Funktion dann jederzeit wieder herstellen kann. Während des Terraforming muss das normalerweise nicht ausgeführt werden.
 
das meine ich.
versäumst du das, "tanzt" dein Avatar sehr oft zwischen dem alten und dem neuen Landshape und wird unsteuerbar.
 
Kann nicht sein. Das "Tanzen", wie du es nennst, kommt ggf. durch die noch nicht angepasste Physics. Beide Begriffe meinen was anderes! "Bake Terrain" wird nur genommen, wenn man die Limits unter "Terrain Raise Limit" und "Lower Limits" neu festlegen will und ist im Estate Menu. "Bake Region" backt die Physics neu. Dieses findet man im Baumenu, unter "Pathfinding". Muss man aber gar nicht mehr nutzen, die Sim macht das alleine, wenn die Änderungen zu gross werden. Zumindest hab ich letztens meine kleine Parzelle neu terraformed, und da ging das so. Begriffe aus dem SL viewer, wie andere das Benennen, keine Ahnung.
 
Zuletzt bearbeitet:
Danke für die Scripts, Dianna! Leider lösen sie mein Problem auch nicht, weil ich eben eine kleinere Pinselgrösse als 2x2 Meter haben möchte und das scheint in SL nicht möglich zu sein.
 
Wenn man inworld mit dem Pinselwerkzeug arbeitet, hat das in der kleinsten Stufe neun Verschiebepunkte (3x3), und der mittlere wird deutlich stärker abgesenkt oder angehoben als die äußeren. Um genau einen bestimmten Punkt zu bewegen, konnte ich bisher durch geschicktes Wechseln zwischen der gewünschten Position und den mitbewegten Nachbarpositionen (Gegenrichtung) mit etwas Geduld den gewünschten Effekt erzielen. Die Einheit des Geländerasters ist allerdings 1m, feiner geht technisch eh nicht. Außerdem bekommt der Avatar in sehr unruhig gestaltetem Terrain Probleme beim Laufen, steht gerne in der Luft rum usw.
 

Users who are viewing this thread

Zurück
Oben Unten