*Markus: Gamephysik-Abprall nach freiem Fall durch Gewicht beeinflussen?

Hallo,

ich habe ein kniffliges Anliegen:
Ich lasse einen Ball aus einer bestimmten Höhe herunterfallen mit einer konfigurierbaren Schwerkraft. Verwende ich die normale Erdbeschleunigung ~9.8m/s², dann prallt der Ball einmal stärker vom Boden ab, und kommt dann sehr schnell zum Stillstand (beim 3. Aufprall). Die Animation (die ich im Android-SDK-Emulator verfolge) sieht schon mal ganz ordentlich und natürlich aus. Es gibt allerdings eine Sache, die mich stört. Der Ball hat immer das selbe Gewicht, d.h. eine niedrigere Anziehungskraft lässt ihn zwar höher und öfter aufspringen, aber die Balleigenschaft lässt sich so nicht beeinflussen, wodurch man dem Ball auch nicht die Eigenschaft eines Ping-Pong-Balls oder eines Medizinballs zuweisen kann. Ich denke dabei an eine Bewegung, die in etwa so aussieht:
http://www.kirupa.com/developer/as3/physics_bounce_effect_pg1.htm
Aktuell berechne ich den Rückprall vom Boden so, dass die Geschwindigkeit der kinetischen Energie mit jener der potenziellen gleich ist. Ich setze also die Formeln gleich. Dadurch kürzt sich aber die Masse weg:

Potentielle Energie: mgh
//g...Gravitation, m...Masse des Körpers in kg, h...Höhe, um die das Objekt angehoben wird

Kinetische Energie: mv²/2
//m...Masse des Objekts in kg, v....Geschwindigkeit in m/s²

Ergebnis: v = Wurzel(2*|aktuelleHöhe-Anfangshöhe|)

Der Trick dabei ist, dem Ball irgendwie die "Eigenschaft" eines Ping-Pong-Balls zu geben, wodurch die Geschwindigkeit beim Abprallen dementsprechend beeinflusst wird. Die Preisfrage ist wie schaffe ich das?

Hier ein kurzes Testprogramm, das die Variablen ausgibt, damit die Sprungparabeln veranschauchlicht werden können.

  
import java.text.DecimalFormat;  
  
public class Physics {  
  
	private int height = 0;  
	private double gravity = 9.8; // m/s²  
	private double t;			  //time in seconds  
	private int initialY;  
	private double initialSpeed;  
	private int y;  
	private int lastY;  
	private int stageHeight = 500;  
	private int ballHeight = 10;  
	private boolean ballDirection = true; //true bedeutet Fall hinunter, false hinauf  
	private DecimalFormat df;  
	  
	  
	//Formel freier Fall mit Anfangsgeschw. 0  
	//h(t) = h(0) - gt²/2           //g...Gravitation, h(0)...Ausgangshöhe, h...Höhe des Körpers zur Zeit t.  
								    //Das Minus bedeutet abwärts fallenden Körper. Im Programm aber Plus, da sonst Minuszahlen als y-Wert  
	//s(t) = | h(t) - h(0) | = gt²/2   //s.....Strecke  
	public Physics() {  
		y = initialY = 0;  
		df = new DecimalFormat("0.00");  
	}  
	  
	public void printData()   {  
		 for (int i = 0; i < 400; i++)   {	 	  
			 checkBottomCollision();  
			 t+=0.2;  
			 lastY = y;  
			 if (ballDirection == true)  
			     y = (int)(initialY + 0.5 * gravity * (t * t)+0.5);  //+0.5 am Schluss damit der Wert bei casten aufgerundet wird  
			 else  
				 y = (int)(initialY - initialSpeed * t + 0.5 * gravity * (t * t)+0.5);  
			  
		    	if (lastY <= y && ballDirection == false)  {  
		    		initialY = y;  
		    		ballDirection = true;  
		    		t = 0;  
		    	}  
			 System.out.println("y:" + y + "\t| t:" + df.format(t) + "\t| initSpeed:" + df.format(initialSpeed) + "\t| Direction:" + ballDirection);  
			  
		 }  
	}  
	  
