Ich suche nach Algorithmen, wie man die Physik von Einstürzen / Zusammenbrüchen für eine Spielidee modelliert, an der ich arbeite. Das Spiel ermöglicht es dem Spieler, 3D-Voxel-basierte Asteroiden ausgiebig abzubauen, und ich möchte, dass Bereiche, die nicht ausreichend unterstützt werden, unter ihrem eigenen Gewicht zusammenbrechen. Um das Problem noch schwieriger zu machen, ist die Schwerkraft ungleichmäßig (die Richtung, in die sie zieht, hängt davon ab, wo sich ein bestimmtes Voxel im Verhältnis zum Massenmittelpunkt des Asteroiden befindet), und die Anzahl der Voxel im Asteroiden ist zu groß, um modelliert zu werden sie alle einzeln (ich benutze einen spärlichen Voxeloktree, um den Asteroiden zu modellieren).
Hoffentlich kann jemand Links zu Artikeln bereitstellen, in denen geeignete Algorithmen erörtert werden, oder Ideen zur Lösung des Problems bereitstellen. Wenn Sie weitere Informationen benötigen, fragen Sie bitte.
Bearbeiten 1: Es muss nicht sehr genau sein, ich suche nach etwas, das eine vernünftige Annäherung für ein Spiel im Stil von Minecraft oder Dwarf Fortress wäre. Ich bin hauptsächlich daran interessiert zu bestimmen, wo Abschnitte abbrechen sollen, wenn Blöcke hinzugefügt oder entfernt werden. Das Verschieben der Körper nach dem Brechen ist nicht Teil dieses Problems.
Bearbeiten 2: Meine ursprüngliche Idee war es, die Kraft auf jeden Block zu berechnen und dann die Kräfte iterativ unter den Nachbarn zu verteilen. Dies würde jedoch einen Eintrag für jeden Block erfordern, während nur Blöcke auf der Oberfläche Einträge in der Datenstruktur haben. Das Modellieren aller Blöcke auf der von mir gewünschten Skala wäre wahrscheinlich unerschwinglich - ich hätte gerne Körper mit mindestens 10.000.000 Voxeln, von denen 200.000 an der Oberfläche sind und gelagert werden müssen.
Antworten:
Sie treffen eine künstlerische Entscheidung; Das ist der richtige Weg, um es anzugehen. Sie haben ein nicht realistisches Medium, also wählen Sie aus, welche Physik Sie ohnehin anwenden möchten.
Diese Übung ist jedoch nicht schwierig. Bauingenieure wählen aus, welche Art von Physik ihnen wichtig genug ist, um sie in ihre Berechnung einzubeziehen, ob eine Decke einstürzt oder nicht.
Sie könnten wahrscheinlich genug Mathematik herausfinden, indem Sie die eindimensionale Strahlspannung in zwei Dimensionen extrapolieren. Dort können Sie feststellen, wo die Spannung die Schergrenze überschreitet. Ich meine nicht, dass dieser Link smarmy ist, es ist nur eine gute Google-Abfrage für Sie: http://lmgtfy.com/?q=beam+stress
quelle
Sie stellen fest, dass Sie nur Blöcke darstellen, die sich auf der Oberfläche befinden - ich gehe davon aus, dass dies auch Decken umfasst. Wir können jedoch davon ausgehen, dass innere Dinge gut unterstützt werden, dh nicht selbst die Quelle eines Zusammenbruchs sind, und dass sie daher nicht berücksichtigt werden müssen!
Hier ist meine Idee für ein Modell - ich habe es nicht getestet und ich bin sicher, dass ein Statiker viel zu kritisieren finden könnte. Es ist so konzipiert, dass es effizient ist und nur wenige Daten verwendet. Es hat jedoch den Nachteil, dass es keine horizontalen Kräfte darstellt (sodass eine Säule niemals knickt).
Speichern Sie für jeden Oberflächenblock eine Zahl (keinen Vektor), die ich als "Verschiebung" bezeichne. Dies stellt die infinitesimale Verschiebung von einem unbelasteten Zustand derselben Struktur nach unten dar. Es ist nur zum Verwalten von Brüchen gedacht und muss nicht grafisch dargestellt werden.
Wenn ein Block gestört wird, aktualisieren Sie diese Werte iterativ (dh aktualisieren Sie die Nachbarn und ihre Nachbarn, bis sich die Werte nicht mehr stark ändern), und wenden Sie dabei zwei Arten von "Kräften" an:
(Beachten Sie, dass diese nicht aktuell sind Kräfte sind , da dieses Modell keine Geschwindigkeit enthält. Wenn ich nicht verwirrt bin, sollte dies grundsätzlich so funktionieren, als ob das System extrem gedämpft ist.)
Wenn der Unterschied in den Verschiebungswerten zwischen zwei Nachbarn größer als ein Schwellenwert wird, betrachten Sie sie als auseinandergebrochen - und beeinflussen sich nicht mehr gegenseitig. (Abhängig vom Material sollte der Schwellenwert wahrscheinlich relativ zur Schwerkraftrichtung sein. Beispielsweise werden Nachbarn, die (meistens) vertikal ausgerichtet sind, wenn der obere Block eine höhere Verschiebung aufweist, unter Druck gesetzt, während der untere Block unter Druck steht hat eine höhere Verschiebung, das heißt Spannung.)
Wenn die Verschiebung einer Gruppe von Blöcken ständig zunimmt, wird diese Gruppe nicht unterstützt und sollte tatsächlich sichtbar abfallen, was ich unabhängig von diesem System mit einer regulären Physik-Engine (oder einer Bewegung benachbarter Voxel) empfehlen kann. Ich überlasse es Ihnen, herauszufinden, wie Sie diese vollständige Gruppe erkennen können.
quelle
Komplexe physikalische Simulationen, die auf anderen Situationen als hier auf der Erde basieren, erfordern in der Regel spezielle Implementierungen. Viele Physiksimulationen können aufgrund von Schätzungen und Annahmen, die über den Kontext getroffen werden, in dem sie simuliert werden, effizient durchgeführt werden. Wenn Sie nicht das gesamte Physik-Framework selbst schreiben, sollten Sie in Betracht ziehen, etwas wie PhysX oder Bullet to zu verwenden Bieten Sie eine Starrkörpersimulation an, und mit der geschickten Verwendung von Einschränkungen und Einschränkungen können Sie die gewünschte Illusion erzeugen. Die Art der Situation, auf die Sie sich beziehen, können Sie jedoch nicht einfach durch die Implementierung eines einzelnen Algorithmus erreichen, sondern es handelt sich um eine größere Sammlung physikalischer Prinzipien, die zusammenarbeiten.
quelle