Polygone, dessen Eckpunkte eine Masse haben
-
Hallo mal wieder
Ich möchte bei mein 2D-Motorradspiel Polygone einbauen, dessen Eckpunkte eine Masse(+Geschwindigkeit) haben. Was sind das für Kräfte, welche das Polygon in seiner Form halten? Damit die Punkte immer den richtigen Abstand zueinander haben, könnte man erstmal Federn einsetzen. Wie aber wird der richtige Winkel eingehalten? Drehmomentformel oder wie?
Momentan sieht mein Quellcode so aus:
private class PhysikEckPunkt { public Vektor pos, gesch = new Vektor(0, 0), kraft; public float masse, baseLength, baseDegree;} //Initialisiere alle Massepunkte(Einmalig) mPoints = new List<PhysikEckPunkt>(); for (int i = 0; i < points.Count; i++) { mPoints.Add(new PhysikEckPunkt() { pos = points[i], baseLength = (points[(i + 1) % points.Count] - points[i]).Betrag(), baseDegree = Vektor.Winkel(points[(i + 1) % points.Count] - points[i], points[(i + points.Count - 1) % points.Count] - points[i]), masse = 5 /*Kg*/ }); } //Rechne alle 50ms:(Zyklisch) //1. Kräfte auf 0 setzen for (int i = 0; i < mPoints.Count; i++) mPoints[i].kraft = new Vektor(0, 0); //2. Federkraft hinzufügen for (int i = 0; i < mPoints.Count - 1; i++) { Vektor feder1 = Haken.getFederkraft(mPoints[i].pos, mPoints[i + 1].pos, mPoints[i].baseLength, mPoints[i].gesch, mPoints[i + 1].gesch, 200, 200, 200); mPoints[i].kraft += feder1; mPoints[i + 1].kraft -= feder1; } //3. Winkelkraft(Drehmoment?) hinzufügen for (int i = 0; i < mPoints.Count-1; i++) { Vektor P1 = mPoints[(i + mPoints.Count - 1) % mPoints.Count].pos, P2 = mPoints[i].pos, P3 = mPoints[(i + 1) % mPoints.Count].pos; Vektor L1 = P1 -P2, L2 = P3 - P2; float deltaWinkel = (Vektor.Winkel(L1, L2) - mPoints[i].baseDegree) / 2; Vektor KWinkel1 = (P2 + Vektor.Drehe_Vektor(L1, +deltaWinkel) - P1) / L1.Betrag() * 100.1f; Vektor KWinkel2 = (P2 + Vektor.Drehe_Vektor(L2, -deltaWinkel) - P3) / L2.Betrag() * 100.1f; mPoints[(i + mPoints.Count - 1) % mPoints.Count].kraft += KWinkel1; mPoints[(i + 1) % mPoints.Count].kraft += KWinkel2; } //Kraft auf Massepunkte wirken lassen, um diesen zu Bewegen for (int i = 0; i < mPoints.Count; i++) { //Gravitationskraft mPoints[i].kraft += new Vektor(0, 9.81f) * mPoints[i].masse; //Luftwiderstand(Eigentlich lautet die Formel F = v² * cw aber egal^^ mPoints[i].kraft -= mPoints[i].gesch * 0.2f; //Geschindigkeitsvektor berechnen: v += a * t mit F = m * a; a = F / m mPoints[i].gesch += mPoints[i].kraft * time / mPoints[i].masse; mPoints[i].pos += mPoints[i].gesch * time; }
Das Problem ist, wenn mein Polygon runter fällt und es schlägt mit einem Eckpunkt auf eine Kante auf, dann fällt es in sich selber zusammen. Die Winkel zwischen den Linien bei den Eckpunkten werden also nicht eingehalten.
Hat hier jemand eine Idee, was für Kräfte ich verwenden kann, um das Polygon in Form zu halten? Wie könnte die Physikformel aussehen?
-
Sag mal was das Polygon tun soll wenn es runterfällt. Es hört sich so an als solle es nicht verformbar sein, also spielen physikalische Gesetze keine Rolle, da nichts passiert.
Das Drehmoment spielt nur eine Rolle, wenn du einen festen Drehpunkt hast.
Der Druck auf einen Punkt wird einfach an die anderen Punkte weitergegeben, sodass am Ende auf alle Punkte im Polygon die gleichen Kräfte wirken, wodurch sich das Polygon als Ganzes bewegt. Drehungen bzw. ein Sechseck den Berg runter kullern lassen sollte damit gehen.Wenn du Federn nimmst, dann muss die Federkonstante entsprechend unendlich sein, was vielleicht Rechenprobleme mit sich bringt. Ein Quadrat könnte man dann aber immernoch in ein Parallelogramm einknicken. Du könntest eine Feder pro Punktpaar einfügen um das einknicken zu verhindern, aber das werden quadratisch viele Federn, bei komplexen Polygonen kommen irgendwann Laufzeitschwierigkeiten rein, zumal einige Federn dann keinen Effekt haben (eine Diagonale würde beim Quadrat reichen). Wahrscheinlich reichen linear viele Federn, aber ich wüsste aus dem Stand nicht welche und wieviele.
-
trianguliere das polygon. bei dreiecken hast du grundsaetzlich eine abhaengigkeit zwischen der laenge der seiten und der winkel.
(im simpelsten fall, zum testen, mach eine feder zwischen jedem moeglichen vertex paar, dann solltest du sehen dass es stabil bleibt)
-
Das Federn eine schlechte Lösung sind habe ich auch bemerkt.
Stell dir mal ein Stück Pappe vor, aus dem ich ein Weihnachtsstern bastle. Der Stern liegt auf dem Tisch, ich schnippse mit mein Finger gegen einen der Zacken. Der Stern wird sich also teilweise zu drehen anfangen und teilweise wird er dabei über den Tisch rutschen.
Genau so ein Verhalten will ich nach modellieren. Das meine ich auch mit "nicht verformbar" Weil der Stern bleibt ja trotzdem ein Stern, selbst wenn ich ihn über den Tisch schnippse.
Was schlägst du vor, damit ich diese Weihnachtsstern-Finger-Schnipss-Aufgabe lösen kann?
-
Eckpunkte habe keine Masse, berechne Schwerpunkt und Angriffspunkt der Kraft und leite daraus die Bewegung ab. Polygone dienen nur zur Darstellung von Objekten, sind aber keine Objekte.
-
Ok, Problem wurde raspo sei Dank gelöst. Ich habe das Polygon in Dreiecke zerlegt. Zwischen den Dreiecken liegen Federn mit einer großen Federkraft. Das Gebilde scheint nun sehr stabil zu sein. Selbst wenn ich komische Polygonkonstruktionen baue bleibt es in seiner Form. Job Done