Wellen/Billard Simulation - Wo anfangen?
-
Hallo zusammen,
Ich hoffe ihr könnt mir etwas Orientierung im Framework- und Library-Jungle geben.
Ich versuche ein Programm zu schreiben das zwei Dinge simulierta)eine primitives Billardspiel mit einer Kugel, die in einer beliebig geformten (zumindest komplizierter als Kreis und Rechteck) Begrenzung hin und her reflektiert wird. Dabei ist vor allem wichtig das die Kugel physikalisch korrekt abprallt, dh. der Winkel genau stimmt.
http://en.wikipedia.org/wiki/Dynamical_billiardsb) eine zweidimensionale Schwingung als Feld von gekoppelten „Federn“, im Grunde eine Kopie davon http://www.falstad.com/ripple/ aber mit benutzerdefinierten Begrenzungen
Mit Standard C++ bin ich jetzt gegen 2 Wände gelaufen:
Wie schaffe ich es eine gekrümmte Form darzustellen und die dem User zu erlaubt diese zu verändern oder neu zu definieren? Und vor allem, wie stelle ich das graphisch da?
Ich weiß nach 5 Stunden Google eigentlich noch nicht mehr als vorher welche Bibliotheken/Frameworks/Engines mir weiterhelfen könnten und wie ich diese im Zweifelsfall benutzen könnte. Weil das ganze später von Linux auf Windows portierbar sein sollte, hab ich mir QT+OpenGL mal näher angeschaut, hab aber mit diesem Tutorial http://www.digitalfanatics.org/projects/qt_tutorial/chapter14.html nichts außer Compilerfehlern zustande gebracht.Mit Standard C++ kann ich ganz gut umgehen und von QT hab ich zumindest eine grobe Ahnung, aber leider hörts bei Allem was drüber hinaus geht schlagartig auf.
Also Leute, wie würdet ihr an die Sache rangehen? Welche Grundkenntnisse muss ich mir aneignen um das Problem einigermaßen in Code zu fassen? Brauch ich dafür überhaupt ne Keule wie OpenGL oder reicht mir auch das, was QT und die STL mitbringt?Wäre nett wenn ihr einem Noob etwas weiterhelfen könntet oder mir zumindest mal nen Tipp gebt bei welchem Tutorial/Wikipedia Artikel ich anfangen könnte
Danke schonmal für die Antworten und fröhliche Weinachten!
-
seismicmenace schrieb:
a)eine primitives Billardspiel mit einer Kugel, die in einer beliebig geformten (zumindest komplizierter als Kreis und Rechteck) Begrenzung hin und her reflektiert wird. Dabei ist vor allem wichtig das die Kugel physikalisch korrekt abprallt, dh. der Winkel genau stimmt.
http://en.wikipedia.org/wiki/Dynamical_billiardsDu widersprichst dir hier selbst.
Der von dir verlinkte Artikel beschreibt Systeme (bzw. deren Simulationen) die sich garnicht "physikalisch korrekt" verhalten, wenn man das Ding wa da drinnen "herumläuft" als Ball interpretiert. Deswegen steht dort auch immer "particle" oder "disc", das Wort "ball" kommt kein einziges mal vor.Die dort beschriebenen Modelle zu simulieren ist relativ einfach.
Eine "halbwegs realistische" Simulation eines Billard-Tisches ist dagegen weitaus komplizierter. z.B. gilt bei einem echten Billard-Spiel schonmal nicht "Einfallswinkel = Ausfallswinkel". Die Modelle die man braucht um ein echtes Billard-Spiel zu simulieren sind weitaus komplizierter als einfache Kollisionserkennung + simple Schulmathematik. Und auch die Parameter die man für diese Modelle braucht, damit das Verhalten wirklich dem entspricht was man von einem echten Billard-Tisch kennt bzw. dort beobachten kann, kann man sich nicht einfach so herleiten. z.B. spielt das Material der Banden und deren genaue Form eine Rolle, und es gibt auch keine einfachen Formeln wo man mal eben ein paar Winkel + Materialkonstanten einsetzen könnte, um an diese Parameter zu kommen.
Mit Standard C++ bin ich jetzt gegen 2 Wände gelaufen:
Wie schaffe ich es eine gekrümmte Form darzustellen und die dem User zu erlaubt diese zu verändern oder neu zu definieren? Und vor allem, wie stelle ich das graphisch da?Das hängt wohl sehr davon ab wie du diese Formen intern darstellen willst. Du könntest hier bloss diverse Grundformen verwenden wie Kreisbögen, Geraden, Parabeln etc., oder Dinge wie Splines, ...
Also Leute, wie würdet ihr an die Sache rangehen? Welche Grundkenntnisse muss ich mir aneignen um das Problem einigermaßen in Code zu fassen? Brauch ich dafür überhaupt ne Keule wie OpenGL oder reicht mir auch das, was QT und die STL mitbringt?
Erstmal solltest du wissen was du überhaupt genau machen willst. Dazu gehört z.B. auch zu wissen was der User genau können soll, also in welche Formen müssen mit dem Programm erstellbar sein etc.
Wenn du die Anforderungen kennst, kannst du weitermachen indem du dir ausdenkst wie dein Programm intern arbeiten sollte. Und wenn du das weisst kannst du dir überlegen wie du das "auf den Bildschirm bringst".
Eine Library wie OpenGL kann sehr hilfreich sein wenn man bestimmte Dinge darstellen will, speziell wenn es um "dreidimensionale Dinge" geht. Allerdings kann es genausogut sein dass OpenGL für deinen Fall "zu kompliziert" ist, und du mit einer einfacheren Bibliothek auskommst -- kann ich anhand deiner Beschreibung aber nicht beurteilen.
-
Wo liegt denn das Problem? Im Prinzip ist es noch recht simpel. Du schreibst dir eben ein Modelloader, lädtst dein Tisch und baust ein 2. Model, dass nur die Aktivitätszonen des Billardtisches bilden. Z.B. die Löcher. Ansonsten ne einfache Collision Detection für jede Kugel anlegen und wenn die Kugel mit dem 2. angelegten Model (die Löcher) kollidiert, versinkt die Kugel. Zu deinen Wellen hab ich mir nichts durchgelesen. Aber wenn du schon 5 Stunden nach sowas suchst, solltest du dir wirklich überlegen ob du diesem Projekt gewachsen bist.
Mfg.
way
-
hustbaer schrieb:
Du widersprichst dir hier selbst.
Der von dir verlinkte Artikel beschreibt Systeme (bzw. deren Simulationen) die sich garnicht "physikalisch korrekt" verhalten, wenn man das Ding wa da drinnen "herumläuft" als Ball interpretiert. Deswegen steht dort auch immer "particle" oder "disc", das Wort "ball" kommt kein einziges mal vor.Die dort beschriebenen Modelle zu simulieren ist relativ einfach.
Das hängt wohl sehr davon ab wie du diese Formen intern darstellen willst. Du könntest hier bloss diverse Grundformen verwenden wie Kreisbögen, Geraden, Parabeln etc., oder Dinge wie Splines, ...
Ok mein Fehler, war etwas holprig formuliert. Es geht hier wirklich nur um einen Partikel/disk ohne Reibung und Materialspezifische Eigenheiten. Das mit den Splines bzw Bezier-kurven hab ich mir auch schon mal überlegt, fand es aber etwas holprig damit eine Fläche zu definieren und wüsste nicht auf Anhieb, wie ich damit realistische Reflexion hinbekommen könnte.
Erstmal solltest du wissen was du überhaupt genau machen willst. Dazu gehört z.B. auch zu wissen was der User genau können soll, also in welche Formen müssen mit dem Programm erstellbar sein etc.
Wenn du die Anforderungen kennst, kannst du weitermachen indem du dir ausdenkst wie dein Programm intern arbeiten sollte. Und wenn du das weisst kannst du dir überlegen wie du das "auf den Bildschirm bringst".
Eine Library wie OpenGL kann sehr hilfreich sein wenn man bestimmte Dinge darstellen will, speziell wenn es um "dreidimensionale Dinge" geht. Allerdings kann es genausogut sein dass OpenGL für deinen Fall "zu kompliziert" ist, und du mit einer einfacheren Bibliothek auskommst -- kann ich anhand deiner Beschreibung aber nicht beurteilen.Genau darrüber wollte ich mir mal einen Überblick verschaffen,mit welchen Bibliothek was machbar wäre. Also konkret, schaffe ich es mit C++ Hausmitteln einigermaßen eine gekrümmte Begrenzung und Reflexionen an derselbigen darzustellen, oder geht das mit einer Bibliothek/Framework, die vielleicht schon eine Shape-Klasse mitbringen einfacher? Und Wenn ja, welche kommen in Frage? Ich kann im Moment eben noch schwer abschätzen was ich mit meinen jetzigen Fähigkeiten überhaupt umsetzten könnte, bzw welches Werkzeug für welche Zweck taugen würde.
@ way: es geht wirklich nur um Reflexion, aber eben an komplizierteren Formen wie einem Rechteck. Die Wellensimulation ist prinzipiell garnicht das Problem, ich bin nur am überlegen wie ich es graphisch darstellen und dem Benuzer die Möglichkeit geben kann über eine GUI einzugreifen.
Die Prinzipielle Frage ist, reicht mir C++/STL für die Berechnungen und ich mache NUR die Ausgabe mit OpenGL/Qt/wasweißich oder ist es einfacher alles in OpenGL-Anweißungen zu schreiben, wenn ich eh schon dabei bin?Ich hoffe ich bin nicht allzu aufdringlich blöd und ihr gebt mir mal ein paar Hinweiße, womit ich eventuell weiterkomme und welche Tutorials/Websites/Wikipediaartikel ich mir mal durchlesen sollte um ne grobe Ahnung zu bekommen.
Weiterhin danke für die Antworten!
-
Also ich kenne keine Engine die
- auf Genauigkeit getrimmt wäre und
- kompliziertere Formen unterstützt
Was natürlich nicht heisst dass es sowas nicht gibt (ich kenne in dem Bereich nicht gerade viel).
Ich persönlich würde die ganzen Berechnungen selbst programmieren, und dann zur Visualisierung das verwenden was "nötig" ist. Also entweder ein GUI Toolkit ala Qt, oder eben etwas "mächtigeres" wie OpenGL, wenn du das brauchst. Wenn die Simulation rein 2D ist, wirst du vermutlich mit einem GUI Toolkit auskommen.
BTW: OpenGL kann eigentlich nur "zeichnen", also das kannst du sowieso nicht wirklich verwenden um irgendwelche Kollisionen zu erkennen o.ä.
-
Die Prinzipielle Frage ist, reicht mir C++/STL für die Berechnungen und ich mache NUR die Ausgabe mit OpenGL/Qt/wasweißich oder ist es einfacher alles in OpenGL-Anweißungen zu schreiben, wenn ich eh schon dabei bin?
Vertust du dich eventuell? Die STL und SDL sind 2 völlig verschiedene Dinge. STL kannste immer in deinen C++-Projekten benutzen. Sogar in Kombination mit der SDL und OpenGL. Aber im Prinzip reicht auch nur C++ und OpenGL. Und wie hustbear schon gesagt hat, mehr als "zeichnen" kann OpenGL nicht. Also, es geht so, ja.
-
Wo schreibt er denn was von SDL?
So wie das dasteht wäre ich garnie auf die Idee gekommen er könnte was anderes als die "Standard C++ Library" (die oft fälschlicherweise STL gennant wird) meinen.
-
hustbaer schrieb:
Wo schreibt er denn was von SDL?
So wie das dasteht wäre ich garnie auf die Idee gekommen er könnte was anderes als die "Standard C++ Library" (die oft fälschlicherweise STL gennant wird) meinen.Genau die war auch gemeint
Tja dann werd ich mich mal drann machen die Berechnungen zusammenzubasteln und mal etwas tiefer in QT einzusteigen.
Danke nochmal für die Hilfe und falls noch jemanden was zum, Thema "Reflexion an gekrümmter Begrenzung" einfällt, Ideen sind weiterhin willkommen.
Mit weiteren Fragen nerv ich euch dann wenn ich zumindest schon etwas Code hab
-
Wenn Du etwas machen willst, dass sich in drei Dimensionen abspielt, würde ich Dir zu OpenGL raten. Geometrische Berechnungen und Echtzeitrendering im 3D Raum kannst Du natürlich auch selbst nachprogrammieren- aber bist Du Dir da ganz sicher?
Für die anderen Sachen ist "Rigid Body Animation" vielleicht ein Stichwort.
Hierdrin:
werden grundlegende Konzepte und Algorithmen dazu vorgestellt, ebenso feine Dinge wie z.B. das Erstellen von Ozeanwellen.
Schliesslich gibt es dazu in der ACM Library ne Menge Papers aus alten SIGGRAPH Vorträgen- ich habe die Namen nicht im Kopf, kann morgen aber mal nachsehen. Ein sehr interessanter Beitrag zu Ozeanwellen entstammt einem SIGGRAPH Kurs von 2005, irgendwas mit "Natural Phenomena"- google hilft Dir sicher weiter.
Ansonsten kannst Du mal bei Ron Fedkiw auf der Seite gucken, der hat immer irgendwas praktisches dabei: