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

Pose in Waage wird beim ersten Sitzen nicht richtig angezeigt

I

Iman Dryke

Guest
Hallo allerseits :)
ich bin gerade dabei, eine Waage mit selbstgemachter Pose zu basteln, jedoch habe ich ein kleines Problem: beim ersten Sitzen wird die Pose nicht richtig angezeigt, die Beine sind gebeugt, und ich weiß nicht, wie ich es verhindern kann.

Wenn ich aufstehe und nochmal drauf gehe, dann wird die Pose so angezeigt, wie sie sein sollte, nur beim ersten Mal nicht (siehe Bilder).

fehler_001lazq.jpg

fehler_002zm4f.jpg


Weiß jemand, wieso das passiert, und wie man es eventuell verhindern kann?

Das ist das Skript in der Waage:
Code:
default
{
    state_entry() {
        llSitTarget(<-1.11184, -0.21906, -0.43125>, <-0.45923, -0.53769, 0.53769, 0.45923>);
    }
        
    changed(integer change) {
        if (llAvatarOnSitTarget() != NULL_KEY)
            llRequestPermissions(llAvatarOnSitTarget(), PERMISSION_TRIGGER_ANIMATION);       
    }
    
    run_time_permissions(integer perm) {
        string anim = llGetInventoryName(INVENTORY_ANIMATION, 0);
        if (anim != "") {
            llStopAnimation("sit");
            llStartAnimation(anim);
        }
    }
}
Außerdem habe ich die Pose mit einem "Schreck-Gesicht" gemacht, das allerdings nur wenige Sekunden anhält. Ist es möglich, die Mimik im Gesicht dauerhaft einzustellen? Ich vermute eher nicht, aber fragen kostet ja nichts :mrgreen:

Vielen lieben Dank schonmal für Eure Hilfe!

LG,
Iman
 
Beine mitanimiert? AO aus? Loop gesetzt und wie?

Müste möglich sein das Gesicht auch dauerhaft zu animieren. Das köntest du vieleicht auch direkt ins Script einbauen. Ich habe im Inventar so einen Face-Emoter der hat Scripte drin, wenn man da drauf klickt sieht man mehr oder wenig dämlich aus ;) aber vieleicht kann dir da jemand weiter helfen der sich besser mit Scripten auskennt.
 
Hi Sumy,
das ist keine Animation, sondern nur eine Pose. Bei der Erstellung der Pose haben die Beine die Position bekommen, die sie im unteren Bild haben (hatte an den Reglern nur wenig bewegt, ist aber ganz sicher keine Animation).

Beim Hochladen hat sie höchste Prio bekommen, Loop ist eingestellt gewesen (in: 0, out: 100%, so wie es standardmäßig eingestellt ist) und die Mimik im Gesicht auch. Hmmm...

Ah, AO ist natürlich aus gewesen, an mir ist nichts, das mit dem Skript in der Waage kollidieren könnte :)

Die Idee, das Gesicht direkt im Skript mit zu animieren, ist echt gut, danke Dir!
 
Die Beine machen sich wirklich selbstständig *heul*. Ich musste aus- und einloggen, und als ich mich wieder auf die Waage setzte, passierte dies (die Beine sind nun nach vorn gestreckt).

fehler_003nba8.jpg


Komischerweise nur beim ersten Draufsitzen, danach kann ich sooft auf die Waage gehen, die Pose wird dann richtig angezeigt.
 
Vieleicht mal ein Versuch wert:
Mach doch eine kleine Animation daraus, so 10 Frames, und dann den Loop bei 50%-50%
 
Ich würde es erstmal gern versuchen, ohne eine Animation daraus machen zu müssen, wenn der Fehler so überhaupt zu beheben wäre :)

Nun ja, ich habe jetzt das Skript so abgeändert, dass das Gesicht dauerhaft animiert ist. Jedoch sooooo dauerhaft, dass der Mund sogar nach dem Aufstehen geöffnet bleibt. Weiß jemand welchen Befehl ich einfügen müsste, damit die Gesichtsanimation aufhört, sobald ich von der Waage runter gehe?

Code:
string emote = "express_surprise_emote";
float emoteLoop = 0.1;

