Kurze frage zu einem Spielprogramier problem

Cool012345

Kabelverknoter(in)
Die frage geht zu einer Physik-Engine

Hallo,

ich hoffe, dass ich hier richtig bin. Mein Bruder arbeitet aktuell an einer Physik-Engine, jedoch wurde er in einem anderem Forum recht stark runter gemacht, so das er nochmal von vorne anfängt und auch verunsichert wurde.

Ich habe mir deshalb einmal seinen Grundaufbau „gemopst“ und frage euch nun, ob dieser ausreicht, oder ob noch etwas fehlt:

Aufbau der Physik-Engine:

1. User-Interface über die Klasse „phy“
2. 1. Objekt-Klasse für bewegliche Objekte „mobject“
3. 2. Objekt-Klasse für unbewegliche Objekte „sobject“
4. 1. Rechen-Klasse für grundlegende Berechnungen „basic“
5. 2. Rechen-Klasse für komplexe Berechnungen „extended“
6. 1. Kollisions-Klasse für grobe Kollisionsberechnungen „collision“
7. 2. Kollisions-Klasse für genaue Kollisionsberechnungen „hits“
8. 1. Kräfte-Klasse für globale Kräfte „global“
9. 2. Kräfte-Klasse für Objektkräfte „potency“
10. 3. Kräfte-Klasse für Reibungen „friction“
11. 4. Kräfte-Klasse für Rotationen und Impulserhaltung „momentum“

Freue mich auf antworten

Grüße
Cool012345 :cool:
 
Naja ich frage mich was man da groß schlecht machen kann? Wie wärs wenn du mit einem Klassendiagramm mit richtigen Beziehungen wieder kommst? So ist das erstmal schön und gut aber wenig hilfreich.

Wenn überhaupt würde ich die Interfaces schon treffend beschreiben. Welche Sprache willst du verwenden?
 
Ich Programmiere nicht das ist von meinem Bruder er weis davon nichts ich werde ihn aber jetzt in kenntnis setzen da ich nicht weis welche Sprache er verwendet.
 
Eins vorweg: Ich nehme mal an Ihr plant eine 2D-Engine. Von 3D würde ich ohne weitere Fragen abraten.

Wichtig ist, dass ihr einen genauen Plan habt. Ein Klassendiagramm ist dabei hilreich. Es muss nicht UML sein - aber so, dass man die Zusammenhänge sieht.
Dann müsst ihr wissen wie eure Implementierung aussehen soll.
Über solche Dinge solltet ihr euch (erfolgreich) Gedanken gemacht haben:
Sind die physikalischen in allen Kombinationen Zusammenhänge klar?
Könnt ihr die auftretenden mathematischen Probleme effizent lösen?
Welche Algorithmen und Datenstrukturen sollen dabei verwendet werden?

Du musst das nicht alles hier beantworten - es reicht wenn ihr wisst, wie ihr es angehen wollt.

Interessant wäre es sicherlich auch die Implementierung anderer Physikengines anzusehen. Ein Kandidat dafür wäre Box2D.
 
Erstmal guten Abend,

für mich steht fest, eine 3D engine zu machen. Ich habe mir schon die Netown Dinamics angesehen.

Die Programmiersprache ist C++
An ein Klassen diagramm habe ich auch schon gedacht, jedoch habe ich außer einer Javer executable nur kostenpflichtige oder schrott Programme gefunden.
Könnt ihr eines empfehlen?

Bitte kommt mir jetzt nicht "eine Physikengine ist eine sehr komplexe Angelegenhiet" oder "das ich nicht in ein paar Wochen zu machen"
Das ist mir nämlich durchaus bewusst, ich interessiere mich sehr für Physik und Mathematik, so dass ich versuche über die Engine auch die Programmierung mit einfließen zu lassen und so mein Wissen und das Verständniss von der Matherie zu verbessern.

Ich rechne mit einer gesamt Zeit von ca. 1,5 - 3 Jahren. (Je nachdem, wie viel Zeit ich investiere und wie schnell ich Probleme gelöst bekomme)
Eine Funktion zum Wurzelziehen, um die Hypotenuse zu berechnen ist bereits fertig. (z.B. wichtig um Rotationen zu berechnen)

Ich hoffe hier die ein oder andere Antwort auf noch offene Fragen zu bekommen, da mein Bruder (cool012345) fast keine Ahnung vom Programmiern hat.
 
Letztendlich besteht ein Klassendiagramm doch nur aus kästen und pfeilen. Das sollte Word oder dessen kostenloses Linux Pendant alle mal hinbekommen. Ich verstehe nur nicht was deine Frage ist?
Natürlich wünsch ich dir viel Erfolg, bezweifele allerdings das das Erfolg haben wird.
 
Ich konnte aus dem Eröffnungspost ein paar Sachen noch nicht so ganz herauslesen:

Soll die Engine die Objekte am Ende grafisch darstellen, oder soll das ganze erstmal nur auf Textbasis laufen ?
Bisher stelle ich mir das ganze bildlich so ähnlich wie diesen bekannten Seifenblasen-Bildschirmschoner vor, bei dem die Seifenblasen über den Bildschirm gleiten und voneinander abprallen.

Ist es für dich wichtig, dass die Engine wissenschaftlich korrekt und effizient arbeitet oder geht es hauptsächlich darum, dir Programmieren/Mathe/Physik beizubringen und dass das Ergebnis halbwegs vernünftig aussieht ?

Dann solltest du dir möglichst früh klarmachen, was die Engine können soll und was nicht.
 
Ich weiß, jedoch ist es z.B. mit dem Programm (weiß gerade nicht wie es heißt), welches in der Schule genutzt wird einfacher, als mit Word oder änlichem.

Eine Frage ist z.B. ob es besser ist so viele Berechnungen pro Sekunde zu machen wie möglich, oder gerade bei Spielen eine Obergrenze zu setzen?

Zumal ich nicht bei Null anfange, ich beschäftige mich bereits seit Jahren mit physiklischen Ereignissen, so das es nicht all zu schwer sein sollte, dieses auch in einer Funktion zu beschreiben.

In ein paar Jahren kann man einiges auf die Beine stellen. ;)

@Brehministrator
Ja, es gibt eine Funktion in der math.h jedoch nur für Quadratwurzeln.

@Laudian

Es soll eine reine Physik-engine werden, also ohne Grafiken (jedoch durch eine Grafik-engine natürlich ergänzbar)

