Bouncing Ball bis er ruht

AsterixdGallier

Aktives Mitglied
Hallo,

ich möchte einen Ball vom Boden abprallen lassen, bis er schließlich ruht.
So, als würde ich einen Fußball ohne Reibung auf den Boden fallen lassen.

Code:

Java:
	// ---------------------------------------------------------
	private void lasseKugelFallen (Kugel kugel) 
	{
			{
				double timeSinceBeginn = System.currentTimeMillis () - kugel.getFallTimeStart ();
				timeSinceBeginn *= 0.0001;
				double y = kugel.getBewegungsRichtung ().getY () * timeSinceBeginn + 0.5 * Settings.kErdGravitation * timeSinceBeginn * timeSinceBeginn;
				kugel.setBewegungsRichtung(new Vektor (kugel.getBewegungsRichtung().getX (), kugel.getBewegungsRichtung().getY () + Settings.kErdGravitation * timeSinceBeginn));
				System.out.println (kugel.getBewegungsRichtung().getY());
				kugel.setPosition(kugel.getPosition ().getX (), kugel.getPosition ().getY () + y);
			}
	}

Wenn er den Boden trifft:
Java:
			if (kugel.getBewegungsRichtung().getY() >= 0)
			{
				 kugel.setBewegungsRichtung(new Vektor (kugel.getBewegungsRichtung ().getX (), -kugel.getBewegungsRichtung ().getY () * Settings.bounceVelLoss));
			}

Funktioniert auch, das Problem ist nur, auch wenn die Kugel quasi ruht, wird immer noch die Erdanziehung auf den Bewegungsvektor addiert. Also fliegt die Kugel auch dann noch immer gegen die untere Grenze. Spricht sie hüpft immer ganz leicht weiter.
Im Internet finde ich zwar viel über freien Fall und abprallen, aber auf das Problem wird nie eingegangen.
Was kann man da machen?

liebe Grüße
 
Zuletzt bearbeitet:

BuckRogers

Bekanntes Mitglied
Hallo,

ich denke man sollte der Kugel irgendwann sagen sass der Fall beendet ist.
Ich würde mir diesbezüglich eine Tolleranzgrenze setzen in der der Fall ausgeführt wird.
Wenn dann ein bestimmter Wert unterschritten ist, dann ist der Fall beendet und die Koordinaten der Kugel werden festgesetzt.

Grüße
 

AsterixdGallier

Aktives Mitglied
Hallo,

ich denke man sollte der Kugel irgendwann sagen sass der Fall beendet ist.
Ich würde mir diesbezüglich eine Tolleranzgrenze setzen in der der Fall ausgeführt wird.
Wenn dann ein bestimmter Wert unterschritten ist, dann ist der Fall beendet und die Koordinaten der Kugel werden festgesetzt.

Grüße
Habe ich auch schon dran gedacht. Problem ist aber z.B. das die Geschwindigkeit auch = 0 ist, wenn sie nach dem Abprall vom Boden in der Luft die Richtung wechselt.. :(
Im wahren Leben wirkt die Schwerkraft ja auch noch, wenn ein Ball auf dem Boden liegt.
Weiteres Problem ist, dass wenn die Kugel bereits eingefroren ist, sie nicht mehr reagiert, falls eine Kugel noch später auf sie rauf fällt.
Ich habe nämlich mehrere Kugeln, die gegebenenfalls von einander abprallen.
 
Zuletzt bearbeitet:

dcc

Aktives Mitglied
Der Code ist bischen kurz, aber kann es sein dass bei dir die Werte um eine Zahl springen und die Abbruchbedingung nie wirklich greift. Hatte ich letztens in OpenGL wo es einen Richtungwechsel gab.

Beim prüfen ob float = 0.9 größer oder kleiner als 1.0 und einer Bewegung um:
+0.2 -> größer
-0.2 -> kleiner

bei jeder neuen Iteration zitterte das Teil hin und her ;)
Lösung war ein Toleranzbereich
 
Zuletzt bearbeitet:

AsterixdGallier

Aktives Mitglied
Habe ich auch schon dran gedacht. Problem ist aber z.B. das die Geschwindigkeit auch = 0 ist, wenn sie nach dem Abprall vom Boden in der Luft die Richtung wechselt.. Im wahren Leben wirkt ja auch immer die Schwerkraft auf einen Ball, auch wenn er liegt :( Komme da nicht weiter..

Die Videos sind cool, konnte dadurch noch die Elastizität in meinen Stoß einbauen danke!
Das Problem mit dem ewigen weitergehopste wird da aber leider nicht erwähnt.. :(
Die letzte Antwort habe ich nicht ganz verstanden.
Das Problem ist, das mein Bewegungvektor nie null wird, da er immer mindestens aus der Schwerkraft in Y-Richtung besteht.
Ab einem bestimmten Wert müsste ich quasi die Schwerkraft deaktivieren.
 

ARadauer

Top Contributor
if (kugel.getBewegungsRichtung().getY() >= 0)

das ist dein problem... evtl wirds nie 0, mach halt sowas if (kugel.getBewegungsRichtung().getY() >= 0.2)
wenn du am herum hopsen bist, hörst du auf...
 

Ähnliche Java Themen

Neue Themen


Oben