Unter Verwendung eines Epsilon-Wert zu bestimmen, ob ein Ball in einem Spiel nicht bewegt?

stimmen
2

Ich habe Bälle prallen und jedes Mal, wenn sie kollidieren ihr Geschwindigkeitsvektor von der Restitutionskoeffizient reduziert wird.

Gerade jetzt meine Bälle AdR für meine Bälle ist .80. So nach vielen prallt meine Bälle „gestoppt“ rollen, weil ihre Geschwindigkeit etwas lächerlich kleine Zahl hat immer.

In welchem ​​Stadium ist es angebracht, zu prüfen, ob ein Geschwindigkeitswert klein genug ist, einfach Null zu nennen (so dass ich nicht das verrückte jittering der Kugeln habe die Reaktion auf ihre Mikro-Geschwindigkeiten). Ich habe auf einigen Foren zu lesen, bevor die Leute manchmal einen Epsilon-Konstante verwenden, einige kleine Zahl und überprüfen dagegen.

Soll ich definieren eine epsilon konstant und so etwas wie:

if Math.abs(velocity.x) < epsilon then velocity.x = 0

Jedes Mal, aktualisiere ich die Bälle Geschwindigkeit und Position? Ist es das, was in der Regel getan? Wäre es sinnvoll sein, dass in meinen Vektor-Klassen-Setter für x und y zu platzieren? Oder soll ich es außerhalb meiner Vektor-Klasse, wenn ich die Geschwindigkeiten bin zu berechnen.

Auch, was wäre ein vernünftiger Epsilon-Wert sein, wenn ich Schwimmer für meinen Geschwindigkeitsvektor mit?

Veröffentlicht am 10/12/2008 um 01:02
quelle vom benutzer
In anderen Sprachen...                            


4 antworten

stimmen
1

Anstelle eines epsilon für eine IsStillMoving Funktion, vielleicht könnten Sie eine UpdatePosition Funktion, auf einem Objekt-für-Objekt-Basis auf seine Geschwindigkeit basierend geplant verwenden.

Ich würde so etwas tun (in meinem eigenen Make-it-up-as-you-go-Pseudo-Code):

void UpdatePosition(Ball b) {

   TimeStamp now = Clock.GetTime();
   float secondsSinceLastUpdate = now.TimeSince(b.LastUpdate).InSeconds;

   Point3D oldPosition = b.Position;
   Point3D newPosition = CalculatePosition(b.Position, b.Velocity, interval);
   b.MoveTo(newPosition);

   float epsilonOfAccuracy = 0.5; // Accurate to one half-pixel
   float pixelDistance = Camera.PixelDistance(oldPosition, newPosition);
   float fps = System.CurrentFramesPerSecond;
   float secondsToMoveOnePixel = (pixelDistance * secondsSinceLastUpdate) / fps;
   float nextUpdateInterval = secondsToMoveOnePixel / epsilonOfAccuracy;

   b.SetNextUpdateAt(now + nextUpdateInterval);
}

Kugeln bewegt sich sehr schnell würde auf jeden Rahmen erhalten aktualisiert. Kugeln bewegen sich langsamer könnten alle fünf oder zehn Frames aktualisieren. Und Kugeln, die aufgehört haben (oder gestoppt fast) nur sehr sehr selten aktualisieren.

Beantwortet am 10/12/2008 um 01:43
quelle vom benutzer

stimmen
1

Ein angemessener Wert für Epsilon wird auf den Zwängen des Systems abhängen. Wenn Sie den Ball grafisch repräsentieren, dann könnte Ihr epsilon entsprechen, sagen wir, eine Geschwindigkeit von 0,1 Pixeln pro Sekunde (sicherzustellen, dass Ihre Vorstellung des Anhaltens der Erfahrung der Bildschirmobjekte des Benutzers passt zu stoppen). Wenn Sie eine Physik-Simulation tun, sollten Sie es zum Abstimmen auf die Genauigkeit, mit der Sie versuchen, Ihr System zu messen.

Was, wie oft Sie überprüfen - das auch abhängig ist. Wenn Sie etwas in Echtzeit sind zu simulieren, kann die zusätzliche Überprüfung teuer sein, und Sie werden alle 10 Updates oder einmal pro Sekunde oder etwas überprüfen möchten. Oder Leistung könnte kein Problem sein, und Sie können mit jedem Update überprüfen.

Beantwortet am 10/12/2008 um 01:23
quelle vom benutzer

stimmen
0

Epsilon von Natur aus ist der kleinstmögliche Zuwachs. Leider haben die Computer unterschiedliche „minimal“ Schritte von ihrer eigenen auf der Gleitkommadarstellung abhängig. Ich würde sehr vorsichtig sein (und könnte sogar noch höher als das, was ich gerade für die Sicherheit berechnen würde) das Spiel mit, dass, vor allem, wenn ich einen Code will tragbar sein.

Möglicherweise möchten Sie eine Funktion schreiben, die die minimale Erhöhung auf Schwimmern findet heraus, anstatt einen magischen Wert zu verwenden.

Beantwortet am 10/12/2008 um 01:49
quelle vom benutzer

stimmen
0

IMO Ihr epsilon Ansatz ist in Ordnung. Ich würde experimentieren nur um zu sehen, was aussieht oder fühlt, um die Animation im Spiel natürlich.

Beantwortet am 10/12/2008 um 01:14
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more