Für mich ist die effizent sehr wichtig, weshalb ich fast alle Funktionen selbst schreibe und mich nur an den nötigsten Headern bediene.
Die Genauigkeit der Berechnungen soll so gut wie möglich sein, jedoch werde ich wohl durch Hardwareeinschränkungen bei der Genauigkeit abstriche machen müssen. :(
 
Zuletzt bearbeitet:
Vielleicht solltest du erstmal eine 3D Welt mit einer fixen Kamera erstellen. Dann kann man sich über so etwas wie Physik Gedanken machen...

Edit:

Generell gibt es erst-mal ein Main Thread. Das Thread das faktisch in einer "Endlosschelife" Events prüft, Berechnen macht etc... Man errechnet aus dieser Gameloop auch seine FPS nämlich wenn diese einmal durchgelaufen ist wird ein Frame berechnet und Ausgegeben. Danach richten sich also auch deine Phsysikberechnungen später
 
Zuletzt bearbeitet:
für mich steht fest, eine 3D engine zu machen. Ich habe mir schon die Netown Dinamics angesehen.
Ok. Das ist abitioniert, aber du scheinst die nötige Motivation zu haben.
Für den Anfang würde ich zum Üben aber trotzdem erstmal mit 2D Experimentieren.

Die Programmiersprache ist C++
:daumen:

An ein Klassen diagramm habe ich auch schon gedacht, jedoch habe ich außer einer Javer executable nur kostenpflichtige oder schrott Programme gefunden.
Könnt ihr eines empfehlen?
Stift und Papier? Ansonsten kann man z.B. auch auf https://www.lucidchart.com schöne Diragramme erstellen. Es muss ja nicht immer gleich UML sein, solange der Plan dabei klar wird.

Bitte kommt mir jetzt nicht "eine Physikengine ist eine sehr komplexe Angelegenhiet" oder "das ich nicht in ein paar Wochen zu machen"
Das ist mir nämlich durchaus bewusst, ich interessiere mich sehr für Physik und Mathematik, so dass ich versuche über die Engine auch die Programmierung mit einfließen zu lassen und so mein Wissen und das Verständniss von der Matherie zu verbessern.
Zum Einen: Eine Physikengine ist keine komplexe Angelegenheit und das ist nicht in ein paar Wachen zu machen.
Zum Anderen: Wenn du die Motivation und das Wissen hast, dann mach es. Sei aber nicht enttäuscht, wenn die erste Version ständig abstürzt und die Berechnungen total behämmert sind. Sowas ist bei einem Lernprozess volkommen normal.

Ich rechne mit einer gesamt Zeit von ca. 1,5 - 3 Jahren. (Je nachdem, wie viel Zeit ich investiere und wie schnell ich Probleme gelöst bekomme)
Du solltest zuerst die Probleme angehen und dich nicht auf die einfachen Teile stürzen. Sonst schiebst du die schweren Probleme vor dir her.
Du solltest Spaß daran haben mathematische Probleme zu lösen.

Eine Funktion zum Wurzelziehen, um die Hypotenuse zu berechnen ist bereits fertig. (z.B. wichtig um Rotationen zu berechnen)
Entschuldige, aber gerade zweifle ich an deinen Fähigkeiten. Zum Wurzelziehen braucht man in C++ keine besondere Funktion (sqrt und pow erledigen das bereits) und die Hypotenuse zu berechnen ist ja auch keine Kunst mit dem trigonometischen Pythagoras. Das ist zwar schonmal ein Anfang, aber die Probleme werden komplizierter werden als das.

Solltest du die Wurzel und solche Dinge wegen der Effizenz selbst implementieren wollen ist das zwar löblich und zum Lernen auch durchaus sinnvoll, aber ob du es besser hinbekommst als die Profis, die den C++ Standart implementiert habe bezweifle ich.

Ich hoffe hier die ein oder andere Antwort auf noch offene Fragen zu bekommen, da mein Bruder (cool012345) fast keine Ahnung vom Programmiern hat.
Was wären dann da für offene Fragen?
 
Das weiß ich bereits und das ist auch logisch, meine Frage ist jedoch ob ich für die Frames die Möglichkeit ein Maximum zu setzen geben soll, um Framerate einstürze zu verringern.
Und somit für ein flüssigeres Game zu sorgen. :)

Bei Simulationen ist ein Begrenzung jedoch absolut sinnlos. ;)

@SimonG
Ich werde mir deine Ratschläge zu Herzen nehmen.

Da eine Wurzel nicht immer und immer wieder gezogen werden muss, habe ich eine eigene Funktion geschrieben, um ein Möglichst genaues Ergebnis zu bekommen.
Hier steht float gegen long Double. :)
 
Zuletzt bearbeitet:
Das weiß ich bereits und das ist auch logisch, meine Frage ist jedoch ob ich für die Frames die Möglichkeit ein Maximum zu setzen geben soll, um Framerate einstürze zu verringern.
Und somit für ein flüssigeres Game zu sorgen. :)

Bei Simulationen ist ein Begrenzung jedoch absolut sinnlos. ;)

Normalerweise läuft das (glaube ich) so. Das Spiel überträgt der Physikengine in jedem Duchlauf des Mainloop einmal die Kontrolle. Dann liefert die Physikengine ihre Ergebnisse und diese werden dann auf die Spielwelt angewendet. Es wird also immer nur auf Anfrage ein Schritt berechnet. Wie groß dieser Schritt ist hängt davon ab wie schnell (oder langsam) der Mainloop vom Spiel läuft. Das wäre zumindest mein (single Thread) Ansatz.
 
Wie groß dieser Schritt ist hängt davon ab wie schnell (oder langsam) der Mainloop vom Spiel läuft. Das wäre zumindest mein (single Thread) Ansatz.

Das ist gut, dass du es Erwähnst, da es bei der Bewegungsberechnung zwei Ansätze gibt.
1. Das schnellste Objekt hat eine Geschwindigkeit von "1" dadruch werden Springende Grafiken verringert, jedoch auch die gesamte Geschwindigkeit herunter gesetzt, da die anderen Geschwindigkeiten relativ zur schnellsten herab gesetzt werden müssten.
2. Einen festen Zeitsprung, so können auch schnelle Bewegungen gut berechnet werden, jedoch gibt es dann acuh einige Springer, da nicht zu jedem Zeitpunkt die Position bekannt ist.

