Physik Forum

Viel Spaß im Physik Forum von Physik-Lab.de. Es werden keine kompletten Hausaufgaben gelöst. Bitte auf Rechtschreibung und aussagekräftige Überschriften achten.
Aktuelle Zeit: Sa Aug 19, 2017 7:41 am

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Gravitation und Kollision von Kugeln
BeitragVerfasst: So Mai 28, 2017 2:13 pm 
Offline

Registriert: So Mai 28, 2017 2:11 pm
Beiträge: 3
Hallo Forum,

ich versuche schon seit Längerem eine Simulation für Gravitation mit kugelförmigen Masseneinheiten zu programmieren. Das ganze wäre aber nur halb so spannend, wenn die Kugeln nicht kollidieren könnten, da sonst die Bildung von planetenähnlichen Strukturen etc. unmöglich wäre. Für die Kollision habe ich bisher den elastischen Stoß verwendet.
Jetzt gibt es aber folgendes Problem: Ich bekomme einfach keine guten Zusammenstellungen hin, sodass es wirklich Spaß macht, der Simulation zuzuschauen. Und das liegt vermutlich vor Allem daran, dass in den physikalischen Algorithmen einfach Fehler sind. Zum Beispiel bewegen sich die Planeten meiner Meinung nach viel zu langsam aufeinander zu. Dies liegt wahrscheinlich daran, dass die internen Kollisionen mit nicht vollständiger Impulserhaltung jeden Impuls abschwächen, der in Richtung eines anderen Planeten aufgebaut wird. Nutze ich allerdings 100%ige Impulserhaltung, können sich gar keine stabileren Strukturen bilden... :?

Hier mal der grobe Code, den ich für die Aktualisierung aller Kugeln verwende:
Code:
// Die letzte Kugel kann mit keiner anderen mehr verglichen werden, deswegen circleCount - 1
int lastCircle1 = circles.length - 1;
for (int circleIndex1 = 0; circleIndex1 < lastCircle1; ++circleIndex1) {
   for (int circleIndex2 = circleIndex1 + 1; circleIndex2 < circles.length; ++circleIndex2) {
   float deltaX = circles[circleIndex1].position.x - circles[circleIndex2].position.x;
   float deltaY = circles[circleIndex1].position.y - circles[circleIndex2].position.y;
   float squaredDistance = deltaX * deltaX + deltaY * deltaY;
   float distance = (float)Math.sqrt(squaredDistance);
   // Nur der Vollständigkeit halber derart ungekürzt
   if (distance > circleDiameter) {
      float force = gravityConstant * circleMass * circleMass / squaredDistance;
      float acceleration1 = force / circleMass;
      float acceleration2 = force / circleMass;
      float deltaVelocity1 = acceleration1 * timeInterval;
      float deltaVelocity2 = acceleration2 * timeInterval;
      // Delta normalisieren, um die Vektoren zu den Beträgen zu finden
      float normalizedX = deltaX / distance;
      float normalizedY = deltaY / distance;
      // Neue Geschwindigkeit dazuaddieren
      add(circles[circleIndex1].velocity, normalizedX, normalizedY, -deltaVelocity1);
      add(circles[circleIndex2].velocity, normalizedX, normalizedY, deltaVelocity2);
   } else {
      // Kollision
      if (distance < circleDiameter) {
         // Kugeln erst einmal voneinander entfernen, damit das eigentliche Abprallen weiter unten richtig ablaufen kann
         float massSum = 2.0f * circleMass;
         float f = circleDiameter / distance - 1.0f;
         deltaX *= f;
         deltaY *= f;
         float dX = deltaX * circleMass / massSum;
         float dY = deltaY * circleMass / massSum;
         circles[circleIndex1].position.add(dX, dY);
         circles[circleIndex2].position.sub(dX, dY);
      }
      float x1 = circles[circleIndex1].velocity.x;
      float y1 = circles[circleIndex1].velocity.y;
      float x2 = circles[circleIndex2].velocity.x;
      float y2 = circles[circleIndex2].velocity.y;
      float nx = circles[circleIndex2].position.x - circles[circleIndex1].position.x;
      float ny = circles[circleIndex2].position.y - circles[circleIndex1].position.y;
      float scalarN = nx * nx + ny * ny;
      // Winkel zwischen Kugel1 und Stoßnormaler
      float f1 = (x1 * nx + y1 * ny) / scalarN;
      // Paralelle Komponente
      float vp1x = nx * f1;
      float vp1y = ny * f1;
      // Senkrechte Komponente
      float vs1x = x1 - vp1x;
      float vs1y = y1 - vp1y;
      // Winkel zwischen Kugel2 und Stoßnormaler
      float f2 = (x2 * nx + y2 * ny) / scalarN;
      // Parallele Komponente
      float vp2x = nx * f2;
      float vp2y = ny * f2;
      // Senkrechte Komponente
      float vs2x = x2 - vp2x;
      float vs2y = y2 - vp2y;
      // Wenn Massen der zwei Kugeln gleich sind -> Vereinfachung Parallele Komponenten werden getauscht, senkrechte bleiben gleich
      circles[circleIndex1].velocity.set(vs1x + vp2x * remainingImpulse, vs1y + vp2y * remainingImpulse);
      circles[circleIndex2].velocity.set(vs2x + vp1x * remainingImpulse, vs2y + vp1y * remainingImpulse);
   }
}
// Kugeln abhängig von der Geschwindigkeit verschieben
for (int circleIndex = 0; circleIndex < circles.length; ++circleIndex) {
   add(circles[circleIndex].position, circles[circleIndex].velocity.x, circles[circleIndex].velocity.y, timeInterval);
}


Danke für jede Idee! :)


