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.