default
{
    state_entry() {
        llSitTarget(<-1.11184, -0.21906, -0.43125>, <-0.45923, -0.53769, 0.53769, 0.45923>);
    }
        
    changed(integer change) {
        if (llAvatarOnSitTarget() != NULL_KEY)
            llRequestPermissions(llAvatarOnSitTarget(), PERMISSION_TRIGGER_ANIMATION);       
    }
    

    run_time_permissions(integer perm) {
        string anim = llGetInventoryName(INVENTORY_ANIMATION, 0);
        if (anim != "") {
            llStopAnimation("sit");
            llStartAnimation(anim);
            llStartAnimation (emote);
            llSetTimerEvent (0.1);
                  }
    }
   timer ()

{
integer perm = llGetPermissions ();
if ( perm & PERMISSION_TRIGGER_ANIMATION )
{
llStartAnimation (emote);
}
} 
}
 
langsam befürchte ich, dass der Thread im falschen Unterforum ist :oops:
 
*Selbstgespräche führe* :mrgreen:

Ok, das Problem mit der Mimik ist gelöst, ich habe den Timer beim Aufstehen gestoppt:

Code:
string emote = "express_surprise_emote";
float emoteLoop = 0.1;
string anim = "aaaaargh";

default
{
    state_entry() {
        llSitTarget(<-1.11184, -0.21906, -0.43125>, <-0.45923, -0.53769, 0.53769, 0.45923>);
    }
        
    changed(integer change)
    {
        if (change & CHANGED_LINK)
        {
           
            if (llAvatarOnSitTarget() != NULL_KEY)
            {
               llRequestPermissions(llAvatarOnSitTarget(), PERMISSION_TRIGGER_ANIMATION);
               llSetTimerEvent(0.1); //startet den Timerevent
            }
            else
            {
                integer perm=llGetPermissions();
                if ((perm & PERMISSION_TRIGGER_ANIMATION) >0)       
                llStopAnimation(emote);
                llStopAnimation(anim);
                anim="aaaaargh";
                llSetTimerEvent(0.0); 
            }
        }
    }
    
    run_time_permissions(integer perm) {
        string anim = llGetInventoryName(INVENTORY_ANIMATION, 0);
        if (anim != "") {
            llStopAnimation("sit");
            llStartAnimation(anim);
            llStartAnimation (emote);
            llSetTimerEvent (0.1);
                  }
    }
   timer ()

{
integer perm = llGetPermissions ();
if ( perm & PERMISSION_TRIGGER_ANIMATION )
{
llStartAnimation (emote);
}
} 
}
Das Ursprungsproblem der Waage (Pose wird beim ersten Draufsitzen nicht richtig angezeigt) besteht immer noch.... aber ich arbeite daran.

Dennoch wäre ich für weitere Ideen sehr dankbar! :p

LG,
Iman
 
Danke Dir, Sumy! Die Skripter sind heute wahrscheinlich beim SLCM oder in der Sonne, richtig so! *lach*

Jedenfalls behalte ich Deine Idee im Hinterkopf, eine Animation daraus zu basteln, sollte mein Problem kein Skriptingproblem sein, noch bin ich mir nicht ganz sicher :)
 
ich würde dir ja gerne weiter helfen aber ich hab noch keinen Lösungsansatz, das hat glaube ich weniger mit dem Script zu tun als mit der Animation selber. Und was Animationen angeht bin ich eine totale Niete. Hab schon das Programm zum erstellen wieder von meinem Rechner geschmissen ^^.
 
Versuch mal die beiden Befehle

Code:
   llStopAnimation("sit");
   llStartAnimation(anim);

zu vertauschen, auch wenn es wahrscheinlich gar nichts bringt! *g*

Aber ich hatte vor ein paar Monaten mal das Problem, dass die "sit" Animation nicht gestopt wurde, wenn parallel keine andere gelaufen ist. Hab ich die gewuenschte Animation dagegen erst gestartet, dann lief es wunderbar .. wobei gerade nicht mehr weiss, ob ich damals noch ein llSleep zwischen Start und Stop gesetzt hatte .. im Zweifel auch einfach mal ausprobieren. :)
 
@Mini: komischerweise hat das Vertauschen doch etwas gebracht, zwar scheint meine eigene Pose nach dem Zufallsprinzip beim ersten Draufsitzen richtig angezeigt zu werden oder nicht (meistens aber doch richtig), aber wenn sie es nicht tut, dann ist der Fehler an den Beinen kaum bemerkbar (eigentlich erkenne ich ihn ja nur, die fehlerhafte Pose ist aber wenigstens nicht bescheuert und unrealistisch, wie auf den Fotos da oben) *freu*. Vielen lieben Dank für Deine Hilfe!

@Doktor: trotzdem vielen Dank! :)

