1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Bitte schaltet eure Ad Blocker aus. SLinfo kann nur betrieben werden, wenn es durch Werbung Einnahmen erzielt. Vielen Dank!!
    Information ausblenden
  3. 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.
    Information ausblenden

Terraforming - Minimale Grösse der Planierraupe verkleinern

Dieses Thema im Forum "Objekte & Modellieren" wurde erstellt von Auryn Nayar, 3. Juli 2015.

  1. Auryn Nayar

    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 von einem Moderator bearbeitet: 3. Juli 2015
  2. Shirley Iuga

    Shirley Iuga Forumsgott/göttin

    Beiträge:
    7.507
    Zustimmungen:
    2
    Punkte für Erfolge:
    36
    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.
     
  3. Auryn Nayar

    Auryn Nayar Guest

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

    Danke für deine Antwort, Shirley!
     
  4. Dianna Loxely

    Dianna Loxely Superstar

    Beiträge:
    1.625
    Zustimmungen:
    2
    Punkte für Erfolge:
    0
    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 senderinteger numstring strkey 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.!= 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 != lastPosllSetText(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.llRound(pos.x);
        if(
    pos.255pos.255; else if(pos.0pos.0;
        
    pos.llRound(pos.y);
        if(
    pos.255pos.255; else if(pos.0pos.0;
        
    pos.llCeil(pos.z*10);
        
    pos./= 10;
        
    llSetPos(pos);
    }

    default
    {
        
    state_entry()
        {
            
    scale = <2,2,0.1>;
            
    llSetText("",<0,1,1>,1);
            
    llSetKeyframedMotion([],[KFM_COMMANDKFM_CMD_STOP]);
            
    llSetTimerEvent(0.0);
            
    llSitTarget(<-0.2, -0.20.7>, ZERO_ROTATION);
            
    llSetCameraEyeOffset(<-10.00.02.0>);
            
    llSetCameraAtOffset(<6.00.02.0>);
            
    vector pos llGetPos();
            
    pos.llGround(<0,0,scale.z/2>);
            
    llSetLinkPrimitiveParamsFast(0,[PRIM_POSITION,pos,
                                            
    PRIM_ROTATION,ZERO_ROTATION,
                                            
    PRIM_SIZE,scale,
                                            
    PRIM_PHYSICS_SHAPE_TYPEPRIM_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_COMMANDKFM_CMD_STOP]);
                    
    llSetKeyframedMotion([],[]);
                    if (
    agent == llGetOwner())
                    {
                        
    llRequestPermissions(agent,PERMISSION_TAKE_CONTROLS|PERMISSION_TRIGGER_ANIMATION);
                    }
                }
                else
                {
                    
    llSetKeyframedMotion([],[KFM_COMMANDKFM_CMD_STOP]);
                    
    llReleaseControls();
                    if(
    llGetPermissions() & PERMISSION_TRIGGER_ANIMATIONllStopAnimation(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), TRUEFALSE);
            }
        }

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

        
    control(key idinteger levelinteger 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(
    activespeed step; else speed step/4;
                if (
    level edge CONTROL_FWD)             { llSetKeyframedMotion([<step,0,0>,speed],[KFM_DATAKFM_TRANSLATION]); }
                else if(
    level edge CONTROL_BACK)        { llSetKeyframedMotion([<-step,0,0>,speed],[KFM_DATAKFM_TRANSLATION]); }
                else if(
    level edge CONTROL_ROT_RIGHT)   { llSetKeyframedMotion([<0,-step,0>,speed],[KFM_DATAKFM_TRANSLATION]); }
                else if(
    level edge CONTROL_ROT_LEFT)    { llSetKeyframedMotion([<0,step,0>,speed],[KFM_DATAKFM_TRANSLATION]); }
                
    moving TRUE;
            }
        }
        
        
    moving_end()
        {
            
    llSetKeyframedMotion([],[KFM_COMMANDKFM_CMD_STOP]);
            
    moving FALSE;
            
    FixPosition();
        }

        
    listeninteger channelstring namekey idstring 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.399.9) return;
                
    pos.+= 0.1;
                
    llSetPos(pos);
                
    FixPosition();
                
    MainMenu(id);
            }
            else if(
    message == BTN_ZUP1)
            {
                
    vector pos llGetPos();
                if(
    pos.399) return;
                
    pos.+= 1;
                
    llSetPos(pos);
                
    FixPosition();
                
    MainMenu(id);
            }
            else if(
    message == BTN_ZDN01)
            {
                
    vector pos llGetPos();
                if(
    pos.0.1) return;
                
    pos.-= 0.1;
                
    llSetPos(pos);
                
    FixPosition();
                
    MainMenu(id);
            }
            else if(
    message == BTN_ZDN1)
            {
                
    vector pos llGetPos();
                if(
    pos.1.0) return;
                
    pos.-= 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(
    activellMessageLinked(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: 4. Juli 2015
  5. Roya Congrejo

    Roya Congrejo Moderatorin Mitarbeiter

    Beiträge:
    3.285
    Zustimmungen:
    796
    Punkte für Erfolge:
    113
    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.
     
  6. Dianna Loxely

    Dianna Loxely Superstar

    Beiträge:
    1.625
    Zustimmungen:
    2
    Punkte für Erfolge:
    0
    das meine ich.
    versäumst du das, "tanzt" dein Avatar sehr oft zwischen dem alten und dem neuen Landshape und wird unsteuerbar.
     
  7. sven Homewood

    sven Homewood R.I.P.

    Beiträge:
    1.894
    Zustimmungen:
    85
    Punkte für Erfolge:
    48
    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: 4. Juli 2015
  8. Auryn Nayar

    Auryn Nayar Guest

    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.
     
  9. Mareta Dagostino

    Mareta Dagostino Superstar

    Beiträge:
    1.315
    Zustimmungen:
    99
    Punkte für Erfolge:
    49
    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.