Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

rewb0rn

Supermoderator

  • »rewb0rn« ist der Autor dieses Themas

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

1

15.01.2008, 23:13

[Netzwerk] Cubic Splines

Hi,

ich bin dabei Netzwerksynchronisation mithilfe von Cubic Splines zu implementieren, aber es will einfach nicht klappen... Ich habe versucht nach diesem Tutorial zu arbeiten, aber wenn ich meine Objekte der Spline folgen lasse, bewegen sich sich einfach geradelinig von ihrer Position schräg nach oben weg (alle mit etwas unterschiedlicher Orientierung). Vielleicht hat ja hier schonmal jemand sowas implemtiert und kann mir helfen, im Thread zu dem Thema wird auf gamedev nicht wirklich geantwortet (auch wenn ich speziell dazu noch nicht gepostet hab)

Hier ist der relevante Code meiner Splines

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void CubicSpline::CreateCubicSpline(Ogre::Vector3 Pos0, Ogre::Vector3 Speed0, Ogre::Vector3 Pos1, Ogre::Vector3 Speed1, Ogre::Vector3 Acc1)
{
    static double Time2 = 0.5 * TimeToFollow * TimeToFollow;

    Ogre::Vector3 X1, X2, X3;

    X1 = Pos0 + Speed0;
    X2 = Pos1 + (TimeToFollow * Speed1) + (Time2 * Acc1);
    X3 = X2 - (Speed1 + (TimeToFollow * Acc1));

    A = X3 - (3 * X2) + (3 * X1) - Pos0;
    B = (3 * X2) - (6 * X1) + (3 * Pos0);
    C = (3 * X1) + (3 * Pos0);
    D = Pos0;

    TimeSinceStart = 0.0;
}

Ogre::Vector3 CubicSpline::FollowCubicSpline(double TimePassed)
{
    TimeSinceStart += TimePassed;
    
    double t = TimeSinceStart / TimeToFollow;
    double t2 = t * t;

    Ogre::Vector3 X = (A * t2 * t) + (B * t2) + (C * t) + D;

    return X;
}

bool CubicSpline::IsActivated(void)
{
    return (TimeSinceStart < TimeToFollow);
}



Kommt eine aktuelle Nachricht vom Server, wird die Spline so aktiviert:

C-/C++-Quelltext

1
2
3
    Spline.CreateCubicSpline(Body->getPosition(), Body->getLinearVelocity(), TargetPos, TargetLinVel, TargetForce);
    FollowSpline = true;
    Body->sleep();


Die Parameter sind korrekt, das kann ich erkennen wenn ich einfach ohne Spline aktualisiere.

So wird der Spline gefolgt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
    if (FollowSpline)
    {
        if (!Spline.IsActivated())
        {
            FollowSpline = false;
            Body->wake();
        }
        else
        {
            Node->setPosition(Spline.FollowCubicSpline(TimePassed));    
        }
    }


Die Bodys bleiben alle an Ort und Stelle so wie es gewünscht ist (durch das sleep), die Modelle sollten jetzt egtl an die aktuelle Position gerückt werden, fliegen aber nur wie beschrieben durch die Gegend und springen dann nachdem Body->wake() aufgerufen wurde wieder zurück zum Body. Für die Physik verwende ich ode.

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

2

16.01.2008, 01:51

Hmmm... Kann im Moment keinen Fehler im Code finden... Bist du dir sicher dass alle Daten (auch bei der Aktualisierung) stimmen?
Und hast du mal versucht draufzukommen, warum das Teil ZURÜCK springt? Vllt liegt das Problem ja dort?
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

rewb0rn

Supermoderator

  • »rewb0rn« ist der Autor dieses Themas

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

3

16.01.2008, 02:41

Also wenn ich Body->sleep() aufrufe, kann ich über Node->setPosition() die Position des Modells ändern, weil der Body sie nicht mehr aktualisiert. Da sich der Body aber in der Zeit nicht bewegt springt das Modell zurück sobald ich wake() aufrufe, weil ja dann der Body wieder die Kontrolle über die Position des Modells übernimmt, sie also überschreibt. Das ist ja so auch erstmal gewünscht.

