logo

Willkommen Gast! Um alle Funktionen zu aktivieren müssen Sie sich Anmelden.Neue Registrierungen sind deaktiviert.

Mitteilung

Icon
Error

Einloggen


Optionen
Ansicht
Gehe zum aktuellsten Beitrag Gehe zum letzten Ungelesenen
Offline MartinRJ Fayray  
#1 Geschrieben : Montag, 8. September 2014 19:13:31(UTC)
MartinRJ Fayray

Rang: Ehrenmitglied

Ansehen:

Mitglied seit: 05.09.2014(UTC)
Beiträge: 84
Germany
Wohnort: Tulln und Rostock

Dankte: 1 mal(e)
Das ist eins meiner komplizierteren Skripts, es war ursprünglich dafür entwickelt worden, um Schmetterlingsflügel für jemanden zu animieren der sich mit Skripts nicht auskennt, aber trotzdem die Animation möglichst selbsttätig anpassen wollte, also war Erfindungsgeist gefragt!

In dem Skript unten gibt es zwei Listen in den ersten beiden Zeilen: lPositions und lRotations.
In diese Listen trägt man Start- und Endpunkt der Animation ein (für das erste Childprim, also Linknummer 2), und zwar in lPositions die (lokale/Child-) Position des Startpunkts und des Endpunkts. Und in lRotations die (lokale/Child-) Rotation der Start- und End-Rotation.

list lPositions = [startposition,endposition];
list lRotations = [startrotation,endrotation];

Durch ein Klick auf das Childprim startet man die Animation.

Über die Variable iNUM_INTERPOLATE kann man festlegen, wie oft 'Zwischenschritte' zwischen den Punkten eingefügt werden, und über fSlowDown kann man die Animation gegen Ende verlangsamen.

Code:

list lPositions = [<0.22871, -1.03150, 0.03792>,<0.65424, -1.73593, 0.03792>]; //start, and end-*position*
list lRotations = [<0.00000, 0.00000, -1.00000, 0.00001>, <0.00000, 0.00000, -0.84339, 0.53730>]; //start, and end-*rotation*

integer iNUM_INTERPOLATE = 6; //times of interpolation
float fSlowDown = 1.045; //slow down factor
integer iPOSITIVE_DIRECTION = TRUE; //start-direction (TRUE or FALSE)
integer iCHILD = 2; //Link number


float fTimer_Short = 0.01; //timer
integer iTimer_Frames = 1; //'speed'

vector pLin(list v, float t, integer Loop) {
    integer l = llGetListLength(v); t *= l-1;
    integer f = llFloor(t); t -= f;
    return llList2Vector(v,pIndex(f,l,Loop))*(1-t) + llList2Vector(v,pIndex(f+1,l,Loop))*t;
}
integer pIndex( integer Index, integer Length, integer Loop) {
    if(Loop) return Index % Length;
    if(Index < 0) return 0;
    if(Index > --Length) return Length;
    return Index;
}
rotation rLin(rotation x, rotation y, float t) {
    float ang = llAngleBetween(x, y);
    if(ang > PI) ang -= TWO_PI;
    return x * llAxisAngle2Rot(llRot2Axis(y/x)*x, ang*t);
}
list Interpolate(integer iTimes, list _L, integer i_bool_vector)
{
    integer iCnt = 0;
    integer iListCnt = 0;
    integer iListLength = 0;
    for (iCnt = 0; iCnt < iTimes; iCnt++)
    {
        iListLength = llGetListLength(_L);
        for (iListCnt = iListLength - 1; iListCnt >= 1; iListCnt--)
        {
            if (i_bool_vector)
            {
                _L = llListInsertList(_L, [pLin([llList2Vector(_L, iListCnt - 1), llList2Vector(_L, iListCnt)], 0.5, TRUE)], iListCnt);
            }
            else
            {
                _L = llListInsertList(_L, [rLin(llList2Rot(_L, iListCnt - 1), llList2Rot(_L, iListCnt), 0.5)], iListCnt);
            }
        }
    }
    return _L;
}
Interpolate_Animations(integer iTimes)
{
    lPositions = Interpolate(iTimes, lPositions, TRUE);
    lRotations = Interpolate(iTimes, lRotations, FALSE);
}

integer iFRAME_LAST;

integer iBOOL_MOVING = FALSE;

integer iLISTPOSITION = 0;