	private void checkBottomCollision()   {  
		//Potentielle Energie: mgh  //g...Gravitation, m...Masse des Körpers in kg, h...Höhe, um die das Objekt angehoben wird  
		//Kinetische Energie: 0.5*mv² //m...Masse des Objekts in kg, v....Geschwindigkeit in m/s²  
    	if (y + ballHeight >= stageHeight && ballDirection == true)  {  
			initialSpeed = Math.sqrt(2*Math.abs(y - initialY));  
			ballDirection = false;  
			initialY = y;  
			t = 0.0;  
    	}  
	}  
}  
------  
  
public class Main {  
  
	public static void main(String[] args) {  
		// TODO Auto-generated method stub  
		Physics p = new Physics();  
		p.printData();  
	}  
  
}  

Die Ausgabe sieht dann zB so aus. Anhand der Richtung (true/false) erkennt man sehr schön, wie und wie oft der Ball aufprallt:

y:0 | t:0,20 | initSpeed:0,00 | Direction:true
y:1 | t:0,40 | initSpeed:0,00 | Direction:true
y:2 | t:0,60 | initSpeed:0,00 | Direction:true
y:3 | t:0,80 | initSpeed:0,00 | Direction:true
y:5 | t:1,00 | initSpeed:0,00 | Direction:true
y:7 | t:1,20 | initSpeed:0,00 | Direction:true
y:10 | t:1,40 | initSpeed:0,00 | Direction:true
y:13 | t:1,60 | initSpeed:0,00 | Direction:true
y:16 | t:1,80 | initSpeed:0,00 | Direction:true
y:20 | t:2,00 | initSpeed:0,00 | Direction:true
y:24 | t:2,20 | initSpeed:0,00 | Direction:true
y:28 | t:2,40 | initSpeed:0,00 | Direction:true
y:33 | t:2,60 | initSpeed:0,00 | Direction:true
y:38 | t:2,80 | initSpeed:0,00 | Direction:true
y:44 | t:3,00 | initSpeed:0,00 | Direction:true
y:50 | t:3,20 | initSpeed:0,00 | Direction:true
y:57 | t:3,40 | initSpeed:0,00 | Direction:true
y:64 | t:3,60 | initSpeed:0,00 | Direction:true
y:71 | t:3,80 | initSpeed:0,00 | Direction:true
y:78 | t:4,00 | initSpeed:0,00 | Direction:true
y:86 | t:4,20 | initSpeed:0,00 | Direction:true
y:95 | t:4,40 | initSpeed:0,00 | Direction:true
y:104 | t:4,60 | initSpeed:0,00 | Direction:true
y:113 | t:4,80 | initSpeed:0,00 | Direction:true
y:123 | t:5,00 | initSpeed:0,00 | Direction:true
y:132 | t:5,20 | initSpeed:0,00 | Direction:true
y:143 | t:5,40 | initSpeed:0,00 | Direction:true
y:154 | t:5,60 | initSpeed:0,00 | Direction:true
y:165 | t:5,80 | initSpeed:0,00 | Direction:true
y:176 | t:6,00 | initSpeed:0,00 | Direction:true
y:188 | t:6,20 | initSpeed:0,00 | Direction:true
y:201 | t:6,40 | initSpeed:0,00 | Direction:true
y:213 | t:6,60 | initSpeed:0,00 | Direction:true
y:227 | t:6,80 | initSpeed:0,00 | Direction:true
y:240 | t:7,00 | initSpeed:0,00 | Direction:true
y:254 | t:7,20 | initSpeed:0,00 | Direction:true
y:268 | t:7,40 | initSpeed:0,00 | Direction:true
y:283 | t:7,60 | initSpeed:0,00 | Direction:true
y:298 | t:7,80 | initSpeed:0,00 | Direction:true
y:314 | t:8,00 | initSpeed:0,00 | Direction:true
y:329 | t:8,20 | initSpeed:0,00 | Direction:true
y:346 | t:8,40 | initSpeed:0,00 | Direction:true
y:362 | t:8,60 | initSpeed:0,00 | Direction:true
y:379 | t:8,80 | initSpeed:0,00 | Direction:true
y:397 | t:9,00 | initSpeed:0,00 | Direction:true
y:415 | t:9,20 | initSpeed:0,00 | Direction:true
y:433 | t:9,40 | initSpeed:0,00 | Direction:true
y:452 | t:9,60 | initSpeed:0,00 | Direction:true
y:471 | t:9,80 | initSpeed:0,00 | Direction:true
y:490 | t:10,00 | initSpeed:0,00 | Direction:true
y:484 | t:0,20 | initSpeed:31,30 | Direction:false
y:478 | t:0,40 | initSpeed:31,30 | Direction:false
y:473 | t:0,60 | initSpeed:31,30 | Direction:false
y:468 | t:0,80 | initSpeed:31,30 | Direction:false
y:464 | t:1,00 | initSpeed:31,30 | Direction:false
y:459 | t:1,20 | initSpeed:31,30 | Direction:false
y:456 | t:1,40 | initSpeed:31,30 | Direction:false
y:452 | t:1,60 | initSpeed:31,30 | Direction:false
y:450 | t:1,80 | initSpeed:31,30 | Direction:false
y:447 | t:2,00 | initSpeed:31,30 | Direction:false
y:445 | t:2,20 | initSpeed:31,30 | Direction:false
y:443 | t:2,40 | initSpeed:31,30 | Direction:false
y:442 | t:2,60 | initSpeed:31,30 | Direction:false
y:441 | t:2,80 | initSpeed:31,30 | Direction:false
y:440 | t:3,00 | initSpeed:31,30 | Direction:false
y:440 | t:0,00 | initSpeed:31,30 | Direction:true
y:440 | t:0,20 | initSpeed:31,30 | Direction:true
y:441 | t:0,40 | initSpeed:31,30 | Direction:true
y:442 | t:0,60 | initSpeed:31,30 | Direction:true
y:443 | t:0,80 | initSpeed:31,30 | Direction:true
y:445 | t:1,00 | initSpeed:31,30 | Direction:true
y:447 | t:1,20 | initSpeed:31,30 | Direction:true
y:450 | t:1,40 | initSpeed:31,30 | Direction:true
y:453 | t:1,60 | initSpeed:31,30 | Direction:true
y:456 | t:1,80 | initSpeed:31,30 | Direction:true
y:460 | t:2,00 | initSpeed:31,30 | Direction:true
y:464 | t:2,20 | initSpeed:31,30 | Direction:true
y:468 | t:2,40 | initSpeed:31,30 | Direction:true
y:473 | t:2,60 | initSpeed:31,30 | Direction:true
y:478 | t:2,80 | initSpeed:31,30 | Direction:true
y:484 | t:3,00 | initSpeed:31,30 | Direction:true
y:490 | t:3,20 | initSpeed:31,30 | Direction:true
y:488 | t:0,20 | initSpeed:10,00 | Direction:false
y:487 | t:0,40 | initSpeed:10,00 | Direction:false
y:486 | t:0,60 | initSpeed:10,00 | Direction:false
y:485 | t:0,80 | initSpeed:10,00 | Direction:false
y:485 | t:0,00 | initSpeed:10,00 | Direction:true
y:485 | t:0,20 | initSpeed:10,00 | Direction:true
y:486 | t:0,40 | initSpeed:10,00 | Direction:true
y:487 | t:0,60 | initSpeed:10,00 | Direction:true
y:488 | t:0,80 | initSpeed:10,00 | Direction:true
y:490 | t:1,00 | initSpeed:10,00 | Direction:true
y:490 | t:0,00 | initSpeed:3,16 | Direction:true
y:490 | t:0,00 | initSpeed:0,00 | Direction:true
y:490 | t:0,00 | initSpeed:0,00 | Direction:true
y:490 | t:0,00 | initSpeed:0,00 | Direction:true
y:490 | t:0,00 | initSpeed:0,00 | Direction:true
y:490 | t:0,00 | initSpeed:0,00 | Direction:true

