Benötigen Sie einen Physikalgorithmus zur Modellierung des Deckenkollapses in einem voxelbasierten Spiel


7

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.


Ich würde sagen, dass es hier ein nicht triviales Gameplay-Problem gibt: Wenn Sie es mit einem runden Körper zu tun haben, können Würfel ihn nicht modellieren. Wenn Sie das versuchen, werden Sie feststellen, dass einige Strukturen, die an einem Ort perfekt funktionieren, an einem anderen zusammenbrechen. Oder dass Strukturen aus Gründen zusammenbrechen, die dem Spieler nicht ... vernünftig oder offensichtlich erscheinen. Beides wird nicht gut für dein Spiel sein.
Nicol Bolas

Antworten:


1

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


PS: Wenn Sie dies ohne Kalkül tun möchten, dann berauben Sie sich einer guten Entschuldigung für die Verwendung von Kalkül.
Seth Battin

PPS: Jetzt, wo ich darüber nachdenke, erlaubt ein Voxelspiel sowieso keine kontinuierliche Mathematik. Sie können jedoch die Gesamtspannung über eine Decke summieren, indem Sie die Anordnung der Blöcke durchlaufen.
Seth Battin

Meine ursprüngliche Idee war, ungefähr das zu tun; Berechnen Sie die Kraft auf jeden Block und verteilen Sie die Kräfte iterativ auf die Nachbarn. Allerdings haben nur Blöcke auf der Oberfläche Einträge in der Datenstruktur, und die Modellierung aller Blöcke auf der von mir gewünschten Skala wäre wahrscheinlich untragbar.
Sir_Lagsalot

Eine Möglichkeit, den Körper in Volumina zu zerlegen und dann die Berechnungen zwischen Volumina durchzuführen, könnte eine mögliche Lösung sein ... Die Frage wird dann, wie Volumina bestimmt werden.
Sir_Lagsalot

Ich denke, Sie könnten die CPU-Kosten bezahlen, solange Sie nicht versuchen, jeden Block jedes Frames neu zu berechnen. Sie können die Spannungsberechnungen für kleine Blockgruppen aggregieren, einen kleinen Bruchteil pro Frame. Dann könnten Sie den Gesamteffekt bestimmen. Ich glaube, das ist die Methode, die von den Zusammenbruchereignissen der Zwergenfestung angewendet wird.
Seth Battin

1

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:

  1. Für jeden angeschlossenen Nachbarn eine lineare Federkraft, die auf der Differenz zwischen der Verschiebung dieses Blocks und der Verschiebung seines Nachbarn basiert.
  2. Eine Gravitationskraft, skaliert nach der Gesamtmasse dieses Blocks und jedes Innenraums Blocks direkt über (entgegen der Schwerkraft) dieses Blocks (z. B. zählen, wie viele feste Voxel ein nach oben geworfener Strahl durchquert, bevor er auf eine obere Oberfläche trifft; wenden Sie eine "Kegel" -Korrektur an, wenn du fühlst dich schick).

(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.


0

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.


Ich bin meistens nur daran interessiert, wie ich (auf sehr hohem Niveau) bestimmen kann, wo Teile auf effiziente Weise brechen sollen. Es ist ein blockbasiertes Spiel, daher muss es nicht extrem genau sein.
Sir_Lagsalot
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.