Nach oben
 Profil  
 
BeitragVerfasst: So Mai 28, 2017 4:47 pm 
Offline

Registriert: Do Feb 25, 2016 8:18 pm
Beiträge: 286
Wohnort: Münster
Das Problem ist, dass wenn Du zwei Planeten kollidieren lässt Du es mit einem mehr oder weniger plastischen Stoß zu tun hast... Aber bestimmt nicht mit einem elastischen... Ich weiß auch gar nciht, wie Du auf einen elastischen Stoß kommst... Dafür gibt es doch im Weltall gar kein Beispiel... Und selbst bei der Kollision von Tiamat mit Nibiru war es "nur" ein plasitscher Stoß... Nibiru wurde voll assimiliert und eingefangen... Du kannst ihn nachst als Mond am Himmel sehen...

https://www.youtube.com/watch?v=Yr2rJqt1FRU


Nach oben
 Profil  
 
BeitragVerfasst: Mo Mai 29, 2017 9:14 pm 
Offline

Registriert: So Mai 28, 2017 2:11 pm
Beiträge: 3
Nein, sorry wenn ich es nicht richtig erklärt habe: Meine "Planeten" bestehen aus vielen kugelförmigen Teilmassen. Und diese kollidieren vollkommen elastisch. Kollidieren zwei ganze Planeten, verschmelzen sie oder werfen Teile der Kugeln in Umlaufbahnen etc. so wie es eben sein soll... :mrgreen:

Das Problem ist vermutlich mein algorithmisches Vorgehen:

Code:
für jedes Kugelpaar:
   wenn sich die Kugeln überschneiden:
      Elastischer Stoß; Formel nutzt Geschwindigkeiten des letzten Bildes,
      verrechnet sie und leitet daraus neue Geschwindigkeiten her
   sonst:
      Gravitation zwischen Kugeln berechnen und auf Geschwindigkeit
      anwenden
   ende wenn
ende schleife


Wenn eine Kugel von Planet A mit vielen Kugeln von Planet B verrechnet wird, baut sie einen Impuls in Richtung von Planet B auf. Werden allerdings danach die internen Kollisionen in Planet A berechnet und dies mit nicht vollständiger Impulserhaltung, dann geht ein großer Teil des Impulses in Richtung Planet B verloren.
Das äußert sich dann so, dass Planet A immer langsamer auf B zuzockelt, je geringer ich die Impulserhaltung einstelle, was ja einfach nicht realistisch sein kann... Anderes Beispiel: Zwei Planeten zockeln endlos langsam aufeinander zu. Dann wird einer von beiden von einem Kometen getroffen und "explodiert" und ganz plötzlich schießen die jetzt einzelnen Kugeln nur so auf den anderen Planeten zu. Eben weil sie nicht mehr kollidieren und kein Impuls mehr verloren geht... :?


Nach oben
 Profil  
 
BeitragVerfasst: Mo Mai 29, 2017 10:01 pm 
Offline

Registriert: Do Feb 25, 2016 8:18 pm
Beiträge: 286
Wohnort: Münster
Tut mir leid, ich kann Dir bei Deinem Problem nicht helfen... Das ist mir zu speziell...


Nach oben
 Profil  
 
BeitragVerfasst: Di Mai 30, 2017 4:39 pm 
Offline

Registriert: So Mai 28, 2017 2:11 pm
Beiträge: 3
Ok trotzdem danke für die Rückmeldung! :)

Falls noch jemand eine Idee hat: Ich habe das Problem noch nicht gelöst und bin über jeden Vorschlag dankbar! :mrgreen:


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.

Suche nach:


Physik Blog