(Sollten die Variablen geändert werden, muss darauf geachtet werden, dass die for-Schleife hinreichend oft durchlaufen wird, damit die Ausgabe nicht "abgeschnitten" wird. Der Einfachheit halber habe ich auf einen Mechanismus hierbei verzichtet)

Markus.

  1. Ohne das alles angesehen zu haben...

    Die Masse ist beim freien Fall nicht ausschlaggebend, die kürzt sich sowieso weg.

    aber die Balleigenschaft lässt sich so nicht beeinflussen

    Welche meinst du?

    wodurch die Geschwindigkeit beim Abprallen dementsprechend beeinflusst wird.

    An welche Beeinflussung denkst du dabei?

    Aktuell berechne ich den Rückprall vom Boden so, dass die Geschwindigkeit der kinetischen Energie mit jener der potenziellen gleich ist.

    Das ist ja zunächst auch ok so. Eigentlich müsstest du dir nur die Geschwindigkeit des Aufpralls merken und nachher wieder (in umgekehrter Richtung) weiterverwenden.
    Vielleicht wirds ja besser wenn du ein bisschen Geschwindigkeit wegnimmst, die sozusagen in der Verformung des Balls hängenbleibt.

    1. Ohne das alles angesehen zu haben...

      Die Masse ist beim freien Fall nicht ausschlaggebend, die kürzt sich sowieso weg.

      Das hatte ich bereits angemerkt.

      aber die Balleigenschaft lässt sich so nicht beeinflussen
      Welche meinst du?

      Wie ich schon sagte, es wäre toll, wenn man dem Ball ein "Gewicht" zuweisen könnte.

      wodurch die Geschwindigkeit beim Abprallen dementsprechend beeinflusst wird.
      An welche Beeinflussung denkst du dabei?

      Ein leichterer Ball springt öfter auf. Das will ich erreichen, aber ohne die Schwerkraft zu beeinflussen, denn dies würde zu einem anderen physikalischen Verhalten führen.

      Aktuell berechne ich den Rückprall vom Boden so, dass die Geschwindigkeit der kinetischen Energie mit jener der potenziellen gleich ist.
      Das ist ja zunächst auch ok so. Eigentlich müsstest du dir nur die Geschwindigkeit des Aufpralls merken und nachher wieder (in umgekehrter Richtung) weiterverwenden.

      Genau das tue ich aktuell.

      Vielleicht wirds ja besser wenn du ein bisschen Geschwindigkeit wegnimmst, die sozusagen in der Verformung des Balls hängenbleibt.

      Um den Ball wie einen Ping-Pong-Ball springen zu lassen, müsste ich die Geschwindigkeit erhöhen, damit dieser höher aufspringt.

      Markus

      1. Tach,

        Wie ich schon sagte, es wäre toll, wenn man dem Ball ein "Gewicht" zuweisen könnte.

        wie gesagt, Masse und damit Gewicht spielen keine Rolle.

        Ein leichterer Ball springt öfter auf.

        Nein, ein sich weniger verformender Ball springt öfter auf.

        Aktuell berechne ich den Rückprall vom Boden so, dass die Geschwindigkeit der kinetischen Energie mit jener der potenziellen gleich ist.
        Das ist ja zunächst auch ok so. Eigentlich müsstest du dir nur die Geschwindigkeit des Aufpralls merken und nachher wieder (in umgekehrter Richtung) weiterverwenden.

        Genau das tue ich aktuell.

        Das kann nicht sein, sonst würde die kinetische Energie ja wieder komplett in potentielle umgewandelt werden und der Ball würde wieder die Höhe des Startpunkts erreichen.

        mfg
        Woodfighter

        1. Aktuell berechne ich den Rückprall vom Boden so, dass die Geschwindigkeit der kinetischen Energie mit jener der potenziellen gleich ist.
          Das ist ja zunächst auch ok so. Eigentlich müsstest du dir nur die Geschwindigkeit des Aufpralls merken und nachher wieder (in umgekehrter Richtung) weiterverwenden.

          Genau das tue ich aktuell.

          Das kann nicht sein, sonst würde die kinetische Energie ja wieder komplett in potentielle umgewandelt werden und der Ball würde wieder die Höhe des Startpunkts erreichen.

          Das wundert mich auch, dass es so nicht funktioniert, denn wie man in der Gleichung sieht, tue ich nichts anderes. Zuerst dachte ich, dass es an dem Rundungsfehler zu int liegt, aber selbst als double "verliere ich irgendwie die Energie".

          Ironischerweise hat der Verfasser des Beitrags auf der verlinkten Website genau dieses Verhalten und muss das Ergebnis mit einer zusätzlichen Variable so verfälschen, dass die Energie immer weniger wird.
          Allerdings ist mir die Lösung des Verfassers zu umständlich, wobei er seltsamerweise aber trotzdem genau die selbe Gleichung verwendet wie ich.

          Markus.

          1. Tach,

            Das wundert mich auch, dass es so nicht funktioniert, denn wie man in der Gleichung sieht, tue ich nichts anderes. Zuerst dachte ich, dass es an dem Rundungsfehler zu int liegt, aber selbst als double "verliere ich irgendwie die Energie".

            deine Dämpfung liegt in initialSpeed = Math.sqrt(2*Math.abs(y - initialY));, du nutzt es später als Geschwindigkeit, allerdings hätte es die Maßeinheit [latex]\sqrt{m}[/latex]. Eigentlich müßtest du, beim Aufprall auf eine perfekte Mauer und unter Vernachlässigung der Thermodynamik durch Energieerhaltung eine Geschwindigkeit von [latex]|v| = |t*gravity|[/latex] erhalten.

            mfg
            Woodfighter

            1. Hallo,

              deine Dämpfung liegt in initialSpeed = Math.sqrt(2*Math.abs(y - initialY));, du nutzt es später als Geschwindigkeit, allerdings hätte es die Maßeinheit [latex]\sqrt{m}[/latex]. Eigentlich müßtest du, beim Aufprall auf eine perfekte Mauer und unter Vernachlässigung der Thermodynamik durch Energieerhaltung eine Geschwindigkeit von [latex]|v| = |t*gravity|[/latex] erhalten.

              Du hast recht. [latex]|v| = |t*gravity|[/latex] führt zum gewünschten Ergebnis eines endlosen Aufprallens. Hier könnte ich nun irgendwie einen Energieverlust einbauen. Wenn meine ursprüngliche Formel nicht die Geschwindigkeit ist, was ist es dann? Von der Mathematik her erschien es mir logisch, da kinetische und potenzielle Energie gleich sind und ich die Gleichung nach der Geschwindigkeit auflöste?

              Markus

              1. Tach,

                Wenn meine ursprüngliche Formel nicht die Geschwindigkeit ist, was ist es dann? Von der Mathematik her erschien es mir logisch, da kinetische und potenzielle Energie gleich sind und ich die Gleichung nach der Geschwindigkeit auflöste?

                zum Aufprallzeitpunkt sind potentielle und kinetische Energie nicht gleich, das ist sie, wenn der Ball auf halber Höhe ist. Das was du da berechnet hast, sieht einfach wie ein Fehler aus.

                mfg
                Woodfighter

                1. Hallo,

                  zum Aufprallzeitpunkt sind potentielle und kinetische Energie nicht gleich, das ist sie, wenn der Ball auf halber Höhe ist. Das was du da berechnet hast, sieht einfach wie ein Fehler aus.

                  Stimmt, eigentlich ist es so wie bei einem Pendel.

                  Markus

                  1. Stimmt, eigentlich ist es so wie bei einem Pendel.

                    Der Punkt ist, dass du wohl den Energieerhaltungssatz falsch verstanden hast. Er besagt, dass die Gesamtenergie konstant bleibt, aka Epot+Ekin+(weitere allenfalls vorhandene)=konstant. Beim Zeitpunkt des Aufpralls ist aber die potentielle Energie (wenn du den Grund als Referenz nimmst) gleich 0 und alle Energie steckt in der Bewegung. Von Epot=Ekin kann also keine Rede sein.

          2. Das wundert mich auch, dass es so nicht funktioniert, denn...

            Das sollte dich nicht nur wundern, sondern auf den Gedanken bringen, dass irgendwas in deiner Berechnung überhaupt nicht stimmt. Geht nirgends im Vorgang Energie verloren, wird diese vollständig umgewandelt und der Ball springt immer genau gleich hoch, hat immer die gleichen Geschwindigkeiten in den gleichen Bewegungszuständen. Sonst stimmen deine Kalkulationen nicht.
            Weiter auch noch die folgende Anmerkung: Die Wahl des Koordinatensystems wird dein Resultat immer nur in dem Sinne beeinflussen, dass dieses dann auch wieder im entsprechenden Koordinatensystem stehen wird - daraus kann kein Fehler entstehen, der entsteht nur in der Berechnung. Egal ob die x-Achse nach unten geht, schräg ist, du Kugel- oder Zylinderkoordinaten verwendest oder von mir aus Polynome als Basis nimmst... :)

            Wie auch immer: Du willst mehr Realismus?
            Dann brauchst du nur etwas Grundlagenphysik.
            Was du dir anschauen solltest:

            • Stösse: Findest du in jedem Buch über allgemeine Physik, alternativ auch in Wikipedia. In dem Sinne ist der Begriff des IMPULSES sehr wichtig (beim Stoss selber sind die Begriffe potentielle und kinetische Energie nicht das, was du für deine Berechnung benötigst, diese kannst du zur Berechnung der Sprunghöhe wieder heranziehen). Du benötigst den IMPULSERHALTUNGSSATZ, nicht den ENERGIEERHALTUNGSSATZ, obwohl diese natürlich eng verknüpft sind. In diesem spielen die Massen der beteiligten Körper dann auch eine gewichtige Rolle (Nur nützt dir das hier nicht viel, da die Gegenmasse in deinem Fall wohl die Erde ist und du somit einen ziemlich vollständigen Rückprall hast). Schau dir Literatur zu elastischen, inelastischen etc Stössen an. Wichtig für dich in dem Zusammenhang: Wo geht Energie verloren? Zb durch Verformung: Dies ist eine Eigenschaft des Balles, wie stark er verformbar ist. Ein Medizinball wird den Stoss stark dämpfen und ihm Energie entziehen (->noch extremer eine Kugel aus Knet, die sich komplett verformt und überhaupt nicht mehr abspringt), während ein Ping Pong Ball dies in viel kleinerem Ausmass machen wird. Damit kriegst du dann ganz einfach deine gewünschte unterschiedliche Sprunghöhe. Aber bitte: Energie dazugeben, das geht dann aber überhaupt nicht... Sonst kannst du gleich Handgelenk mal Pi einfach irgendwas machen bis du findest: "Ohhhh das sieht aber schön aus...."
            • Allenfalls für noch mehr Realismus: Luftwiderstand...

            gruss

            1. Hallo,

              alles klar. Bisher wusste ich nicht wirklich, nach welchem physikalischen Gesetz ich mich am besten orientieren muss.

              Markus

      2. Hi,

        Vielleicht wirds ja besser wenn du ein bisschen Geschwindigkeit wegnimmst, die sozusagen in der Verformung des Balls hängenbleibt.

        Um den Ball wie einen Ping-Pong-Ball springen zu lassen, müsste ich die Geschwindigkeit erhöhen, damit dieser höher aufspringt.

        nein, aber du müsstest das Federverhalten des Balls berücksichtigen, d. h. wie gut wird die Verformung durch den Aufprall wieder in kinetische Energie umgesetzt und wie viel in Wärme.

        Schönen Sonntag noch!
        O'Brien

        --
        Frank und Buster: "Heya, wir sind hier um zu helfen!"
      3. Wie ich schon sagte, es wäre toll, wenn man dem Ball ein "Gewicht" zuweisen könnte.

        Naja aber wenn das sich dann nicht auswirkt, kommt dabei nicht mehr raus als dass der Ball eine Eigenschaft gewicht = x hat, die nirgends verwendet wird :-)

        Ich denke das hier ...

        Ein leichterer Ball springt öfter auf

        ... ist vielleicht gerade damit zu erreichen, dass du an der Abprallgeschwindigkeit des Balls drehst. Ich könnte mir vorstellen dass der Effekt damit zusammenhängt, dass ein schwerer Ball mehr Energie in die Verformung von sich und dem Untergrund übergibt als ein leichter. Daher hat er weniger Energie beim Hochhüpfen und kommt somit nicht mehr ganz so hoch.

        Ich habs mir jetzt doch näher angesehen, dein imitSpeed sieht etwas seltsam aus, von 31 auf 10 ist eine ziemliche Abnahme. Dabei ist mir dann was aufgefallen.
        Ich sehe dass du mit y=0 den Startpunkt des Balls bezeichnest. Sinnvoller wäre es, den Untergrund mit 0 zu bezeichnen und dann nach oben hin die Höhe ansteigen zu lassen.
        In deinem Fall hast du wahrscheinlich falsche Werte beim Berechnen, weil du nicht von der eigentlichen Höhe (gemessen vom Boden bis zum Ball) ausgehst, sondern von der Differenz zwischen Start und aktueller Höhe.
        Dreh das mal um, dann solltest du eigentlich einen dauerhaft springenden Ball haben. Dem nimmst du dann bei jedem Aufprall noch ein bisschen Energie weg, dann sollte das schon realistisch werden.

        1. Ich sehe dass du mit y=0 den Startpunkt des Balls bezeichnest. Sinnvoller wäre es, den Untergrund mit 0 zu bezeichnen und dann nach oben hin die Höhe ansteigen zu lassen.

          Auf dem Bildschirm, bzw Handy-Display fängt das Koordinatensystem oben links an. Somit wäre es umständlich, für sämtliche Grafiken etc.. die Koordinaten umzudrehen.

          Markus.

  2. hi,

    Aktuell berechne ich den Rückprall vom Boden so, dass die Geschwindigkeit der kinetischen Energie mit jener der potenziellen gleich ist. Ich setze also die Formeln gleich. Dadurch kürzt sich aber die Masse weg:

    Naja, ganz so einfach ist das nicht, der Impulserhaltungssatz und der Energieerhaltungssatz führt auf eine Differintialgleichung, weil da die Ableitung nach der Geschwindigkeit v drinsteckt (Impuls = m*v, Energie = m/2 * v*v), die gilt es zu lösen. Verdammt lang her ;-)

    Hotti

  3. Hallo *Markus,

    du musst für dein Spiel die Bewegungsgleichung mit(!) Dämpfung lösen. Wenn dir das zu kompliziert oder für dein Spiel zu aufwändig ist, kannst du die Dämpfung dadurch simulieren, dass du einfach die Energie "von Zeit zu Zeit" reduzierst. Z.B könntest du bei jedem Stoß einige Prozent abziehen, um die Verformungsreibung zu simulieren. Auch in der Freifluphase könntest du in jedem Zeitschritt einige Promille abziehen, um die Luftreibung zu simulieren. Je nach Anforderung reicht es evtl. sogar, statt der Energie nur die Gewschwindigkeit zu reduzieren. Probiere es einfach mal aus, ob die Bewegung dann realistisch genug wirkt.

    Gruß, Jürgen

    1. Hallo,

      bisher war das Problem allerdings, dass ich die Energie verlor, obwohl ich das gar nicht wollte. Also genau das Gegenteil davon. Mittlerweile habe ich den Aufprall mit gravity * t ersetzt, wodurch ich nun derartige physikalische Einflüsse einbauen kann.

      Markus

  4. Hi there,

    Der Trick dabei ist, dem Ball irgendwie die "Eigenschaft" eines Ping-Pong-Balls zu geben, wodurch die Geschwindigkeit beim Abprallen dementsprechend beeinflusst wird. Die Preisfrage ist wie schaffe ich das?

    Ich hab so etwas einmal damit gelöst, indem ich einfach eine Variable eingebaut habe, die mit der Zeit immer grösser wird, wobei zu Änderung der Variable von einer anderen Variablen, die das Material repräsentiert, abhängig ist.

    Zu Anschaungszwecken...

    1. Hallo,

      sehr gut gemacht. Ich hoffe, dass ich mir da noch die eine oder andere Idee abschauen darf.

      Markus