Nun zum schwierigsten Teil überhaupt: gehe ich richtig in der Annahme, dass ich einen Prim nicht dazu bringen kann, zuerst eine Textur als "Standardtextur" zu nehmen, dann wenn sich jemand draufsetzt eine animierte Textur zu nehmen, und nach einer Weile eine dritte Textur anzuzeigen?

Meine Idee ist es, die Waage mit einer Textur 00.00kg anzeigen zu lassen. Wenn ich drauf gehe, dann wird eine zweite Textur animiert (die Texturanimation funktioniert bereits, aber eben nur sie):

3x3-abloadauot.jpg


So sieht das aus (na ja, die Texturani sieht man nicht :mrgreen:):

waage_abloaddwt4.jpg


Und nach einige Sekunden Texturanimation, sollte die Anzeige bei dieser dritten Textur dauerhaft bleiben,

zu_viel_abload2ux5.jpg


bis man aus der Waage runtergeht (da soll die Textur 00.00 wieder angezeigt werden). Aber ich glaube, dass der Prim, sobald eine Textur animiert wird, nur diese animierte Textur anzeigt. Ist das richtig?

Uff, wieso fange ich Dinge an, wovon ich keine Ahnung hab? :mrgreen:

LG,
Iman
 
So jetzt wo das mit der Animation geklärt ist und wir beim Display sind kann ich doch mal was sinnvolles schreiben.

Mir kommen da mehrere Möglichkeiten in den Sinn.

Ich denke am einfachsten ist es wenn du nicht 1 Display verwendest sondern 3 übereinander.

Das mit der animierten Textur kommt nach unten. Darüber baust du das mit der 0.00 und mit dem "zu viel "

Grundeinstellung ist die 0.00 , die würde ich nach oben legen. Das mittlere Prim mit dem "zu viel" auf Transparent schalten. Das untere kann vor sich hin animieren man sieht es eh nicht.

Bei Sit wechselt zunächst das obere Prim in Transparent ( das kann man schön mit llsetPrimitiveparams lösen)
Da jetzt beide Transparent sind kommt die Animation zum vorschein.

Nach einer Weile nimmst du die Transparenz aus dem Mittleren raus und beim runter gehen wieder Nullstellung.

Ich denke so ist es einfacher, als wenn du ein Prim benutzt .
 
Dein Hauptscript würde ich mal erweitern,damit es mit dem Prim in der Anzeige kommuniziert:

Code:
string emote = "express_surprise_emote";
float emoteLoop = 0.1;

default {
    state_entry() {
        llSitTarget(<-1.11184, -0.21906, -0.43125>, <-0.45923, -0.53769, 0.53769, 0.45923>);
    }
    changed(integer change) {
        if (llAvatarOnSitTarget() != NULL_KEY) {
            llRequestPermissions(llAvatarOnSitTarget(), PERMISSION_TRIGGER_ANIMATION);
        } else {
            llMessageLinked(LINK_SET, 4711, "STOP", NULL_KEY);
        }
    }
    run_time_permissions(integer perm) {
        string anim = llGetInventoryName(INVENTORY_ANIMATION, 0);
        if (anim != "") {
            llStopAnimation("sit");
            llStartAnimation(anim);
            llStartAnimation (emote);
            llSetTimerEvent (0.1);
        }
        llMessageLinked(LINK_SET, 4711, "START", NULL_KEY);
    }
    timer () {
        integer perm = llGetPermissions ();
        if ( perm & PERMISSION_TRIGGER_ANIMATION ) {
            llStartAnimation (emote);
        }
    }
}
in die Anzeige sollte dann so was in der Art rein:
Code:
integer seite   = 3;
integer x       = 3;
integer y       = 3;
float rate      = 3.0;

start() {
    llScaleTexture(1, 1, ALL_SIDES);
    llOffsetTexture(0, 0, ALL_SIDES);
    llSetTextureAnim(ANIM_ON | LOOP, seite, x, y, 0, 0 , rate);
    llSetTexture("3x3", ALL_SIDES);
    llSetTimerEvent(3.2);
}
stop() {
    llSetTimerEvent(0);
    llSetTexture("null", ALL_SIDES);
    llSetTextureAnim(FALSE, ALL_SIDES, 0, 0, 0.0, 0.0, 1.0);
}

default {
    link_message(integer sender_num, integer num, string str, key id) {
        if (num == 4711) {
            if(str == "START") {
                start();
            } else if(str == "STOP") {
                stop();
            }
        }
    }
    timer() {
        llSetTimerEvent(0);
        llSetTexture("toomuch", ALL_SIDES);
        llSetTextureAnim(FALSE, ALL_SIDES, 0, 0, 0.0, 0.0, 1.0);
    }
}
Die Namen mußt du natürlich anpassen für die Texturen und sie mit in den Anzeigeprim tun, ebenso die Variable "seite" damit die Textur auch dort hinkommt wo sie hin soll ;)
 
