feat(boids): add boids and particle life demo
Add linkLabel to AlgorithmEntry. The info panel shows it instead of "Wikipedia" when set, for links that are not Wikipedia. Tick the boids item in ROADMAP.md and add a Boids 3D item.
This commit is contained in:
1 parent
2224774e00
commit
108cea0491
22 files changed
+1701
-4
No files matched your search
+46
-1
@@ -710,6 +710,45 @@
|
||||
"ITEM_5": "Wind: feste Richtung (5, 0, 15) plus ein Sinus-Flattern aus Position und Zeit. Der Flatter-Anteil gibt zusätzlich leichten Auftrieb (y: Flattern · 2)."
|
||||
}
|
||||
},
|
||||
"BOIDS": {
|
||||
"TITLE": "Boids & Particle Life",
|
||||
"MODE_BOIDS": "Boids",
|
||||
"MODE_PARTICLE_LIFE": "Particle Life",
|
||||
"RESTART": "Neu starten",
|
||||
"REROLL_MATRIX": "Matrix neu würfeln",
|
||||
"AGENTS": "Agenten",
|
||||
"SEPARATION": "Separation",
|
||||
"ALIGNMENT": "Ausrichtung",
|
||||
"COHESION": "Kohäsion",
|
||||
"VIEW_RADIUS": "Sichtradius",
|
||||
"MAX_SPEED": "Max. Geschwindigkeit",
|
||||
"TYPES": "Typen",
|
||||
"INTERACTION_RADIUS": "Interaktionsradius",
|
||||
"FRICTION": "Reibung",
|
||||
"FORCE_SCALE": "Kraftfaktor",
|
||||
"PREDATOR_HINT": "Bewege die Maus über die Fläche: Die Boids fliehen davor. Die Farbe zeigt die Flugrichtung.",
|
||||
"EXPLANATION": {
|
||||
"TITLE": "Emergentes Verhalten aus lokalen Regeln",
|
||||
"BOIDS_TITLE": "Boids (Schwarmverhalten)",
|
||||
"BOIDS": "Jeder Boid folgt drei Regeln und sieht nur Nachbarn innerhalb seines Sichtradius: Separation (dränge deine Nachbarn nicht), Ausrichtung (fliege wie deine Nachbarn) und Kohäsion (bewege dich zur Mitte deiner Nachbarn). Kein Boid kennt den Schwarm. Trotzdem bilden sich Schwärme, teilen sich und vereinen sich wieder. Die Maus ist ein Fressfeind, vor dem die Boids fliehen.",
|
||||
"PARTICLE_LIFE_TITLE": "Particle Life",
|
||||
"PARTICLE_LIFE": "Partikel haben einen Typ, den man an der Farbe sieht. Eine Zufallsmatrix legt fest, wie stark Typ A von Typ B angezogen oder abgestoßen wird. Sehr nahe Partikel stoßen sich immer ab, damit sie nicht in einem Punkt zusammenfallen. Aus diesen einfachen Paarkräften entstehen Zellen, Ketten und kreisende Gruppen. Mit neu gewürfelter Matrix entsteht eine neue Welt.",
|
||||
"GPU_TITLE": "GPU-Parallelisierung",
|
||||
"GPU": "Jeder Agent braucht den Zustand aller anderen Agenten. Würde man die Agenten direkt im selben Puffer aktualisieren, läsen manche neue und manche alte Werte. Darum hat jedes Bild zwei Durchläufe: Zuerst wird der aktuelle Zustand kopiert, dann liest ein GPU-Thread pro Agent die Kopie und schreibt den neuen Zustand. 64 Threads bilden eine Workgroup.",
|
||||
"DISCLAIMER": "Vereinfachungen in dieser Demo:",
|
||||
"DISCLAIMER_1": "Jeder Agent prüft jeden anderen Agenten (O(N²)). Es gibt kein räumliches Gitter. Darum ist die GPU auf 8192 Agenten und der CPU-Pfad auf 1200 begrenzt.",
|
||||
"DISCLAIMER_2": "Die Welt ist ein Torus: Agenten, die einen Rand verlassen, kommen am gegenüberliegenden Rand wieder herein. Abstände werden auf dem kürzesten Weg gemessen.",
|
||||
"DISCLAIMER_3": "Die Kraftkonstanten sind nach Augenmaß eingestellt, nicht physikalisch. Die Reibung wirkt pro Bild, daher hängt das Aussehen leicht von der Bildrate ab."
|
||||
},
|
||||
"HOW_IT_WORKS": {
|
||||
"INTRO": "So läuft die Simulation, Schritt für Schritt:",
|
||||
"ITEM_1": "Datenlayout: Positionen liegen als vec4 [x, y, Typ, 0] und Geschwindigkeiten als vec4 [vx, vy, 0, 0] vor, 16 Byte pro Agent, damit die GPU ausgerichtete Blöcke liest.",
|
||||
"ITEM_2": "Jedes Bild führt zwei Compute-Dispatches aus: copy (aktuell nach vorher) und step (vorher lesen, aktuell schreiben). Das Rendering liest immer den aktuellen Puffer.",
|
||||
"ITEM_3": "Der Step-Kernel startet einen Thread pro Agent, 64 Threads pro Workgroup. Jeder Thread durchläuft alle Agenten, die Arbeit wächst also mit N².",
|
||||
"ITEM_4": "Die Welt läuft an den Rändern um (Torus). Abstände zu Nachbarn nutzen den kürzesten Weg, so können Schwärme über den Rand ziehen.",
|
||||
"ITEM_5": "Ohne WebGPU läuft dieselbe Mathematik auf der CPU in JavaScript, begrenzt auf 1200 Agenten. Der GPU-Pfad erlaubt bis zu 8192."
|
||||
}
|
||||
},
|
||||
"GPU": {
|
||||
"WEBGL_FALLBACK": "WebGPU ist nicht verfügbar. WebGL wird als Fallback verwendet. Die Leistung kann eingeschränkt sein.",
|
||||
"NOT_SUPPORTED": "Weder WebGPU noch WebGL konnten initialisiert werden. GPU-Visualisierungen sind nicht verfügbar."
|
||||
@@ -756,6 +795,10 @@
|
||||
"TITLE": "Stoffsimulation",
|
||||
"DESCRIPTION": "Stoffsimulation mit XPBD auf der GPU (WebGPU, Fallback WebGL + CPU)."
|
||||
},
|
||||
"BOIDS": {
|
||||
"TITLE": "Boids & Particle Life",
|
||||
"DESCRIPTION": "Schwarmverhalten und emergentes Verhalten aus lokalen Regeln, berechnet auf der GPU (WebGPU, Fallback WebGL + CPU)."
|
||||
},
|
||||
"NOTE": "HINWEIS",
|
||||
"GRID_HEIGHT": "Höhe",
|
||||
"GRID_WIDTH": "Breite",
|
||||
@@ -906,6 +949,8 @@
|
||||
"PARTICLES": "Partikel",
|
||||
"CONSTRAINTS": "Constraints",
|
||||
"PHASES": "Phasen",
|
||||
"SUBSTEPS": "Substeps pro Frame"
|
||||
"SUBSTEPS": "Substeps pro Frame",
|
||||
"AGENTS": "Agenten",
|
||||
"PAIR_CHECKS": "Paarprüfungen pro Bild"
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user