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

Fahrradreifen sollen rotieren... bitte um Hilfe

Tachchen...
Ich bin gerade dabei ein Fahrrad zu bauen und ich will, dass sich die Räder bei bestimmten Animationen drehen. Das Fahrrad ist ein Attachment und die Räder sollen mit llTargetOmega rotieren. Wenn die bestimmte Animation aufhört, soll auch das Rotieren aufhören.

Ich habe schon versucht mir das Script aus verschieden Scripts zusammenzuhämmern, doch leider noch ohne Erfolg... hier ist das Script... ich würde sehr dankbar sein, wenn es einer richtig schreibt. Danke im Voraus.


key owner;
string ani;

default
{
state_entry()
{

llSetTimerEvent(0.4);
}

timer()
{
ani = llGetAnimation(llGetOwner());

if (ani == "Walking")
{
llTargetOmega(<0,0,9>,PI/4,1.0);
if (ani == "Turning Right")
{
llTargetOmega(<0,0,9>,PI/4,1.0);
if (ani == "Turning Left")
{
llTargetOmega(<0,0,9>,PI/4,1.0);
}
}
 

Danziel Lane

Superstar
Im anderen Forum hab ich dir grad geraten, die Klammersetzung im Skript zu korrigieren und einen guten Ausgang (Ani Ende) zu finden.

Da hab ich dir vorgeschlagen auszuprobieren, ob das hier deinen Wünschen näher kommt:

Code:
default
{
    state_entry() 
    {
        llSetTimerEvent(0.4);
    }

    timer() 
    {
        string ani = llGetAnimation(llGetOwner());

        if (ani == "Walking")
        {
            llTargetOmega(<0,0,9>,PI/4,1.0);
        }
        else if (ani == "Turning Right")
        {
            llTargetOmega(<0,0,6>,PI/4,1.0);
        }
        else if (ani == "Turning Left")
        {
            llTargetOmega(<0,0,6>,PI/4,1.0);
        }
        else
        {
            llTargetOmega(ZERO_VECTOR, 0, 0);
        }
    }
}
 

Noctua Janus

Superstar
So als Anregung, es würde doch sicher reichen, wenn du nicht das Rad, sondern nur seine Textur rotieren läßt ?
Sollte "kostengünstiger" sein, also weniger Lag erzeugen und läßt sich mit llSetTextureAnim auch gut steuern.
 

Danziel Lane

Superstar
Wo ist da ein Unterschied im Lag, Noctua?

Beide, sowohl llSetTextureAnim wie auch llTargetOmega werden ja in SL nur gestartet und laufen dann auf dem Client.

Nur wenn das rotierende Teil physikalisch ist, wird die Rotation mit llTargetOmega auf dem Server berechnet.

Und die Textur-Animation läuft ja nur auf allen oder auf einer Oberfläche ... was macht man da mit den Schmalseiten der Räder?
 

Noctua Janus

Superstar
Bilder sind 2D und Objekte 3D, von daher vermute ich mal, daß es kostengünstiger ist, eine Textur zu rotieren, da sie per definition nur in zwei Raumrichtungen berechnet werden muß/kann.
Lag bezieht sich schließlich nicht nur auf den Server...

Ob das Objekt physikalisch ist wurde nicht erwähnt, könnte also auch noch zutreffen.

Und obs ausreicht fürs Rad habe ich ja in den Raum gestellt - bei passend gewählter Texture, also einer die alle Teile des Objektes umschließt deckt mein Vorschlag sogar auch die Schmalseite ab.

im übrigen schrieb ich extra "sollte", ich habe keine belegbare Stelle die aussagt, daß die eine Funktion "billiger" ist - nur eben die oben genannte Vermutung ;)
 

Danziel Lane

Superstar
Das hat mich jetzt interessiert und ich hab es ausprobiert. Ein Objekt mit llTargetOmega und eines mit llSetTextureAnim. Beide waren ein flacher Zylinder und die Rotation etwa eine Umdrehung pro Sekunde.

In der Skript-Liste stehen beide Skripts mit 1 Millisekunde (kleinere Anzeige geht nicht), machmal reißt das eine Skript nach 2 aus, manchmal das andere.

OK, das ist die Server-Seite, der eigentliche Lag in dieser Sache wrid auf dem Client stattfinden. Hilft auch nicht viel, bei den Avatar Rendering Costs nachzuschauen, da berechnen die für jede rotierende Textur pro Oberfläche 4 Punkte, Grund: rotierende Texturen brauchen eine Texture Matrix.

OK, wenn sich eine Textur auf einer glatten Oberfläche (Seite des Rades) bewegt, ist das ein 2D-Problem, da sich das Fahrrad aber in der 3D-Welt-bewegt, Kurven fährt, kippt, ... ist auch das wieder eine 3D-Berechnung.

Ich denke mal, für ein "stillstehendes" rotierendes Rad dürften die Berechnungen ziemlich gleichwertig sein. Auch die Rotation mit llTargetOmega ist ja schließlich nichts anderes als die Rotation einer Textur.

Das eigentliche Problem bei llSetTextureAnim ist die Beschränkung auf eine einzige Animation. Drehen heißt zum Beispiel: rechts rum. Von der einen Seite fährt das Fahrrad richtig vorwärts, von der anderen Seite gesehen dreht sich das Rad auch rechts rum, das aber bedeutet rückwärts.

Ist bei Autos nicht so schlimm, weil man die Innenseite der Reifen nicht sieht, aber ein Fahrrad ist von beiden Seiten zu sehen.

OK, ich denke die Rotation der Textur auf dem Rand des Zylinders wird man für beide Fälle vernachlässigen können, weil man dort in der Regel nicht die Textur der Radfläche, sondern wohl nur eine Farbe aufträgt.

Es ist interessant, wie lange man selbst über so kleine und scheinbar einfache Fragestellungen nachdenken kann. Daher danke an Noctua für die Anregung.
 
So ich bin es wieder...
Das Problem bei dem script ist, dass die einzelnen Bauteile des Rades nicht syncron zueinander rotieren, was glaube ich auf den eingesetzen timer zurückzuführen ist.

Hier mal mein Script:

default
{
state_entry()
{
llSetTimerEvent(0.01);
}

timer()
{
string ani = llGetAnimation(llGetOwner());

if (ani == "Walking")
{
llTargetOmega(<0,5,0>,PI/4,1.0);
}
else if (ani == "Running")
{
llTargetOmega(<0,15,0>,PI/4,1.0);
}
else if (ani == "CrouchWalking")
{
llTargetOmega(<0,2.5,0>,PI/4,1.0);
}
else if (ani == "Turning Right")
{
llTargetOmega(<0,-2.5,0>,PI/4,1.0);
}
else if (ani == "Turning Left")
{
llTargetOmega(<0,2.5,0>,PI/4,1.0);
}
else
{
llTargetOmega(ZERO_VECTOR, 0, 0);
}
}
}


Jeder Versuch den Timer zu entfernen und das Script umzuschreiben brachte einen Error... aber ich habe auch nicht wirklich Ahnung davon.

Kennt Einer von euch die Lösung für das Problemchen ???
 
Hilfe Hilfe Hilfe

Also mir wurde jetzt gesagt, das der Timer drinn bleiben soll
jetzt habe ich aber ne neue Frage....

Kann man das Script nicht so umschreiben, dass nur 1 Script pro Rad verwendet wird, aber die zum Rad dazugehörigen (scriptlosen) Prims automatisch mitdrehen ???
 
Interessant, target omega gegen drehende textur...
Was ich aber fraglich finde ist wenn ein timer alle 0.01!!! sekunden sich um ein rad kümmern soll. 0.1s würde sicher auch noch völlig reichen, was dann nur einen 10tel der serverbelastung wäre?. Ich nutze auch einen timer in meinen flugscripten und komme da mit 0.5s aus...
Lieg ich da falsch?
 
Ja, aus performance Gründen habe ich die 0.01 sec. schnell wieder verworfen und habe mittlerweile 0.1 sec genommen. 0.5 kommt da aber nicht in Frage, da ein Rad aus ingesammt 4 rotierenden Teilen besteht und mit 0.5 startet und stopt die Rotation der einzelen Radteile deutlich zeitversetzt.

Deswegen bin ich ja auf der Suche nach einem Script, das den Teilen den Befehl gibt zu rotieren, anstatt wie jetzt 4 gleiche scripts in einem Rad zu haben.
 

Aktive User in diesem Thread

Oben Unten