Ich weiß, dass die Daten von der Seite des Servers korrekt sind, denn wenn ich einfach Body->setPosition(TargetPos) mache, bzw. Body->setLinearVelocity(TargetLinVel), etc. funktionierts (nur eben ruckartig, was ja gerade durch die Splines verhindert werden soll).


Nachtrag: Ich hab eben festgestellt, dass sich die Modelle alle vom Ursprung wegbewegen, daher rührt die unterschiedliche Richtung. Eine Erklärung dafür hab ich leider nicht.

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

4

16.01.2008, 12:24

Leider weiß ich nicht was hier falsch sein sollte. Kann dir aber ne Alternative bieten ;)
Kannst es ja mal mit der probieren, schaun obs dann geht!

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//Kritisch gedämpfte Glättung --> SmoothCD for ease-in / ease-out smoothing

template <typename T> inline 
T ogUtilsSmoothCD(const T &From,        //Start

                  const T &To,          //Ende

                  T &Vel,               //Aktuelle Geschwindigkeit

                  float fSmoothTime,    //Dauer der Glättung

                  float fTime)          //Vergangene Zeit

{
    //Omega berechnen (Resonanzfrequenz --> Winkelgeschwindigkeit)

    float fOmega = 2.0f / fSmoothTime;

    //Exponent berechnen

    float x     = fOmega * fTime;
    float fExp  = 1.0f / (1.0f + x + 0.48f * x * x + 0.235f * x * x * x);

    //Neue Position und Geschwindigkeit (= Vel[ocity]) berechnen

    T uChange = From - To;
    T Temp = (Vel + fOmega * uChange) * fTime;
    Vel = (Vel - fOmega * Temp) * fExp;

    return To + (uChange * Temp) * fExp;
}
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

rewb0rn

Supermoderator

  • »rewb0rn« ist der Autor dieses Themas

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

5

16.01.2008, 14:52

Ich versuche gerade das zu implementieren, aber entweder ich versteh noch nicht ganz wie die Funktion zu benutzen ist, oder ich hab tatsächlich noch andere Fehler im System (Ich geh mal davon aus, dass die Funktion bei dir läuft?) Ich lege From, To, Vel und SmoothTime fest sobald eine Nachricht am Client ankommt und rufe dann solange bis Time > SmoothTime die Funktion einmal pro Frame auf, und nehme das Ergebnis als aktuelle Position. Soweit korrekt?

Würde gerne auch Vel dynamisch bestimmen, das erscheint mir aber nicht sinnvoll, weil ich die Bodys während der Bewegung ausschalten muss, damit sie während der Korrektur nicht durch Intersektion chaotisches Verhalten bewirken.

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

6

16.01.2008, 16:33

Also. Damit die Funktion genau das gleiche leistet wie dein CubicSpline müsste man sie erweitern. Wenn ichs mir recht überlege ist sie in der Form leider nicht besonders gut für deine Zwecke geeignet, da die Geschwindigkeit kein Parameter ist, sondern ein Ergebnis der Funktion. Selbige "interpoliert" zwischen From und To in SmoothTime und gibt dir für jeden Zeitpunkt t (< SmoothTime) die aktuelle Geschwindigkeit Vel. (Genaueres steht im Artikel auf Seite 99 in Gems4)

Leider habe ich im Moment keine Zeit selbst zu probieren, wie die Funktion zu erweitern ist. Die ganzen Prüfungen stehen vor der Tür....

Sonst schreib mal direkt wegen deines Problems ins gamedev.net Forum.
Falls du es dann lösen kannst, würd mich interessieren wo der Fehler lag... ;)
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

rewb0rn

Supermoderator

  • »rewb0rn« ist der Autor dieses Themas

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

7

16.01.2008, 16:43

ok verstehe, sollte ich denn dann vel noch irgendwie verwenden? Müsste doch reichen, wenn ich einfach das ergebnis der funktion als neue position benutze oder? Hab ja ne alte Position und ne neue, sehe da nicht ganz den Sinn einer Geschwindigkeit, die ich da noch irgendwie anwenden soll. ich werde den artikel mal nachschlagen, danke soweit.

Werbeanzeige