Wobei man davon ausgeht, dass Geschwindigkeit angibt, wie sehr sich die Position in einer Zeiteinheit ändert. Die Masse ist dabei egal. Wenn du die Gravitation noch reinrechnest (ohne finde ich eine Flugbahnrecht recht lame), musste du "nur" die y-Komponte (wenn y oben und unten angibt) jede Step um einen konstanten Wert (die Gravitation) verkleinern. Also wieder in Pseudocode:
_________________ Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut. Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’. Und du schaust mich an und fragst ob ich das kann. Und ich denk, ich werd' mich ändern irgendwann. _________________Farin Urlaub - Bewegungslos
Registriert: Mi Jan 31, 2007 18:32 Beiträge: 150
Programmiersprache: Pascal
Bei dir würde aber alles mit gleicher Geschwindigkeit nach unten bewegt, egal ob Ferder oder Amboss. Von daher würde ich das ganze so ändern das die Masse mit der Konstante multipliziert wird und dann abgezogen wird.
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
Ein Objekt, unabhängig seiner Masse, wird mit jeder Zeiteinheit um den Wert der Gravitation schneller. Da g auf der Erde 9.81m/s² ist und auf den Erdmittelpunkt zielt nehme ich das mal als Beispiel.
Op = Objekt-Positionsvektor [m aus R³] Ov = Objekt-Bewegungsvektor (Betrag = Geschwindigkeit , Richtung = Bewegungsrichtung) [m/s aus R³] g = Gravitation [9,81m/s² aus R³] dt = Zeit seit letzter Berechnung in sekunden
Da ich überall R³ zugeschrieben habe ist hoffentlich erkenntlich, dass es sich hierbei um Vektoren im 3-dimensonalen Raum handelt. sogar bei der Gravitation, da diese ja eigentlich nur eine Beschleunigung in eine Richtung ist. 'm' meint hier die Maßeinheit Meter, da g sich auf Meter bezieht. Hast du für dein Koordinaten-System einen anderen Maßstab zur Umrechnung musst du das natürlich berücksichtigen.
Die bewegung des Objektes ergibt sich aus seiner aktuellen Position zuzüglich der zurückgelegten Distanz seit der letzten Berechnung. D.h.: Op' = Op + Ov*dt da Ov als Einheit m/s hat und dt in Sekunde angegeben ist, kürzt sich die Sekunde von Ov weg. Es bleiben Meter über. So wie für unsere Position vorgegeben. Jetzt gilt zuberücksichtigen, dass sich nicht nur die Position des Objektes verändert, sondern auch seine Bewegung. Das heißt auch Ov muss erneut berechnet werden. Die neue Bewegung eines Objektes ergibt sich aus der vorherigen Bewegung zuzüglich der Beschleunigung über das vergangene Zeitintervall seit der letzten Berechnung. D.h.: Ov' = Ov + g*dt Auch hier kürzen sich wieder Sekunden weg, allerdings werden aus m/s² (Beschleunigung) m/s (Geschwindigkeit), was für unsere Bewegung notwendig ist.
Diese Rechenschritte musst du nun für jedes Objekt in jedem Frame/Berechnungsschritt durchführen. Es macht Sinn, jedem Objekt einen Zeiger (in C++ einfach zu realisieren durch statics) auf die Variable zu geben, mit der du die Zeit zwischen den Frames misst. Auf diese Weiße sind alle Objekte immer auf den laufenden, ohne dass doppelte Daten existieren, oder Daten verschoben werden müssen.
Der Kehrwert der gemessenen Zeit ist übrigens die Framerate.
Edit: g kann als Vektor auch so geschrieben werden (0,-9.81,0). Zeigt also nach unten, wodurch eine Beschleunigung nach unten auf das Objekt wirkt, die unserer Erdgravitation ja am nähesten kommt. Genauso kann man auch Beschleunigungen aus anderen Richtungen wirken lassen um zum Beispiel einen "Magneten" zu erstellen (g zeigt dann vom Objekt aus auf den Magneten mit beliebiger Länge).
Bei dir würde aber alles mit gleicher Geschwindigkeit nach unten bewegt, egal ob Ferder oder Amboss. Von daher würde ich das ganze so ändern das die Masse mit der Konstante multipliziert wird und dann abgezogen wird.
Man könnte das Verhalten über die Dichte simulieren. Mit Dichte gegen unendlich geht die reele Gravitationsbeschleinigung gegen eine feste maximale Konstante, sonst halt kleiner. Die Masse würde sich hier nur schlecht Eignen, weil 1kg Federn genauso fällt wie 10 kg Feder, gleiches für einen Stahlklumpen.
_________________ Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut. Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’. Und du schaust mich an und fragst ob ich das kann. Und ich denk, ich werd' mich ändern irgendwann. _________________Farin Urlaub - Bewegungslos
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
Wenn man es ziemlich korrekt machen möchte, muss man die Dichte des Mediums in dem sich das bewegte Objekt mit der Dichte des bewegten Objektes verrechnen und den Auftrieb mit in die Bewegung hineinrechnen. Ein weiteres Problem ist die Verwirbelung von Medien, die nicht Fest sind, in denen das Objekt sich bewegt. Dieser Prozess ist allerdings physikalisch so kompliziert, dass man ihn evtl. über zufällig veränderte Rotationen (abhängig vom Verhältnis der Dichten) und Auftriebe simulieren sollte. Allerdings auch nur bei Objekten, deren Verhältnis Eigengewicht zu Grundfläche sehr große Werte liefert. die Grundfläche ergibt sich aus der Projektion des Objektes auf die Ebene, deren Normale entgegengesetzt der Bewegungsrichtung ist. Das sollte einigermaßen real (und performance bremsend) sein.
Es gibt für fast alles eine physikalische Vereinfachung. Ao auch für den Luftwiderstand eines Objekts bzw. für die Gegenkraft, die es beim "durchgleiten" durch ein nicht festes Medium erfährt. Sie ist abhängig von Dichte des Mediums, Geschwindigkeit und dem sog. cW-Wert, der experimentell ermittelt wird oder auch irgendwie sehr kompliziert und sicher nicht in Echtzeit mit FEM berrechnet werden kann.
In der Luft kann man die Auftriebskomponente getrost vernachlässigen, solange es nicht um Gase als oben definiertes Objekt geht. Aber dafür ist die Gleichung ohnehin nicht zu gebrauchen nehme ich an.
FL = 0.5 * A * Dichte(medium) * v² * cW
Problematisch: So ziemlich alle Körper bis auf eine Kugel haben bei unterschiedlicher Strömungsrichtung einen unterschiedlichen cW Wert. Will man das auch noch berücksichtigen brauch man alle cW Werte in einer für seine Zwecke hinreichenden Auflösung. Um die in Echtzeit mit einzurechnen, würde ich die persönlich auf ne Cubemap drücken und per Shader abfragen =)
MFG
_________________ I'm not the signature, I'm just cleaning the floor...
Mitglieder in diesem Forum: 0 Mitglieder und 3 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. Du darfst keine Dateianhänge in diesem Forum erstellen.