liebe wissende,
ich will eine ‚tuch-simulation‘ (in matlab) schreiben. ich bin auf das problem gestossen, dass ich bisher keine dämpfung für federnde objekte einbauen konnte.
die ganze ‚engine‘ ist natürlich sehr rudimentär, also nicht sehr wirklichkeitsgetreu:
-das tuch besteht aus einem rechtwinkligen gitter von n x m punkten
-jeder punkt ist mit den punkten links und rechts sowie oben und unten verbunden (ausnahme: randpunkte)
-jeder punkt besitzt eine geschwindigkeit (2 komponenten) einen ort (2 komponenten) und masse (1 komponente)
bei jedem teilschritt passiert folgendes:
-gesamtkraft auf einen punkt wird berechnet, diese besteht aus gravitation und ‚federkraft‘
-gravitation(nach unten, eine richtung)
-‚federkraft‘ bezüglich den verbindungspunkten:
-der ‚standardabstand‘ zwischen zwei verbundennen punkten beträgt eins. ist der abstand grösser, so wird der aktuelle punkt zu seinem nachbarspunkt hingezogen, ist er kleiner, abgestossen (also genau wie eine feder: f = k*d (wobei d auslenkung, also abstand-1)
-aus kraft und masse wird beschleunigung berechnet (a =F/m)
-aus beschleunigung und geschwindigkeit wird die neue geschwindigkeit berechnet: v = valt + a*dt (dt ist der zeitschritt)
-aus geschwindigkeit und ort wird der neue ort berechnet,p = p+v*t
dies funktioniert soweit alles.
nun wobbelt alles immernoch viel zu fest umher, ich habe also das gefühl das die ‚federn‘ eine dämpfung benötigen. (oder alles ein wenig ‚reibung‘ hätte, als wäre das ganze im wasser aufgehängt) wie kann man das bei diesem algorithmus einbauen?
lg niemand
gruss niemand
Hallo,
nun wobbelt alles immernoch viel zu fest umher, ich habe also
das gefühl das die ‚federn‘ eine dämpfung benötigen. (oder
alles ein wenig ‚reibung‘ hätte, als wäre das ganze im wasser
aufgehängt) wie kann man das bei diesem algorithmus einbauen?
na, indem Du die Programmzeile
F = Gravitationskraft + Federkraft
suchst und sie um die Reibungskraft erweiterst (ist das nicht naheliegend?):
F = Gravitationskraft + Federkraft + Reibungskraft
Was Du für die Reibungskraft konkret ansetzt, hängt von der Art der Reibung ab. Standardmäßig wählt man eine geschwindigkeitsproportionale Reibung (obwohl z. B. auch v-unabhängige und v²-proportionale Reibungen in der Natur vorkommen), denn dann bleibt die zugehörige Differentialgleichung linear und lässt sich schön analytisch lösen.
Für v-proportionale Reibung setzt Du einfach
Reibungskraft = k v
wobei die Konstante k die Stärke der Reibung festlegt – klar. Mach k groß genug und Du wirst über die Wirkung dieser unscheinbaren Modifikation an Deinem Programm erstaunt sein
Gruß und schöne Feiertage
Martin
*wie schuppen von den augen fall*
natürlich, ich habe irgendwie zu weit gedacht, ist ja wirklich keine zauberei=)
vielen dank!
gruss niemand
Hallo,
mir ist noch etwas aufgefallen, was du evtl. nur unpräzise wiedergegeben hast –
du berechnest
(p_{i+1}, v_{i+1}) = (p_i, v_i) + d t (v_i, F(p_i, v_i))
Damit solltest du den aktualisierten Ort mit der Geschwindigkeit berechnen! (Die Unterschiede offenbaren sich erst bei genauer Überprüfung und Gegencheck mit analytischen Ergebnissen.)
Gruß!
w.bars
vielen dank, das ist mir noch gar nicht aufgefallen!
bei genügend kleinem zeitintervall sollte dies aber vernachlässigbar sein, oder? natürlich werde ich es noch ändern. in meinem fall handelt es sich aber sowieso nur um eine qualitative simulation, die ausser einem schönen ‚video‘ (und natürlich dem lerneffekt=) nichts bringen soll.
dennoch danke für das genaue durchlesen!=)
gruss