integer frame()
{
    return (integer)llGetEnv("frame_number");
}
default
{
    changed(integer change)
    {
        if (change & CHANGED_INVENTORY)
        { //reset script on inventory change
            llResetScript();
        }
    }
    state_entry()
    {
        //interpolate animations and store them in a list
        Interpolate_Animations(iNUM_INTERPOLATE);
        //init animation
        if (iPOSITIVE_DIRECTION)
        {
            iLISTPOSITION = 0;
        }
        else
        {
            iLISTPOSITION = llGetListLength(lPositions) - 1;
        }
        //start timer
        llSetTimerEvent(fTimer_Short);
    }
    touch_start(integer total_number)
    {
        //start or reverse animation
        if (llDetectedLinkNumber(0) == iCHILD)
        {
            if (iBOOL_MOVING)
            {
                iPOSITIVE_DIRECTION = !iPOSITIVE_DIRECTION; //swap directions            
            }
            else
            {
                iFRAME_LAST = frame();
                iBOOL_MOVING = TRUE;
            }
        }
        else
        {
            return;
        }
    }
    timer()
    {
        integer iCnt;
        float _fFrames;
        integer iCntEnd;

        //calculate animation curve
        if (iBOOL_MOVING)
        {
            _fFrames = (float)iTimer_Frames;
            if (iPOSITIVE_DIRECTION)
            {
                iCntEnd = iLISTPOSITION+1;
                if (iLISTPOSITION + 1 >= llGetListLength(lPositions) - 1)
                {
                    iCntEnd = llGetListLength(lPositions) - 1;
                }
                for (iCnt = 0; iCnt < iCntEnd; iCnt++)
                {
                    _fFrames = _fFrames * fSlowDown;
                }
            }
            else
            {
                iCntEnd = iLISTPOSITION-1;
                if (iLISTPOSITION - 1 <= 0)
                {
                    iCntEnd = 0;
                }
                for (iCnt = 0; iCnt < llGetListLength(lPositions) - 1 - iCntEnd; iCnt++)
                {
                    _fFrames = _fFrames * fSlowDown;
                }
            }
        }

        //next animation step
        if (frame() >= iFRAME_LAST + (integer)_fFrames)
        {
            if (iBOOL_MOVING)
            {
                if (iPOSITIVE_DIRECTION)
                {
                    iLISTPOSITION++;
                    if (iLISTPOSITION >= llGetListLength(lPositions) - 1)
                    {
                        iLISTPOSITION = llGetListLength(lPositions) - 1;
                        iBOOL_MOVING = FALSE; //stop motion
                        iPOSITIVE_DIRECTION = !iPOSITIVE_DIRECTION; //swap directions
                    }
                }
                else
                {
                    iLISTPOSITION--;
                    if (iLISTPOSITION <= 0)
                    {
                        iLISTPOSITION = 0;
                        iBOOL_MOVING = FALSE; //stop motion
                        iPOSITIVE_DIRECTION = !iPOSITIVE_DIRECTION; //swap directions
                    }
                }
                llSetLinkPrimitiveParamsFast(iCHILD, [PRIM_POS_LOCAL, llList2Vector(lPositions, iLISTPOSITION), PRIM_ROT_LOCAL, llList2Rot(lRotations, iLISTPOSITION)]);
                iFRAME_LAST = frame();
            }
        }
    }
}

Bearbeitet vom Moderator Freitag, 19. September 2014 09:46:50(UTC)  | Grund: Nicht angegeben

It is the mark of an educated mind to be able to entertain a thought without accepting it.

Wanna join the discussion?! Login to your forum account.Neue Registrierungen sind deaktiviert.

Rss Feed  Atom Feed
Benutzer, die gerade dieses Thema lesen
OceanSpiders 2.0
Das Forum wechseln  
Du kannst keine neue Themen in diesem Forum eröffnen.
Du kannst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge nicht löschen.
Du darfst deine Beiträge nicht editieren.
Du kannst keine Umfragen in diesem Forum erstellen.
Du kannst nicht an Umfragen teilnehmen.

Powered by YAF.NET | YAF.NET © 2003-2020, Yet Another Forum.NET
Diese Seite wurde in 0.047 Sekunden generiert.

Datenschutzrichtlinie
Haftungsausschluss
Impressum
Datenschutzerklärung
AGB, ToS
Kontakt