Das hat mit dem Script ziemlich sicher nix zu tun sondern mit der Animation.

Der erste Frame einer SL-Animation ist nämlich nur Referenz. Er gehört nicht zur Animation dazu, sondern zeigt nur an, welche Glieder insgesamt bewegt werden sollen. Wenn der ganze Körper verändert weren soll (bei dir der Fall), dann müssen zwischen erstem und zweitem Frame ALLE Gelenke um mindestens eine Stelle bewegt werden. Alle die du nicht veränderst, bekommen die Standard-Sitzanimation verpaßt. Das ist bei den Beinen anschienend der Fall. Man kann auch einzelne Gelenke aussparen, zB. den Kopf und den Rumpf. Dann atmet die Figur, und der Blick folgt dem Mauszeiger.
 
Ich moechte nur anmerken, dass die letzte Textur fies ist!!!

Man stelle sich das nur mal vor .. morgens .. noch leicht schlaftrunken ... und dann die Waage ... :traurig

Kein schoener Start in den Tag!
 
*lach* Mini, Du hast ja Recht, ich glaube, ich sollte lieber sowas machen:

zuviel_reingelegt_kleiqtyx.gif


@Monalisa: genau das ist es, glaube ich!! ich glaube, die einzigen Gelenke, die ich nicht bewegt hatte, waren die Knie, das lässt sich leicht beheben, danke Dir!! :)

@Doktor: Danke für die Idee, die unterschiedlichen Texturen auf unterschiedliche Prims zu benutzen, zwar habe ich noch nie soetwas geskriptet, aber ich denke, das könnte ich hinbekommen *gg*. Auf alle Fälle eine sehr schöne Idee, die ich gern aufgreife.

@Bo: auch Dir vielen Dank für Deine Vorschläge, sie sind mir von großer Hilfe :)

Liebe Grüße,
Iman
 
@Monalisa: super, super, super!!! Das war es, ich habe nun ALLE Gelenke geringfügig bewegt, und jetzt ist die Pose immer gut! Ich danke Dir vielmals :D

pose_perfekt_001noqh.jpg


Nun weiter skripten :mrgreen:
 
Im Mainscript oben ist aber noch ein Fehler, der Timer wird nicht gestoppt.

Ob nötig oder nicht, ich habe das Poseballscript aus der Wiki mal als Grundlage genommen:

Code:
string  emote       = "express_surprise_emote";
float   emoteLoop   = 0.1;
string  anim;
key     avatar;
key     trigger;

default {
    state_entry() {
        anim = llGetInventoryName(INVENTORY_ANIMATION, 0);
        if(anim == "") anim = "stand";
        llSitTarget(<-1.11184, -0.21906, -0.43125>, <-0.45923, -0.53769, 0.53769, 0.45923>);
    }
    changed(integer change) {
        if(change & CHANGED_LINK) {
            avatar = llAvatarOnSitTarget();
            if(llKey2Name(avatar)) {
                if(trigger != avatar) 
                    llRequestPermissions(avatar, PERMISSION_TRIGGER_ANIMATION);
            }
            else if(trigger) {
                llSetTimerEvent (0);
                if(trigger == llGetPermissionsKey()) {
                    if(llGetPermissions() & PERMISSION_TRIGGER_ANIMATION) {
                        if(llKey2Name(trigger)) {
                            llStopAnimation(anim);
                            llStopAnimation(emote);
                        }
                    }
                }
                llMessageLinked(LINK_SET, 4711, "STOP", NULL_KEY);
                trigger = "";
            }
        }
    }
    run_time_permissions(integer perm) {
        avatar = llAvatarOnSitTarget();
        if(perm & PERMISSION_TRIGGER_ANIMATION && llKey2Name(avatar) != "" && avatar == llGetPermissionsKey()) {
            trigger = avatar;
            llStopAnimation("sit");
            llStartAnimation(anim);
            llStartAnimation (emote);
            llMessageLinked(LINK_SET, 4711, "START", NULL_KEY);
            llSetTimerEvent (0.2);
        }
    }
    timer () {
        integer perm = llGetPermissions ();
        if ( perm & PERMISSION_TRIGGER_ANIMATION ) {
            llStartAnimation (emote);
        }
    }
}
 

Users who are viewing this thread

Zurück
Oben Unten