Ich werde wohl über mindestnes 3 Threads gehen. (Dafür binde ich auch einen Header ein, der nicht zu mir gehört sondern zum Qt Repertoire)


@bingo88

Der Vorteil einer guten Engine ist, dass sie sich sowol in Spiele als auch in Simulationen intigrieren lässt.
Ich werde je nach Verwendungszweck Einstellungsparameter setzten lassen, um z.B. Berechnungen früher zu Runden usw.


Bei dem Vorgänger, habe ich mithilfe von drei for-schleifen zunächst 500000 Objekte (Quader) erstellt, um sie danach sofort wieder zu löschen. (keine Grafische ausgabe oder ähnliches)
Der Thread des Programmes hat dabei 394,5 MiB vom RAM genutzt, ist dass gut, oder zu viel?
 
Zuletzt bearbeitet:
@bingo88

Der Vorteil einer guten Engine ist, dass sie sich sowol in Spiele als auch in Simulationen intigrieren lässt.
Ich werde je nach Verwendungszweck Einstellungsparameter setzten lassen, um z.B. Berechnungen früher zu Runden usw.
Hmmm. Ich sag mal so, bei Spielen kommt es so dermaßen auf Performance an, dass man teilweise ungenaue Rechenfunktionen als Compilerflag aktiviert.

Bei dem Vorgänger, habe ich mithilfe von drei for-schleifen zunächst 500000 Objekte (Quader) erstellt, um sie danach sofort wieder zu löschen. (keine Grafische ausgabe oder ähnliches)
Der Thread des Programmes hat dabei 394,5 MiB vom RAM genutzt, ist dass gut, oder zu viel?
Um das beurteilen zu können, musst du uns schon mitteilen wie die Quader definiert sind (4 3D-Vektoren? Sonstige Daten, z. B. Material, Textur?).

Wenn ich mal von 3D Vektoren mit DP ausgehe, habe ich pro Vektor 3 * 8 Byte = 24 Byte. 1 Quader = 4 Vektoren = 4 * 24 Byte = 96 Byte. Macht bei 500.000 Objekten etwa 46 MB.
 
Zuletzt bearbeitet:
Ja, es gibt eine Funktion in der math.h jedoch nur für Quadratwurzeln.
Beliebige Wurzeln zieht man mit der "pow()"-Funktion zum Potenzieren (ebenfalls in der "math.h" enthalten), da "n-te Wurzel" identisch ist zu "hoch 1/n" :)

Ein Beispiel: Die 7-te Wurzel einer Zahl x erhalte ich in C++ mit "pow(x, 1/7.0)".

Das kannst du ja benutzen, um die Genauigkeit deiner eigenen Implementierung mal zu testen. Mich würde auch interessieren, welchen Algorithmus du zur Berechnung von Wurzeln benutzt. Das ist nämlich nicht gerade einfach, das genau und vor allem numerisch stabil (für alle Eingabewerte von klein bis groß) hinzukriegen.
 
Das waren nur Quader, die mithilfe eines std::vektors von der Klasse unbewegliches Objekt waren.
Mit allen nötigen Variablen um damit theoretisch zu rechnen. Die Quader waren nur logisch vorhanden (X, Y, Z Länge definiert, um die Eckpunkte zu berechnen, um Kollisionsberechnungen vor zu bereiten, da alles was sich zwischen diesem Punkten defindet nunmal mit dem Quader kollidieren würde), jedoch fanden keine Interaktionen statt, bzw. wurden dabei Texturen geladen.

Ja, dass es bei Spielen auf die Performance ankommt, habe ich bedacht, so würde z.B. die Luftreibung bei Geschossen in z.B. Shootern nicht oder nur ungenau einbezogen werden.

Ich nutze eine Form des Heronverfahrens (hoffe es heißt so :S ) um relativ schnell eine gute Genauigkeit zu erlangen.
Wird die Quadratzahl kleiner als 1, verringert sich auch der Startwert der Annäherung. (Aktuell ist die kleinste Möglcihe Quadratzahl aus der ich die Wurzel berechnen kann 0,0001) das sollte für die meisten Berechnungen reichen.
 
Zuletzt bearbeitet:
Zurück