**Dies ist eine alte Version des Dokuments!**
Fluid Simulation
Umgang mit AI:
- Der Weg ist das Ziel!
- Challenge:
- Verwende keine AI für die Logik.
- Lasse dir von AI keinen Code schreiben.
- Verwende AI höchstens als Tutor, um dir Dinge zu erklären.
1. Fluid aus Teilchen (A)
Als Vorbereitung versuchen wir zuerst, ein 2D-Fluid aus vielen Teilchen zu simulieren, die sich gegenseitig stossen. Die Grundidee hinter diesem - physikalisch nicht sehr realistischen - Fluid ist wie folgt:
- Spawning: Erzeuge eine möglichst grosse Anzahl an Teilchen, alle mit identischem Radius und Masse. Visualisiert werden sie als kleine, einfarbige Kreise. Spawne diese z.B. an Zufallspositionen mit zufälligem Anfangsgeschwindigkeitsvektor.
- Collision Detection: Ermittle, welche Teilchen mit den Wänden und v.a. miteinander kollidieren, also aktuell überlappen. Für diesen Schritt werden wir verschiedene Möglichkeiten anschauen.
- Collision Handling: Kümmere dich um alle Teilchen, die aktuell gerade kollidieren. Zum Beispiel muss man dafür die neuen Geschwindigkeitsvektoren nach der Kollision berechnen. Für einen gewissen Realismus sollten die Teilchen bei jeder Kollision einen gewissen Anteil ihrer Energie oder Geschwindigkeit verlieren.
Auftrag A - Teil I
- Erstelle ein GitHub-Repo für alle Projekte in diesem Modul. Nenne es z.B.
FluidSimulationsUnityund wähle die passenden Einstellungen (private, gitignore-File). Clone es auf deinen Computer. Arbeite von nun an darin. Add, commit, push selbständig und regelmässig.
- Installiere Unity-Hub und darin eine aktuelle Unity-Version.
- Erstelle nun ein neues Unity Projekt vom Typ Core: Universal 2D (z.B.
FluidParticles).
- Implementiere nun das Template-Projekt (siehe unten), welche als Ausgangslage dient. Wird das Projekt ausgeführt, sollte ein farbiges Teilchen erscheinen, welches sich nach oben bewegt. Studiere den Code genau und stelle sicher, dass du diesen verstehst.
- Passe den Code nun so an, dass eine grössere Anzahl Teilchen (sagen wir ca. $100$) erzeugt werden. Diese sollen an Zufallspositionen gespawned werden. Dafür werden zwei Arrays benötigt: Eines für die ParticleModels und eines für die ParticleViews.
- Implementiere eine erste Dynamik:
- Jedes Particle soll eine zufällige Anfangsgeschwindigkeit haben (versch. Richtungen und Speed) und sich entsprechend bewegen.
- An den Wänden sollen sie ohne Energieverlust reflektiert werden.
- Kollisionen zwischen Teilchen werden noch ignoriert, sie bewegen sich also einfach durch einander hindurch.
- Collision Detection V1:
- Implementiere nun eine erste Version der Collision Detection: Iteriere über alle Teilchen. Iteriere für jedes Teilchen über alle anderen Teilchen und schaue, ob sie kollidieren. Dafür benötigst du also zwei ineinander verschachtelte Schleifen.
- Zwei Teilchen kollidieren dann, wenn deren Abstand kleiner ist als $2\times$ der Radius. Alle Teilchen sollen, während sie miteinander kollidieren, eine andere Farbe annehmen. Siehe Tipps unten.
- Für wie viele Teilchen kannst du deine Simulation flüssig laufen lassen? Warum geht nicht mehr? Was ist das Problem mit dieser Art von Collision Detection?
Unity Tipps
Template-Projekt
- Neues 2D Unity-Projekt vom Type Core: Universal 2D
- Erstelle unter Assets folgende Unterordner für saubere Struktur: Prefabs, Scripts. Ziehe dann später alle Scripts und Prefabs in den entsprechenden Ordner.
- Erstelle ein neues, leeres GameObject z.B. mit Namen
Simulation. Hänge diesem das ScriptMainScript(siehe unten) an. Alternativ könnte man das Scipt auch derMainCameraanhängen.
- Füge die Scripts
Particle.csundParticleView.csan. Die Idee ist, dass unser Code einer Trennung von Modell (Particle) und Anzeige (ParticleView.cs) folgt.
- Particle Prefab:
- Erstelle in der Hierarchy eine farbige Kugel (2D Objects / Sprites / Circle), Farbe aussuchen.
- Gib Namen
Particle. - Hänge
ParticleViewScript an. - Speichere als Prefab: Einfach aus Hierarchy in Prefab-Ordner ziehen.
- Lösche wieder aus Hierarchy.
- Der Code sollte nun wie folgt funktionieren: Führt man den Code aus, so erschein in der Mitte des Bildschirms ein farbige Kugel, die sich nach oben bewegt.
Farbe von Kugel ändern
- Greife auf SpriteRenderer von
particleView-Objekt zu und ändere seine Farbe:var spriteRenderer = particleView.GetComponent<SpriteRenderer>(); spriteRenderer.color = Color.blue;
- Tipp 1: Damit man nicht für jedes Frame für jede particleView den
GetComponent()-Befehl wiederholt aufrufen muss, lohnt es sich, ein ArrayparticleRendererszu erstellen, in dem man die spriteRenderer für die entsprechenden Particles speichert. \\
- Tipp 2: Passe gegebenenfalls den Code so an, dass die Farbzuweisung
... = Color.bluenur dann ausgeführt wird, wenn sich die Farbe des Teilchens auch ändert. Verwende dazu z.B. ein Flag (bool)changeColor.
Grösse von GameObject im Code ändern
someGameObject.transform.localScale = Vector3.one * 0.1f;
Zufallszahlen
UnityEngine.Random.InitState(42); // Zufallszahlen mit Seed (immer gleicher 'Zufall') UnityEngine.Random.Range(0,10);