Diplomarbeit Echtzeit-Simulation eines wassergefüllten Ballons mit Feder–Masse–Dämpfer-Systemen eingereicht bei Prof. Dr-Ing. Detlef Krömker, Professur für Graphische Datenverarbeitung von Daniel Groh ([email protected]) Eingereicht am 16. November 2006 Fachbe re ich 12 Informatik und Mathe matik Institut für Informatik Betreuung durch Dr. Tobias Breiner Dieses Dokument ist online Verfügbar unter http://www.cap23.de/uni/siwaba.pdf Eidesstattliche Erklärung Ich erkläre hiermit an Eides Statt, dass ich die vorliegende Arbeit selbstständig und ohne Benutzung anderer als der angegebenen Hilfsmittel angefertigt habe; die aus fremden Quellen direkt oder indirekt übernommenen Gedanken sind als solche kenntlich gemacht. Die Arbeit wurde bisher in gleicher oder ähnlicher Form keiner anderen Prüfungskommission vorgelegt und auch nicht veröffentlicht. Frankfurt am Main, den 16. November 2006 _________________________ (Daniel Groh) ii Zusammenfassung In dieser Diplomarbeit wird ein Echtzeit-Verfahren vorgestellt, um einen wassergefüllten Ballon zu simulieren. Grundlage des Verfahrens ist ein FederMasse-Dämpfer–System, das zusammen mit Methoden zur Erhaltung des Innenvolumens sowie einer topologieerhaltenden Datenstruktur kombiniert wurde. Die Masse des Wassers wird dabei auf Massepartikel an der Oberfläche des Gummiballons aufgeteilt, an denen die Wirkung der physikalischen Kräfte Gravitation, Innendruck und elastische Zugkraft der Oberfläche ausgewertet wird. Dies erfolgt durch iterative Anwendung eines Simulationsschrittes, bei dem die auf die Massepartikel wirkenden Beschleunigungen ermittelt und in eine Bewegung übertragen wird. Bei der Umsetzung in C++ wurde das Verfahren mit Hilfe des Echtzeit-3D-Szenengraphen OGRE (Object-oriented Graphics Rendering Engine) implementiert. Mögliche Einsatzgebiete sind interaktive Simulationsumgebungen oder andere Echtzeit-Anwendungen in den Bereichen Multimedia und Unterhaltung sowie Nicht-Echtzeit-Verfahren zur Bildgenerierung und physikalischen Simulation. Abstract This thesis introduces a method to simulate a water-filled balloon. This is accomplished by using a Spring–Mass–Damper-System, which was combined together with methods for sustaining the interior volume as well as a topologyconserving data structure. For this purpose the mass of the water is split to mass particles on the surface of the rubber ballon, at which the effect of the physical forces gravitation, internal pressure and elastic traction of the surface are evaluated. This is done by applying an iterative simulation step, which determines a mass particles acceleration and transforms it into movement. The method was implemented in C++ using the realtime-scenegraph OGRE (Object-oriented Graphics Rendering Engine). Possible applications are interactive simulation environments or other real-time applications such as in multimedia and entertainment as well as non-realtime procedures in the field of digital image generation and physical simulations. iii Danksagung Ich danke allen, die mich in meiner Arbeit unterstützt und gefördert haben, insbesondere Dr. Tobias Breiner für seine Betreuung sowie meinen Prüfern Prof. Dr.-Ing. Detlef Krömker und Prof. Dr.-Ing. Lars Hedrich für die aufgebrachte Zeit. Zudem danke ich allen, die mit ihrer Energie und Kreativität helfen, die Entwicklung von OpenSource-Projekten voranzutreiben. Dank ihnen war ich in der Lage, meine Arbeit ganz auf der Basis freier Software zu erstellen. Nicht zuletzt danke ich meiner Lebensgefährtin Kirsten Schreiber für ihre Korrekturlesungen und anhaltenden Ermutigungen zu verstärktem Arbeitseifer in kritischen Phasen sowie meinen Eltern Werner und Margitta Groh für ihre fortwährende Unterstützung während meines Studiums. Acknowledgment I want to thank all who helped and supported me in my work, in particular Dr. Tobias Breiner for supervising me as well as my examiners Prof. Dr.-Ing. Detlef Krömker and Prof. Dr.-Ing. Lars Hedrich for their spent time. Besides, I want to thank all those people, who help with their energy and creativity to advance the development of OpenSource projects. I owe them the ability of using free software as a base for mastering my work. Last but not least I thank my friend and fellow Kirsten Schreiber for her services as proof-reader and her continuous encouragements to intensify my effords in critical phases as well as my parents Werner and Margitta Groh for their continual support during my study. iv Inhaltsverzeichnis 1 Einleitung....................................................................................................1 2 Grundlagen..................................................................................................3 2.1 Geometrische Grundlagen......................................................................... 4 2.1.1 Polygonale Geometrierepräsentation........................................................... 4 2.1.2 Geometrische Körper aus der Mathematik.................................................. 5 2.2 Volumenberechnung mit dem Gaußschen Integralsatz........................ 8 2.3 Feder–Masse–Dämpfer-Systeme............................................................. 11 2.3.1 Harmonische Schwingungen und das Hookesche Gesetz.......................... 11 2.3.2 Feder–Masse-Systeme................................................................................ 12 2.3.3 Feder–Masse-System mit Dämpfer ............................................................ 14 2.4 Anwendungen........................................................................................... 17 2.4.1 Feder–Masse–Dämpfer-Systeme in der Elektrotechnik.............................. 17 2.4.2 Muskeldeformation mit Feder–Masse-Systemen....................................... 18 2.4.3 Wasseroberfläche und Stoff mit Feder–Masse-Systemen........................... 21 3 Entwurf......................................................................................................23 3.1 Anforderungsanalyse................................................................................ 24 3.2 Die verwendeten Geometriemodelle..................................................... 26 3.3 Einbettung der physikalischen Simulation........................................... 3.3.1 Anbindung an das Geometriemodell......................................................... 3.3.2 Simulation der auftretenden Kräfte........................................................... 3.3.3 Reaktion mit der Simulationsumgebung................................................... 3.4 Die physikalischen Kräfte........................................................................ 3.4.1 Notation der Kräfte.................................................................................... 3.4.2 Gravitation................................................................................................. 3.4.3 Dämpfung.................................................................................................. 3.4.4 Oberflächenspannung................................................................................ 3.4.5 Innendruck................................................................................................ 3.5 Eine Topologische Datenstruktur........................................................... 3.5.1 Aufbau....................................................................................................... 3.5.2 Die Operation Face-Split............................................................................ 27 27 28 31 33 33 33 33 35 36 39 39 40 v 4 Umsetzung.................................................................................................42 4.1 Der 3D-Szenengraph OGRE..................................................................... 43 4.2 Objektstruktur........................................................................................... 44 4.2.1 Allgemeiner Programmaufbau................................................................... 44 4.2.2 Geometriemodelle...................................................................................... 45 4.2.3 Datenstrukturen für Topologie und physikalische Kräfte.......................... 46 4.3 Nebeneffekte des Simulationsverfahrens.............................................. 50 4.4 Codebeispiele............................................................................................. 4.4.1 Rekonstruktion der Vertextopologie.......................................................... 4.4.2 Berechnung der Normalenvektoren.......................................................... 4.4.3 Volumenberechnung................................................................................. 4.4.4 Simulationsschritt...................................................................................... 52 52 52 53 55 5 Bewertung.................................................................................................56 5.1 Ergebnisse................................................................................................... 57 5.2 Laufzeitanalyse.......................................................................................... 59 5.3 Berechnungsgenauigkeit.......................................................................... 62 5.4 Nachteile des Verfahrens......................................................................... 65 6 Ausblick.....................................................................................................67 6.1 Verbesserungen......................................................................................... 68 6.1.1 Einbindung einer Gleit- und Haftreibungskraft......................................... 68 6.1.2 Mögliche Erhöhung der Berechnungsgenauigkeit..................................... 69 6.2 Fazit............................................................................................................. 70 Anhang A: Literaturverzeichnis...............................................................71 Anhang B: Verwendete Software............................................................73 vi 1 Einleitung Kapitel 1 Einleitung Die Darstellung von Wasser ist in der Computergrafik seit der Generierung der ersten künstlichen Bilder eine der größten Herausforderungen. Kein Wunder, wenn man bedenkt, wie komplex sich Wasser in verschiedenen Situationen verhält. Schon ein einzelner Wassertropfen erfordert bei der physikalischen Beschreibung einen hohen Aufwand, wenn Oberflächenspannung und Turbulenzen im Inneren berücksichtigt werden. Dieser Aufwand verblasst aber geradezu vor dem Hintergrund von Wasserfällen, Wellenbewegungen oder den Strömungen in einem Fluss. Hinzu kommen die optischen Eigenschaften von Wasser, die durch seine teilweise Transparenz und Lichtbrechung an der Oberfläche ebenfalls schwer zu beschreiben sind. Bislang begrenzt sich die Darstellung von Wasser daher darauf, für einzelne optische Eigenschaften verschiedene Konzepte zur Darstellung zu entwickeln, sich also z. B. auf die Darstellung der Wasseroberfläche zu begrenzen. Trotz der starken Vereinfachung bleibt der Aufwand immer noch hoch. So mussten beispielsweise 350 SGI CPUs und 200 DEC Alpha CPUs rund drei Monate rechnen, um die Wassereffekte des Kinofilms „Titanic“ zu erzeugen. [Str98] Rechnerraum für die Erzeugung von Wassereffekten Seite 1 Einleitung 1 Die Schwierigkeiten bei der formalen Beschreibung von Wasser übertragen sich auch auf physikalische Simulationen, bei denen Wasser eine Rolle spielt. Möchte man zudem eine interaktive Simulationsumgebung erstellen, setzt das die Generierung von wenigstens 10-30 Einzelbildern pro Sekunde voraus. [FDF97] Es wird schnell klar, dass die Beschreibung des Wassers drastisch vereinfacht werden muss, denn neben der eigentlichen Simulation muss auch noch die Darstellung in der kurzen Zeit bewältigt werden. Der Einsatz von physikalischen Simulationen beschränkt sich in EchtzeitAnwendungen daher auch vorwiegend auf starre Objekte (wie etwa den oft gesehenen Kistenstapel). Im Rahmen dieser Arbeit wird am Beispiel eines wassergefüllten Ballons untersucht, inwieweit auch deformierbare Objekte in angemessener Geschwindigkeit dargestellt werden können, ohne dass dabei charakteristische Bewegungsmerkmale verloren gehen. Um eine angemessene Berechnungsgeschwindigkeit zu erreichen, wird das Wasser im Inneren auf einzelne Massepartikel reduziert, die über die Ballonoberfläche verteilt sind. Zur Simulation des elastischen Gummis wird ein Feder–Masse–Dämpfer-System eingesetzt, durch das die Massepartikel verbunden sind. Damit dabei das Volumen des Ballons erhalten bleibt, wird zudem der Druck des Wassers auf die Innenseite der Ballonoberfläche simuliert. Seite 2 2 Grundlagen Kapitel 2 Grundlagen In diesem Kapitel wird in die Techniken eingeführt, die bei der Realisierung der Aufgabenstellung zum Einsatz kommen. Nach einem kurzen Einblick in die polygonale Geometrierepräsentation wird eine schnelle Methode zur Berechnung eines Polyedervolumens auf Grundlage des GAUSSschen Integralsatzes entwickelt. Danach werden theoretische Grundlagen von Feder–Masse–Dämpfer-Systemen erläutert. Abschließend werden einige Anwendungsgebiete von Feder–Masse–DämpferSystemen vorgestellt. Neben der Verbindung zu elektronischen Schwingkreisen werden anhand zweier Publikationen aus dem Gebiet der Graphischen Datenverarbeitung aktuelle Resultate und Probleme umrissen. Seite 3 Grundlagen 2 2.1 Geometrische Grundlagen 2.1.1 Polygonale Geometrierepräsentation Wie Geometrische Daten im Computer repräsentiert werden, richtet sich sinnvollerweise nach dem Zweck der Anwendung – entsprechend vielfältig sind die vorhandenen Möglichkeiten. Ein verbreiteter Ansatz ist die Polygondarstellung. Aus den Basisprimitiven Vertex, Edge und Face (engl. für „Knoten“, „Kante“ und „Fläche“) werden planare Polygone erzeugt, mit denen die Oberfläche der Szenengeometrie beschrieben wird. Abbildung 2.1: Vertex, Edge und Face Die Polygondarstellung hat zunächst den Nachteil, dass sich nicht alle Objekte exakt darstellen lassen. So kann eine runde Oberfläche durch eine Menge von Polygonen immer nur angenähert werden. Um den Eindruck der Rundung zu erhalten, muss die Oberfläche durch kleine und damit viele Polygone nachgebildet werden. Erst durch speziell angepasste Hardware konnte der Rechenaufwand komplexer Szenen mit einer hohen Polygonzahl bewältigt werden. So findet sich heute auf jeder handelsüblichen Grafikkarte ein „3D-Beschleuniger“, also ein Grafikchip, der die beim Rendern einer 3D-Szene anfallenden Rechenoperationen besonders effizient ausführen kann. Die Leistung aktueller Grafikchips reicht aber aus, um mehrere 100.000 Polygone darzustellen. Zudem existieren Algorithmen, die eine beliebig deformierte Oberfläche so in Polygone zerlegen, dass die resultierende Gesamtzahl niedrig, der optische Eindruck aber weitgehend erhalten bleibt. Durch geschickte Modellierung lassen sich mittels Polygondarstellung also nahezu beliebige Szenen beschreiben und in Echtzeit darstellen. Seite 4 Grundlagen 2 2.1.2 Geometrische Körper aus der Mathematik Ein fluider Körper wird unter Einwirkung einer Oberflächenspannung stets bestrebt sein, seine Oberfläche zu minimieren, also eine Minimalfläche zu bilden. Ist die Oberfläche so beschaffen, dass die Spannkraft an jeder Stelle gleich ist, also durch eine gleich große Dehnung immer eine gleich große Kraft entsteht, dann ist seine Minimalfläche eine regelmäßige Kugel. [Vog99] 4 3 r 3 O = 4 r 2 V = r Abbildung 2.2: Regelmäßige Kugel Aus diesem Grund werden im Folgenden zwei Varianten einer polygonalen Näherung an eine regelmäßige Kugel vorgestellt. Die erste Variante ist die UV-Sphere. Bei dieser wird eine regelmäßige Kugel in n Segmente und m Ringe unterteilt, ähnlich den Längen- und Breitengraden eines Globi. Dazu werden die Variablen u 1 ,u 2 u n und v 1 , v 2 v m regelmäßig auf das Intervall [0, 1] verteilt, so dass u 1 = v1 = 0, u n = v m = 1 und u i1 −u i = u bzw. v i1−vi = v ist. Ein Paar ui ,v j entspricht auf der Oberfläche der UV-Sphere dem Schnittpunkt des linken Randes von Segment i mit dem j-ten Ring. Die Vertices der UV-Sphere werden bestimmt durch alle Paare ui ,v j mit 1 ≤ i ≤ n und 1 ≤ j ≤ m. Abbildung 2.3: UV-Sphere Seite 5 Grundlagen 2 Zur Bestimmung der Koordinaten einer Vertex werden die Winkel i = 2⋅u i (gemessen an der x-Achse) und j = ⋅v j (gemessen an der y-Achse) berechnet. Über trigonometrische Funktionen wird das Winkelpaar i , j auf die Kugeloberfläche abgebildet und damit die resultierenden Koordinaten einer Vertex berechnet. Das zweite Verfahren beruht auf einem besonderen geometrischen Objekt, dem Ikosaeder. Zusammen mit dem Pentagondodekaeder ist es der komplexeste der fünf platonischen Körper, welche über eine außerordentliche Regelmäßigkeit und Symmetrie verfügen. [Hom06] So sind alle Seitenflächen eines platonischen Körpers zueinander kongruente, regelmäßige Vielecke, von denen in jeder Ecke jeweils gleich viele zusammentreffen. Es ist bewiesen, dass tatsächlich nur fünf solcher Körper existieren. [www01] a 5a3 3 5 12 O = 5a 2 3 a r = 2 5 5 4 V = Abbildung 2.4: Ikosaeder Das Ikosaeder besteht aus zwölf Eckpunkten, 20 gleichseitigen und kongruenten Dreiecken sowie 30 gleich langen Kanten. Es wird von drei gleich großen Rechtecken aufgespannt, deren Seitenverhältnis dem Goldenen Schnitt entspricht. Die Vertices eines Ikosaeders entsprechen den Eckpunkten dieser Rechtecke. Ein Ikosaeder mit der Kantenlänge a = 2, dessen Mittelpunkt im Ursprung des Koordinatensystems liegt, lässt sich daher mit folgenden Koordinaten erfassen: ±1 ,± , 0, 0 ,±1 ,±, ± ,0 ,±1, mit = 1 5 / 2 Auch wenn das Ikosaeder über hervorragende Symmetrieeigenschaften verfügt, so ist es zur Beschreibung einer regelmäßigen Kugel noch zu kantig. Man kann die Oberfläche des Ikosaeders aber durch sukzessives Unterteilen der Seitenflächen abrunden. Dazu wird jeweils ein Dreieck der Oberfläche durch vier neue Dreiecke Seite 6 Grundlagen 2 ersetzt. Die neu entstandenen Vertices werden anschließend auf die Umkugel des Ikosaeders projiziert. Abbildung 2.5: Face-Split an den Seitenflächen des Ikosaeders Schon nach wenigen Unterteilungsschritten entsteht der Eindruck einer runden Kugel. Leider gehen bei der Teilung einige Eigenschaften des Ikosaeders verloren. So treffen nach der Unterteilung in manchen Eckpunkten fünf, in anderen sechs Seitenflächen zusammen. Dennoch ist das Ikosaeder von den platonischen Körpern am besten geeignet, um eine möglichst gute Näherung an eine regelmäßige Kugel zu erhalten. [Hom06] Ein auf die beschriebene Weise unterteiltes Ikosaeder nennt man auch geodätische Kugel. Abbildung 2.6: Aus einem Ikosaeder konstruierte geodätische Kugeln Seite 7 Grundlagen 2 2.2 Volumenberechnung mit dem Gaußschen Integralsatz Zur Berechnung des Volumens geschlossener geometrischer Körper ist im Allgemeinen die Auswertung von Mehrfachintegralen notwendig: VK = K ∭ dV ∫ f x , y , zdV = K Für beliebige geometrische Körper ergibt sich bei der Auswertung eines solchen Integrals ein möglicherweise komplizierter und schwer zu beschreibender Integrationsbereich. Es bietet sich daher in vielen Fällen an, den Körper in weniger komplexe Teilobjekte zu zerlegen und die dadurch vereinfachten Einzelintegrale aufzusummieren. [BM01] Liegt ein Körper in Randdarstellung vor, kann der GAUSSsche Integralsatz angewendet werden. Dieser stellt einen Zusammenhang zwischen räumlichen Bereichsintegralen und Oberflächenintegralen her: Sei B⊂ℝ3 ein räumlicher Bereich, der von einer stückweise glatten Fläche F berandet wird. Weiterhin sei f : ℝ3 ℝ3 eine stetig differenzierbare Vektorfunktion und n äußeres Normaleneinheitsfeld an F. Dann gilt: [MW99] ∫ g dB B = ∫ f ⋅n dF, mit g = div f = F ∂ fx ∂ fy ∂ fz ∂x ∂y ∂z Man nennt g :ℝ 3 ℝ eine Divergente zu f ; dabei ist g nicht notwendigerweise eindeutig. Wendet man den GAUSSschen Integralsatz auf das Mehrfachintegral zur Berechnung des Volumens an, ergibt sich: VK = ∫ g dV = ∫ f ⋅n dF ∂K K Das Volumen wird also durch die Oberfläche ∂ K des Körpers ausgedrückt. Diese kann in einzelne Flächenstücke F i zerlegt werden: ∫ f ⋅n dF ∂K = ∑ ∫ f ⋅n i dF i i Fi Seite 8 Grundlagen 2 Sei nun f x , y , z = x , y , z die Identitätsfunktion. Dann ist f stetig und differenzierbar und liefert bei der Integration über ein Flächenstück F i genau die Punkte Q i ⊂F i der Fläche selbst. Zudem gilt, dass das Skalarprodukt eines Vektors mit einem Einheitsvektor die Länge der Projektion dieses Vektors auf die vom Einheitsvektor definierte Gerade ergibt. [www02] Es ist also P i , j⋅n gleich für alle P i , j ∈ Q i, da n sowohl Einheitsvektor wie auch normal zu F i ist. Es gilt somit für jeweils beliebiges j: ∫ f ⋅n dF i Fi = ∫ Q i⋅n dF i Fi = P i , j⋅n ∫ dF i = P i , j⋅n AF i Fi Nun kann jeder Punkt in Q i auch als vom Ursprung des Koordinatensystems ausgehender Vektor aufgefasst werden. Die Randpunkte von F i bilden dann einen unregelmäßigen schiefen Kegel mit der Grundfläche AF i , dessen Spitze im Ursprung des Koordinatensystems liegt. P i , j⋅n ist die Höhe des Kegels, so dass für das Gesamtvolumen des Körpers gilt: [Gol94] VK = 1 3 ∣∑ P i , j⋅ ni AF i i ∣ Diese Feststellung basiert auf der Gleichung für das Volumen einer Pyramide: VP = 1 G⋅h 3 Die Übertragung auf den unregelmäßigen schiefen Kegel wird durch das Prinzip von CAVALIERI erlaubt; es besagt, dass zwei Körper das gleiche Volumen haben, wenn alle ebenen Schnitte miteinander übereinstimmen, die parallel zu einer vorgegebenen Grundebene und in übereinstimmenden Abständen ausgeführt werden. Daher ist das Volumen einer Pyramide nur von der Höhe und vom Flächeninhalt der Grundfläche, nicht aber von deren Form abhängig. [www03] Sind alle Flächenstücke F i des Körpers Dreiecke mit den Eckpunkten P i ,0 , P i ,1 und P i , 2, die in Bezug auf die nach außen gerichtete Dreiecksseite gegen den Seite 9 Grundlagen 2 ni Uhrzeigersinn angeordnet sind, dann lassen sich die Normaleneinheitsvektoren durch ni = P i ,1 −P i ,0 × P i ,2 −Pi ,0 ∣P i ,1 −P i ,0 × P i ,2 −Pi ,0 ∣ bestimmen. Des weiteren gilt für den Flächeninhalt AF i eines Dreiecks der Zusammenhang AF i = 1 ∣P −P i ,0 × P i ,2−P i ,0∣, 2 i ,1 da durch v = P i ,1−P i ,0 und w = P i ,2 −P i ,0 zwei Dreiecksseiten gegeben sind und aus der Definition des Kreuzproduktes ∣v × w∣ = ∣v∣⋅∣ w∣⋅∣sin∢v , w ∣ folgt. Zusammengefasst kann also das Volumen eines geometrischen Körpers K, dessen Umrandung aus den Dreiecken F i besteht, berechnet werden mit VK = 1 6 ∣∑ i Pi ,0⋅ n i ⋅∣ P i ,1 −P i ,0 × P i ,2 −P i ,0 ∣ ∣ Seite 10 Grundlagen 2 2.3 Feder–Masse–Dämpfer-Systeme 2.3.1 Harmonische Schwingungen und das Hookesche Gesetz Eine periodische Schwingung, die bei einer gleichförmigen Kreisbewegung entsteht, heißt harmonische Schwingung. [Vog99] Sie ist gekennzeichnet durch eine Gleichung der Form x = A⋅sin t , wobei ∣A∣ die Amplitude, die Kreisfrequenz und die Phasenverschiebung angeben. Fasst man die Schwingung als eine räumliche Auslenkung auf, so ergeben sich durch Differenzierung v = ẋ = v 0 cos t a = ẍ = −a 0 sin t v0 = A 2 a0 = A Ein Vergleich der Gleichungen zeigt, dass für jeden Zeitpunkt t die Auslenkung x der Beschleunigung a entgegengesetzt, aber zu dieser proportional ist: a = − a0 2 x = − x A Wird ein Körper mit der Masse m gemäß der Schwingung bewegt, muss auf ihn also eine Kraft F =−m 2 x = −Dx proportional zu seiner Auslenkung wirken. Eine Kraft, die auf diese Weise von einem Abstand abhängt, nennt man elastische Kraft, die Proportionalitätskonstante D heißt Federkonstante. Eine elastische Kraft F = D⋅s beschreibt eine eindimensionale und lineare elastische Deformation. Sie ist damit ein Spezialfall des HOOKEschen Gesetzes: [www04] = E⋅ Das HOOKEsche Gesetz beschreibt das elastische Verhalten von Festkörpern, deren elastische Verformung proportional zur anliegenden Spannung ist. Für eine ideale Feder kann statt der anliegenden Spannung (Kraft pro Fläche) direkt die resultierende Kraft angegeben werden. Der Auslenkung s entspricht dann die elastische Verformung der Feder, die durch ihre relative Längenänderung l / l Seite 11 Grundlagen 2 gegeben ist. Der Federkonstanten D entspricht das Elastizitätsmodul E, das, wie die Federkonstante auch, ein werkstoffkonstanter Proportionalitätsfaktor ist. 2.3.2 Feder–Masse-Systeme Mit dem HOOKEschen Gesetz lässt die Zugkraft bzw. Auslenkung einer idealen linearen Feder beschreiben. Damit ist die Grundlage für ein einfaches Feder–MasseSystem gegeben. Anhand des folgenden Aufbaus nach [Edw01] sollen die auftretenden Kräfte beschrieben werden: l l e 2 / FG FS Abbildung 2.7: Einfaches Feder–Masse-System Eine ideale lineare Feder der Länge l wird durch eine Masse m gedehnt. Die Gewichtskraft greift am Schwerpunkt der Masse an und wirkt senkrecht nach unten. Die Zugkraft der Feder ist der Gewichtskraft genau entgegengesetzt und wirkt entlang einer Geraden durch die Feder (HOOKEsche Gerade). Befindet sich das System in Ruhelage, heben sich Zugkraft der Feder und Gewichtskraft der Masse auf. Die Feder werde dabei um eine Länge e gedehnt; ihre Zugkraft beträgt dann nach dem HOOKEschen Gesetz: FS = E⋅ l E⋅e = l l Da sich die Zugkraft der Feder und die Gewichtskraft der Masse aufheben, gilt F S = F G. Wird die Feder um eine zusätzliche Länge y nach unten gedehnt, steigert sich ihre Zugkraft auf Seite 12 Grundlagen F 'S = 2 E⋅e y l Die nach unten wirkende resultierende Gesamtkraft beträgt somit F = F G − F 'S. Mit F G = F S folgt: F = F G − F 'S = F G − E⋅e y E⋅y E⋅y = FG − F G − = − l l l Damit kann F für eine beliebige Auslenkung y berechnet werden. Um nun den Bewegungsverlauf der Masse beschreiben zu können, muss die verstrichene Zeit t in die Gleichung integriert werden. Da keine äußeren Kräfte auf das Feder–MasseSystem wirken, ist die Auslenkung der Masse nur von der Zeit selbst abhängig und es gilt y = y t. Gemäß dem 2. NEWTONschen Gesetz ist F = m⋅a. Daraus ergibt sich für das Feder–Masse-System: F =− E⋅y t d 2 y t , F = m⋅ l dt 2 ⇒ m⋅ d 2 y t E⋅y t = 0 l dt 2 Die resultierende Gleichung ist eine homogene lineare Differentialgleichung 2. Ordnung. Sie enthält die unabhängige Variable t, die davon abhängige Variable y und die Parameter m, E und l, die die physikalischen Eigenschaften des Systems beschreiben. Zur Lösung der Differentialgleichung muss eine Funktion gefunden werden, deren zweite Ableitung negativ proportional zu sich selbst ist. Die Sinusund Cosinusfunktionen haben diese Eigenschaft. Eine allgemeine Lösung ist daher [www05] y t = a⋅sin t b⋅cos t = y ⋅sin t, mit = E und y = a 2 b 2 l⋅m Um die Konstanten y und zu bestimmen, muss eine Anfangswertaufgabe gelöst werden. Typische Anfangswerte sind die initiale Auslenkung y 0 und die initiale Geschwindigkeit ẏ 0. Zusammen mit den physikalischen Eigenschaften in wird dadurch der Bewegungsverlauf der an der Feder hängenden Masse schließlich vollständig beschrieben. Offensichtlich bewegt sich die Masse des analysierten Feder–Masse-Systems gemäß einer harmonischen Schwingung. Seite 13 Grundlagen 2 2.3.3 Feder–Masse-System mit Dämpfer Das vorangehende Feder–Masse-System bewegt sich – einmal aus der Ruhelage gebracht – ewig weiter. Dieses Verhalten ist unrealistisch, weil Deformations- und Reibungskräfte einem realen System Energie entziehen und es somit nach einer bestimmten Zeit zum Stillstand bringen. Um dieses Verhalten nachzubilden, erweitert man das Feder–Masse-System um einen Dämpfer. Dieser abstrahiert alle Kräfte, die dem System Energie entziehen. [Edw01] v FD Abbildung 2.8: Feder–Masse–Dämpfer-System Aus Versuchen geht hervor, dass Reibungs- und Deformationskräfte an einer Masse annähernd proportional zur Geschwindigkeit sowie dieser entgegengesetzt sind. Ein entsprechender Dämpfer kann also, in Abhängigkeit von der Geschwindigkeit zum Zeitpunkt t, definiert werden als dy t F D = −R⋅ dt Die Konstante R nennt man den Dämpfungsfaktor. Für das um den Dämpfer erweiterte System ergibt sich für die senkrecht nach unten wirkende Gesamtkraft F der Zusammenhang F = F G − F 'S − F D. Bei analoger Anwendung des 2. NEWTONschen Gesetzes entsteht wieder eine Differentialgleichung: m⋅ d 2 y t dy t E⋅y t R⋅ = 0 2 dt l dt Auch hierbei handelt es sich um eine homogene lineare Differentialgleichung 2. Ordnung. Um eine Lösung anzugeben, muss berücksichtigt werden, dass im Seite 14 Grundlagen 2 Gegensatz zur Gleichung ohne Dämpfer hier auch die erste Ableitung vorhanden ist. Da aber alle Koeffizienten konstant sind, lässt sich eine Lösung mit Hilfe der charakteristischen Gleichung konstruieren. Der Ansatz y t = e⋅t führt zu [MW99] 2 m R E = 0, l also einer linearen Gleichung 2. Grades. Welcher Art die Lösung dieser Gleichung ist, lässt sich anhand ihrer Diskriminanten ermitteln: • (I): R 2 − 4 m E 0 l Die charakteristische Gleichung hat zwei verschiedene reellwertige Lösungen. Eine allgemeine Lösung der Differentialgleichung ist 1 2 y t = c1 e ⋅t c 2 e ⋅t , mit 1, 2 = • (II): R 2 − 4 m −R± R − 4 m⋅E / l 2m 2 E = 0 l Die charakteristische Gleichung hat eine doppelte reellwertige Lösung. Eine allgemeine Lösung der Differentialgleichung ist y t = c1 e 1⋅t • (III): R 2 − 4 m ⋅t c 2 t e , mit 1 =− 1 R 2m E 0 l Die charakteristische Gleichung hat zwei komplexwertige Lösungen. Eine allgemeine Lösung der Differentialgleichung ist y t = e R⋅t und R = c 1 sin I⋅t c 2 cos I⋅t , mit 1 = R I i, 2 = R − I i R E , I = R2 − 4 m 2m l Zur Bestimmung von c1 und c 2 müssen wiederum zwei Anfangswerte angegeben werden. Seite 15 Grundlagen 2 Die Art der Lösung hängt also von den physikalischen Konstanten ab. So verwundert es nicht, dass ein im Verhältnis zu Masse und Federeigenschaften schwach gedämpftes System (R 2 4 m E /l) oszilliert. Betrachtet man die allgemeine Lösung der Differentialgleichung, so besteht diese im Kern aus einer harmonischen Schwingungskomponente, die von einer stetig fallenden Exponentialfunktion gedämpft wird. Seite 16 Grundlagen 2 2.4 Anwendungen 2.4.1 Feder–Masse–Dämpfer-Systeme in der Elektrotechnik Es besteht ein direkter Zusammenhang zwischen Feder–Masse–DämpferSystemen und Schwingkreisen. [Vog99] Ein Schwingkreis besteht aus einem idealen Kondensator mit Kapazität Q, einer Spule mit Induktivität L und einem Widerstand R. Wenn der Schwingkreis keine Spannungsquelle enthält, muss nach dem 2. KIRCHHOFFschen Gesetz die Summe der Spannungsabfälle über allen Schaltelementen Null ergeben. R u t C L Abbildung 2.9: Schwingkreis Hat der Kondensator die Ladung q t und fließt im Schwingkreis der Strom i t , dann ist die Summe der Spannungsabfälle [Edw01] di t q t L⋅ R⋅i t = 0 dt C Diese Differentialgleichung hat zwei abhängige Variablen: i t und q t. Der Stromfluss und die Ladung des Kondensators sind aber voneinander abhängig: t q t = ∫ i dt, also ist i t = 0 dq t di t d 2 qt = und dt dt dt 2 Diese Beziehung berücksichtigt, ergibt sich für obige Differentialgleichung d 2 q t d q t q t L⋅ R⋅ = 0 2 dt C dt In dieser Form wird die Verbindung zu Feder–Masse–Dämpfer-Systemen offensichtlich: Die Differentialgleichungen beider Systeme haben denselben Aufbau und die mechanischen Größen lassen sich in elektrotechnische übersetzen. [Vog99] So entsprechen sich Induktivität und Masse, Widerstand und Dämpfungsfaktor Seite 17 Grundlagen 2 sowie Kapazität und der Kehrwert aus der Federkonstanten. Zudem entspricht die aktuelle Ladung des Kondensators der Auslenkung der Masse. Durch diesen Zusammenhang kann ein Feder–Masse–Dämpfer-System durch einen analogen Schaltkreis simuliert werden. Zudem können die Ergebnisse aus der Analyse der Feder–Masse–Dämpfer-Systeme auf Schwingkeise übertragen werden. Aus der Kreisfrequenz eines ungedämpften Systems ergibt sich so z. B. die Schwingungsdauer eines Schwingkreises ohne Widerstand (THOMSON-Gleichung): = 2 D , T= m ⇒ T = 2 LC 2.4.2 Muskeldeformation mit Feder–Masse-Systemen NEDEL und THALMANN haben in [NT98] eine Methode zur Echtzeit-Deformation von Muskeln mit Feder–Masse-Systemen vorgestellt. Sie repräsentieren einen Muskel durch eine Wirkungslinie und ein daran gekoppeltes polygonales Geometriemodell, das die Oberfläche des simulierten Muskels darstellt. Ziel der Autoren war es, bei gestauchtem Muskel eine Verdickung desselben zu erhalten. Dazu werden äußere Bewegungen, etwa die eines Skelettes, auf die Wirkungslinie übertragen. Ihre Endpunkte können z. B. mit den Knochen eines Gelenkes verbunden werden; Bewegungen im Skelettmodell stauchen oder dehnen dann die Wirkungslinie. Das Geometriemodell ist wiederum an die Wirkungslinie gekoppelt; einzelne Vertices werden dazu mit einem hierfür von den Autoren entwickelten Editor an die Linie gebunden. Eine Transformation oder Deformation der Wirkungslinie wirkt sich dann in entsprechender Weise auch auf diese Vertices aus. Die Position der restlichen Vertices soll berechnet werden. Hierfür wird jede Vertex des Geometriemodells als Massepartikel aufgefasst. Weiterhin wird jede horizontal und jede vertikal zur Wirkungslinie verlaufende Edge als Feder interpretiert. Das Geometriemodell ist somit ein komplexes Feder–Masse-System. Seite 18 Grundlagen 2 Abbildung 2.10: Geometriemodell mit Feder–Masse-System Damit die Edges des Geometriemodells als horizontal und vertikal erkannt werden können, kann kein beliebiges Muskelmodell verwendet werden. Vielmehr muss eine Muskelgeometrie, die etwa aus medizinischen Abtastverfahren oder einer Rekonstruktion am Computer entstanden sein kann, zunächst algorithmisch in ein Modell mit einem regelmäßigem Gitter überführt werden. Durch vertikale und horizontale Federn allein kann aber noch keine Verdickung des Muskels erreicht werden. Wird die Wirkungslinie gestaucht, schieben sich die nicht an sie gekoppelten Vertices unkontrolliert zusammen, was stellenweise auch zu einer Verjüngung des Muskels führen kann. Um eine nach außen gerichtete Wölbung zu erhalten, wurde das Feder–Masse-System von den Autoren um Wirkungslinie zusätzliche Querfedern erweitert. Abbildung 2.11: Querfedern. Links schematisch, rechts Frontal- und Draufsicht Die Querfedern verlaufen ebenfalls horizontal und vertikal. Sind drei benachbarte Punkte durch horizontale oder vertikale Edges verbunden, wird eine Querfeder zwischen dem mittleren Punkt und der Mitte der Verbindungslinie der äußeren Punkte eingefügt. Bewegt sich nun der mittlere Punkt während einer Deformation in Richtung des Muskelinneren, wird er von seinen horizontalen und vertikalen Querfedern zunehmend nach außen gedrückt. Seite 19 Grundlagen 2 Durch die Querfedern wird der gewünschte Effekt der Muskelverdickung erreicht. Diese Vorgehensweise hält allerdings das Volumen des Muskels nicht konstant. Vielmehr müssen für die Federn realistisch anmutende Werte auf empirische Weise ermittelt werden. Die Simulation des Feder–Masse-Systems wird mit einem System von Differentialgleichungen durchgeführt. Es wird dabei jeder Vertex, also jedem Massepartikel des Muskels, eine Gleichung ähnlich der in Kapitel 2.3.3 (Feder– Masse-System mit Dämpfer) beschriebenen zugewiesen: mi⋅ d 2 y i t dt 2 Ri⋅ dyi t f r y i t = f e i ,t dt Es ist yi t die Position der i-ten Vertex zum Zeitpunkt t und f r die resultierende Gesamtkraft aller auf diese Vertex wirkenden Federn. Durch die Inhomogene f e können externe Kräfte eingebracht werden. Zur näherungsweisen Lösung des Differentialgleichungssystem wird von den Autoren das klassische RUNGE–KUTTA-Verfahren angewendet. Sie simulierten einen Muskel mit 82 Massepartikeln auf einer SGI Impact Workstation mit MIPS R10000 Prozessor und erreichten dabei eine Berechnungsgeschwindigkeit von 16 Bildern pro Sekunde. Abbildung 2.12: Deformierbarer Muskel (aus: [NT98]) Seite 20 Grundlagen 2 2.4.3 Wasseroberfläche und Stoff mit Feder–Masse-Systemen Einen ähnlichen Ansatz hat FOMITCHEV in [Fom00] beschrieben. Er benutzt ein regelmäßiges 2D-Gitter, um in Echtzeit die Oberfläche von Wasser, Gummi und Stoffen zu simulieren. Jede Vertex des 2D-Gitters wird dabei wieder als Massepartikel aufgefasst. Sie ist zudem mittels den über ihre Edges laufenden Federn mit ihren Nachbarvertices verbunden. Im Unterschied zu [NT98] wird dabei jede Edge zwischen zwei Vertices als Feder aufgefasst. Um Deformationen durch äußere Krafteinwirkung zu berechnen, wird auf ein aufwendiges System von Differentialgleichungen verzichtet. Stattdessen werden die Massepartikel durch einen entsprechenden Algorithmus in diskreten Zeitabschnitten sequentiell simuliert. Dabei werden anhand der Position einer Vertex die Kräfte berechnet, die durch die Federn zur südlichen, süd-östlichen und östlichen Nachbarvertex entstehen. Nachdem alle Vertices besucht wurden, sind wegen der Regelmäßigkeit des Gitters auch alle Federkräfte auf dem Gitter berechnet worden. F ext C FE FS F SE S E SE Abbildung 2.13: Federkräfte auf dem 2D-Gitter Zur Berechnung der Kräfte wird anhand einer vorher gespeicherten Nullposition der Vertex zunächst der Abstand zu den drei Nachbarvertices berechnet. Mit den Federkonstanten und Abständen können dann die Kräfte F E, F SE und F S bestimmt werden. Es ergibt sich für die Gesamtkraft: F total = F ext F E F SE F S Ist die Berechnung der Federkräfte für alle Vertices abgeschlossen, werden ihre neuen Positionen ermittelt. Dazu werden zunächst die neuen Geschwindigkeiten der Vertices bestimmt: Seite 21 Grundlagen v neu = v alt 2 F total ⋅ t m Damit ergeben sich die neuen Positionen der Vertices aus sneu = salt v neu⋅ t Die Geschwindigkeitsvorteile gegenüber der Berechnung mit einem System von Differenzialgleichungen sind offensichtlich. Allerdings wirkt sich die Auslenkung einer Vertex zunächst auch immer nur auf die unmittelbaren Nachbarvertices aus, und nicht wie bei einem realen Feder–Masse-System auf alle Massepunkte gleichzeitig. Eine in das System eingebrachte Kraft benötigt also mehrere Simulationsschritte, um sich über das System auszubreiten. Abbildung 2.14: Eingebrachte Kraft zum Zeitpunkt t 0= t, t 1 =2⋅t und t 2=3⋅ t Ein weiterer Nachteil ist die enge Bindung an das regelmäßige Gitter. Die Methode ist daher nur bedingt zur Anwendung auf volumetrische Körper geeignet. Zudem wird durch die Verwendung von Nullpositionen eine beliebige äußere Verformung des Systems im 3D-Raum ausgeschlossen; es können nur solche Deformationen angewendet werden, die ein Mitführen der Nullpositionen ermöglichen. Seite 22 3 Entwurf Kapitel 3 Entwurf In diesem Kapitel wird auf der Grundlage der zuvor vorgestellten Publikationen ein Konzept zur Simulation eines Wasserballons entwickelt. Dazu werden in einer Anforderungsanalyse zunächst die Ziele der Aufgabenstellung festgestellt. Darauf aufbauend wird ein Geometriemodell zur Darstellung des Wasserballons und dessen Anbindung an die Simulation beschrieben. Es folgt eine Einbettung der simulierten physikalischen Kräfte. Zuletzt wird der bis dahin entwickelte Entwurf um eine topologieerhaltende Datenstruktur erweitert und die Operation Face-Split auf dieser Datenstruktur beschrieben. Seite 23 Entwurf 3 3.1 Anforderungsanalyse Die Aufgabenstellung zu dieser Diplomarbeit lautet wie folgt: „Im Rahmen der Diplomarbeit soll eine State–of–the–Art-Analyse über bereits vorhandene Techniken zur Belastungssimulation von wassergefüllten Körpern erstellt werden. Aufbauend auf dieser Analyse soll ein Verfahren vorgestellt werden, das die Körperhülle mit einem Feder–Masse-System auf physikalischer Basis simuliert. Ein weiterer Teil der Arbeit ist eine Implementierung des vorgestellten Verfahrens in C/C++. Dabei soll eine interaktive dreidimensionale Simulationsumgebung erzeugt werden, in der an einem wassergefüllten Ballon Belastungstests durchgeführt werden können.“ Die Aufgabenstellung verlangt die Konzeption und Entwicklung einer interaktiven Simulationsumgebung. Es ist daher besonders zu berücksichtigen, dass eine gute Performance in Bezug auf die Bildwiederholungsrate erreicht wird, oder anders formuliert, dass das zu entwickelnde Verfahren auch mit wenig Rechenzeit gute Ergebnisse erzielt. Die Interaktivität bezieht sich sinnvollerweise auf die Simulationsumgebung, d.h. die dort vorhandenen Rahmenbedingungen wie die physikalischen Kräfte sollten während dem Simulationsprozess beeinflussbar sein. Es sollte darüber hinaus auch möglich sein, einen direkten Einfluss auf den Wasserballon und dessen physikalische Eigenschaften nehmen zu können. Eine besondere Rolle kommt der Wahl eines geeigneten Geometriemodells zu. Eine Analyse der im vorherigen Kapitel vorgestellten Publikationen zeigt, dass ein bestimmtes Geometriemodell die Durchführung der physikalischen Simulation mit einem Feder–Masse–System erst möglich gemacht hat, damit aber gleichzeitig auch Einschränkungen verbunden waren. Zudem ist davon auszugehen, dass die modellspezifischen Eigenschaften einen vorerst nicht absehbaren Einfluss auf die Seite 24 Entwurf 3 Simulation haben werden. Um diese Auswirkungen zu untersuchen und um generell wenig Einschränkung in der Verwendung zu haben, sollte das Verfahren also auf einem möglichst unspezifischen Geometriemodell beruhen. An das verwendete Geometriemodell muss dann das Feder–Masse-System gekoppelt werden. Hierzu wurde der Ansatz übernommen, die Vertices der Geometrie als Massepunkte zu interpretieren, da in den vorgestellten Publikationen damit gute Ergebnisse erzielt wurden. Damit der Wasserballon unter der Zugkraft der elastischen Gummioberfläche nicht in sich zusammenfällt, muss nach jeder Deformierung sein Innenvolumen berechnet und mit einem Zielvolumen verglichen werden, um bei einer Abweichung Gegenmaßnahmen einleiten zu können. Eine Methode ist hierbei die Simulation des durch die Kompression des Wassers zunehmenden Innendrucks, der mit einer Druckkraft auf die Innenseite der Gummioberfläche wirkt und dadurch die Volumendifferenz wieder ausgleicht. Um Belastungstests an dem Wasserballon durchführen zu können, kann dieser mittels einer Gravitationskraft in eine Fallbewegung versetzt werden. Bei der Kollision mit einer Begrenzungsgeometrie können dann die Verformungen der Gummioberfläche beobachtet werden. Zudem geben die bei der Kollision aufgezeichneten Messwerte von maximal wirksamen Kräften oder maximaler Oberflächendehnung Aufschluss darüber, ob der Ballon den Aufprall überstanden hätte. Nicht zuletzt gelten für die Umsetzung der Aufgabenstellung natürlich auch allgemeine Vorgehensweisen, wie sie im Sinne der Informatik angewendet werden. Dies betrifft eine objektorientierte Programmstruktur genauso, wie eine effiziente und korrekte Implementierung. Dadurch wird sichergestellt, dass der entwickelte Programmcode bei zukünftigen Anpassungen wiederverwertet werden kann, etwa wenn weitere physikalische Kräfte eingebunden werden sollen. Es ist zudem wünschenswert, wenn der Programmcode mit geringem Aufwand auf andere Rechnerarchitekturen bzw. Betriebssysteme portiert werden kann. Seite 25 Entwurf 3 3.2 Die verwendeten Geometriemodelle Eine geeignete Geometrierepräsentation zu wählen, gehört zu den ersten und wichtigsten Schritten bei der Bearbeitung der Aufgabenstellung. Durch die Geometrie muss visuell das umgesetzt werden, was die physikalische Simulation zu Tage fördert. Die Simulation kann sich also immer nur in den Grenzen bewegen, in denen ihr Effekt an der Geometrie beobachtbar ist. Wenn die Simulation dazu noch eng mit den Geometriedaten verknüpft ist, können nachträgliche Änderungen in der Geometrierepräsentation die Ergebnisse der Simulation beeinträchtigen. Eventuell muss die Simulation dann angepasst oder schlimmstenfalls grundlegend neu konzipiert werden. In Hinblick auf die Anforderungsanalyse und die vorgestellten Publikationen wurde eine polygonale Geometriedarstellung verwendet. Neben der Unterstützung aktueller Grafikhardware bietet sich mir ihr die Möglichkeit, die Verformungen auf der Gummioberfläche des Wasserballons anzunähern. Da die Minimalfläche des Wasserballons nach Kapitel 2.1.2 (Geometrische Körper aus der Mathematik) eine regelmäßige Kugel ist, werden für die Simulation als polygonale Näherung die in selbigem Kapitel beschriebenen UV-Spheren und Ikosaeder bzw. daraus abgeleitete geodätische Kugeln verwendet. Die einzige weitere Anforderung an das Geometriemodell ist neben der Polygondarstellung, dass durch es ein geschlossener Polyeder mit Seitenflächen in Form von Dreiecken beschrieben wird, d.h. die Dreiecke zerlegen genau die Oberfläche des Polyeders und es kommt nicht zu Überlappungen oder überstehenden Flächenstücken. Diese Eigenschaft wird später zur Berechnung des Innenvolumens benötigt und von den verwendeten Geometriemodellen bereits erfüllt. Es soll im Folgenden davon ausgegangen werden, dass das im jeweiligen Kontext verwendete Geometriemodell aus der Vertexmenge V und der Edgemenge E besteht. Seite 26 Entwurf 3 3.3 Einbettung der physikalischen Simulation 3.3.1 Anbindung an das Geometriemodell Die Simulation beschränkt sich auf die Gummioberfläche des Wasserballons, denn es besteht wenig Aussicht darauf, das komplexe Verhalten des Wassers im Inneren im Rahmen einer Echtzeit-Anwendung erfassen zu können. Damit das Wasser dennoch in der Simulation berücksichtigt werden kann, wird seine Masse auf die Vertices der Geometrie verteilt und diese als Massepartikel interpretiert. Abbildung 3.1: Masseverteilung auf die Vertices Dazu ordnet eine Funktion m:V ℝ jeder Vertex v i ∈ V die Masse mvi zu. Da die Vertices bei den verwendeten Geometriemodellen annähernd gleichmäßig über die Oberfläche verteilt sind, wird jeder Vertex der gleiche Masseanteil zugewiesen. Es soll an dieser Stelle aber darauf hingewiesen werden, dass bei anderen Geometriemodellen eine ungleichmäßige Verteilung durch eine andere Wahl von m ausgeglichen werden kann. In jedem Fall gilt für die Gesamtmasse des Wassers mW = ∑ m v i vi ∈ V mW lässt sich anhand des Ausgangsvolumens V 0 des Wasserballons und der Dichte von Wasser bestimmen, wenn die Masse der Gummioberfläche vernachlässigt wird. Es ist [Vog99] mW = ϱ V 0 ⋅ p Diese Gleichung gilt bei 20° Celsius Raumtemperatur, einem Druckunterschied von p gemessen an 1 atm Raumdruck und den entsprechenden Eigenschaften des Wassers, also der Dichte ϱ = 0,998 g cm−3 und der Kompressibilität = 5⋅10−5 Pa −1. Seite 27 Entwurf 3 3.3.2 Simulation der auftretenden Kräfte Welche Beschleunigung ein Körper unter Einwirkung einer Kraft erfährt, hängt nach dem 2. NEWTONschen Gesetz von seiner Masse ab. Die auf den Wasserballon wirkenden Kräfte müssen somit an seinen Massepartikeln, die durch seine Vertices repräsentiert sind, ausgewertet werden. 3 Eine Kraft F i wird durch einen Vektor im ℝ dargestellt. Richtung und Länge des Vektors entsprechen Richtung und Betrag der Kraft. Um die auf eine Vertex v j wirkende Gesamtkraft zu bestimmen, muss nach dem 1. NEWTONschen Gesetz die Summe aller Einzelkräfte ermittelt werden: Fv = j F ∑ i ∣ F i wirkt auf v j i Um die Wirkung der so ermittelten Kraft auf das Massepartikel in Abhängigkeit einer verstrichenen Zeit t zu bestimmen, kann wie in der in Kapitel 2.4.2 (Muskeldeformation mit Feder–Masse-Systemen) vorgestellten Publikation ein System von Differentialgleichungen aufgestellt und eine Lösung angenähert werden. Eine Berechnung auf diese Art ist im Sinne der Mechanik genau und auch realistisch, wenn man von der Umverteilung der Wassermasse auf die Massepartikel einmal absieht. Diese Genauigkeit muss aber mit einem immensen Rechenaufwand bezahlt werden. Zudem lassen sich die Differentialgleichungen nur schlecht um weitere physikalische Einflüsse erweitern. Solche müssen entweder als externe Kraft in die Gleichung eingebracht oder durch eine Erweiterung des Feder–Masse-Systems beschrieben werden, was die Komplexität der Differentialgleichungen und damit den Rechenaufwand für eine Näherungslösung noch weiter erhöht. Es wurde daher eine schnellere, wenn auch ungenauere Simulationsmethode entwickelt, die auf der in Kapitel 2.4.3 (Wasseroberfläche und Stoff mit Feder– Masse-Systemen) vorgestellten Arbeit basiert. Dabei wird jeweils zwischen zwei Zeitintervallen ein Simulationsschritt durchgeführt, der in zwei Phasen die Bewegung der Massepartikel und damit die Deformierung des Wasserballons für das jeweils verstrichene Zeitintervall berechnet. Seite 28 Entwurf 3 In der ersten Phase werden alle physikalischen Kräfte ermittelt, die auf ein Massepartikel wirken. Dies geschieht durch eine Analyse der Ballongeometrie und deren Interaktion mit der Simulationsumgebung. Da die Positionen der Massepartikel in dieser Phase noch nicht verändert werden, können sie sequentiell und in einer beliebigen Reihenfolge betrachtet werden. Anhand der auftretenden Einzelkräfte kann abschließend für die erste Phase für jedes Massepartikel eine entsprechende Gesamtkraft ermittelt werden. Anhand der sich daraus ergebenden Beschleunigung wird in der zweiten Phase eine Positionsänderung für jedes Massepartikel berechnet. Die Beschleunigung wird dabei so interpretiert, als wäre sie innerhalb des letzten Zeitfensters konstant gewesen. Dies ist eine Vereinfachung gegenüber einem realen System, in dem bereits infinitissimal kleine Positionsänderungen die Kraft und damit die resultierende Beschleunigung an einem Masseteilchen beeinflussen. Die zu erwartende Berechnungsungenauigkeit nimmt mit der Dauer der Zeitintervalle ab, denn geht diese gegen Null, so entspricht die Art der Berechnung einer Differenzierung nach der Zeit. Zur Berechnung der Positionsveränderung wird ein Massepartikel zunächst nur in einem lokalen Kontext gesehen, d.h. innerhalb des jeweils letzten Zeitintervalls und ohne den vorherigen Verlauf der Simulation. In dem lokalen Kontext ist ein Massepartikel daher zunächst in einer Ruhelage. Wirkt während des Zeitintervalls t dann die ermittelte Beschleunigung a konstant auf das Massepartikel, so ändert es bis zum Ende des Zeitintervalls seine Position um [FD97] sl = 1 ⋅a t 2 2 Anschließend wird der globale Kontext des Massepartikels betrachtet. Hatte das Massepartikel beim Betreten des Zeitintervalls die Geschwindigkeit v , so wird es gemäß dem 1. NEWTONschen Gesetz unabhängig von der lokalen Positionsänderung bestrebt sein, die Strecke sg = v t zurückzulegen. Damit ergibt sich die neue Position des Massepartikels beim Verlassen des Zeitintervalls durch Seite 29 Entwurf 3 s = sl sg Anhand der Positionsänderung wird abschließend für die zweite Phase die neue globale Geschwindigkeit des Massepartikels berechnet. a = const. v sg v s sl t Abbildung 3.2: Globale und lokale Positionsänderung im Zeitfenster In der zweiten Phase des Simulationsschrittes kann ebenfalls eine beliebige Reihenfolge der Massepartikel gewählt werden, da alle wirkenden Kräfte in der ersten Phase bereits ermittelt wurden und die Verschiebung eines Massepartikels die auf die anderen Partikel wirkenden Kräfte nicht mehr beeinflusst. Die Einteilung der Zeitintervalle ist an sich beliebig, jedoch sollte die Dauer eines Zeitintervalls aufgrund der besseren Berechnungsgenauigkeit möglichst klein sein. Je nach Art der Anwendung kann die Einteilung dynamisch erfolgen. Für eine interaktive Simulation bietet es sich z. B. an, die Zeitintervalle an die aktuelle Bildwiederholungsrate anzupassen. Falls die Bildfrequenz des Anzeigegerätes limitiert ist und zwischen zwei generierten Bildern noch Rechenzeit zur Verfügung steht, können auch mehrere Simulationsschritte pro dargestelltem Bild ausgeführt werden. Es sind zwar immer nur die Auswirkungen des jeweils letzten Simulationsschrittes zu sehen, die kleineren Zeitintervalle erhöhen aber die erwartete Berechnungsgenauigkeit. Bei einer dynamischen Wahl der Zeitintervalle kann der Bewegungsablauf einer vorherigen Simulation allerdings nicht mehr exakt reproduziert werden: Eine Rundung oder eine veränderte Berechnungsgenauigkeit aufgrund einer kleinen Abweichung in der Dauer eines Zeitintervalls kann zum sprichwörtlichen „Zünglein an der Waage“ werden und den Bewegungsablauf nachhaltig beeinflussen. Dieses Verhalten entspricht gewissermaßen einem realen System, das sich zwar innerhalb seiner physikalischen Grenzen bewegt, aber doch nie die exakt gleiche Bewegung Seite 30 Entwurf 3 ausführt. Soll aber z. B. für eine Skriptsequenz ein Bewegungsablauf exakt wiederholt werden, so müssen Zeitintervalle mit konstanter Dauer gewählt werden. Die Simulation wird dadurch von der Echtzeit entkoppelt und muss gegebenenfalls mit anderen Methoden wieder synchronisiert werden. Durch die Entkopplung von der Echtzeit kann ein Simulationsverlauf auch in Zeitlupe bzw. Zeitraffer dargestellt werden. Um Belastungstests an dem Wasserballon vorzunehmen, können in jedem Simulationsschritt Maximalwerte für die wirkende Gesamtkraft und die Dehnung der Oberfläche mitgeführt werden. Es kann dann beispielsweise für vorher definierte Schwellenwerte ermittelt werden, wann die Gummioberfläche des Ballons bei einem Aufprall zerreißen würde. 3.3.3 Reaktion mit der Simulationsumgebung Nach der zweiten Phase eines Simulationsschrittes werden die Positionen der Massepartikel entsprechend der ermittelten Beschleunigung und Geschwindigkeit aktualisiert. Dabei wird zunächst keine Rücksicht auf die Geometrie der Simulationsumgebung genommen. Es kann daher vorkommen, dass einzelne Massepartikel diese Geometrie durchdringen. Dieser Effekt kann in einem realen System nicht vorkommen, weshalb nach jedem Simulationsschritt eine Kollisionserkennung durchgeführt werden muss, bei der die falsch platzierten Massepartikel erkannt und korrigiert werden. Im Rahmen dieser Arbeit wird lediglich ein Quader als Begrenzungsgeometrie verwendet, dessen Seitenflächen parallel zu den jeweils von zwei Achsen des Koordinatensystems aufgespannten Ebenen sind. Die Kollisionserkennung gestaltet sich dadurch sehr einfach, denn es muss nur überprüft werden, ob eine der Koordinaten einer Vertex die Begrenzung durch den Quader überschritten hat. Es existieren jedoch auch Methoden, um die Kollision mit einer beliebigen Szenengeometrie zu erkennen. [MH99] Wurde die Kollision eines Massepartikels mit der Szenengeometrie erkannt, wird der Punkt bestimmt, in dem das Massepartikel die Szenengeometrie durchdrungen Seite 31 Entwurf 3 hat. Dazu wird eine Gerade durch die aktuelle und die vorherige Position des Massepartikels gebildet und ihr Schnittpunkt mit der Szenengeometrie berechnet. Das Massepartikel wird auf diesen Schnittpunkt zurückgesetzt und seine neue globale Geschwindigkeit für den nächsten Simulationsschritt entsprechend angepasst. Abbildung 3.3: Kollision von Massepartikeln mit der Umgebungsgeometrie Seite 32 Entwurf 3 3.4 Die physikalischen Kräfte 3.4.1 Notation der Kräfte In der ersten Phase eines Simulationsschrittes wird für jedes Massepartikel die Krafteinwirkung ermittelt. Dazu müssen pro Massepartikel alle auf es wirkenden Einzelkräfte bestimmt werden. Dies geschieht je nach der Art der Kraft auf unterschiedliche Weise. Um Aussagen über die Menge aller Massepartikel einfach formulieren zu können, wird bei der Beschreibung der verschiedenen physikalischen Kräfte eine funktionale Schreibweise benutzt, wie sie schon bei der Verteilung der Wassermasse angewendet wurde. Sinngemäß wird diese Art der Notation auch auf andere physikalischen Größen übertragen. Mit v v i ist z. B. die Geschwindigkeit der Vertex v i zum Zeitpunkt des jeweiligen Simulationsschrittes gemeint. 3.4.2 Gravitation Die Gravitationskraft f G : V ℝ3 ist die einfachste der Kräfte, die in die Simulation integriert wurden. Sie wirkt auf jedes Massepartikel mit dem gleichen Betrag und stets senkrecht nach unten. Sie kann durch die Gravitationskonstante g = 9,80665m s−2 und der einer Vertex zugewiesenen Masse bestimmt werden: 0 f G v i = −1 ⋅mvi g 0 3.4.3 Dämpfung Ein Dämpfer soll in der Simulation alle Einflüsse zusammenfassen, die dem Wasserballon in einem offenen System Energie entziehen. Das sind etwa Reibungskräfte oder die Wärmeentwicklung bei einer Deformation. Nach [Edw01] Seite 33 Entwurf 3 können diese Einflüsse durch eine Kraft angenähert werden, die proportional zu der Geschwindigkeit und dieser entgegengesetzt ist. Die auf eine Vertex v i wirkende Dämpfungskraft f R :V ℝ3 kann somit durch m vi v v i f R v i = − R⋅ t bestimmt werden, wobei R der Dämpfungsfaktor ist. Für die Simulation wird noch eine weitere Art der Dämpfung eingesetzt, die nicht linear zu der Geschwindigkeit ist, sondern durch die ein Maximalbetrag v max k für die Geschwindigkeit eines Massepartikels vorgegeben wird. Diese Art der Dämpfung ist nicht physikalisch motiviert, hat sich aber bei der Umsetzung als hilfreich erwiesen, ein zur Oszillation neigendes System zu stabilisieren. Die Dämpfung wird dabei während der zweiten Phase eines Simulationsschrittes angewendet. In dieser wird eine neue globale Geschwindigkeit zu jedem Massepartikel berechnet, anhand derer seine neue Position bestimmt werden soll. Vor der Verschiebung des Partikels wird auf die neue Geschwindigkeit die Dämpfungsfunktion f m : ℝ 3 ℝ3 angewendet: f m v vi = { v vi v n v v i ⋅v max − e max −v v i − k ∣ ∣v v i∣ ≤ vmax −k ∣v v i∣ vmax −k f m v vi v max k{ v max − k v v i Abbildung 3.4: Die Dämpfungsfunktion f m Solange der Betrag der Geschwindigkeit den Wert v max − k nicht überschreitet, bleibt die Geschwindigkeit unverändert. Ist ihr Betrag jedoch höher, wird die Geschwindigkeit verringert. Dazu wird der normierte Geschwindigkeitsvektor Seite 34 Entwurf n v v i mit dem Term v max − e v max −v vi −k 3 multipliziert; der Betrag der Geschwindigkeit entspricht dann eben diesem Term, die Richtung bleibt unverändert. Die Eigenschaften dieses Terms können durch die etwas allgemeinere Funktion g x = x 0 − e x − x− k beschrieben werden. Es ist zunächst ersichtlich, dass der 0 Wertebereich von g für alle Eingaben x 0 durch die obere Schranke x 0 begrenzt ist, denn es ist lim g x = lim x 0 − e x − x−k = x 0 0 x ∞ x ∞ Die Funktion f m drosselt also den Betrag einer Geschwindigkeit auf den festgelegten Maximalwert, denn der durch g beschriebene Term wird auf alle Geschwindigkeiten mit einem Betrag ∣v v i ∣ v max−k 0 angewendet. Zudem ist der Übergang an den Funktionsdefinitionen stetig, denn es ist g x0 −k = x 0 − e x − x − k − k = x 0 − k 0 0 und g ' x = e x − x− k 0 ⇒ g ' x0 −k = e x − x −k − k = e 0 = 1 0 0 Durch diese Art der Dämpfung wird erreicht, dass auch zwischen zwei Geschwindigkeiten oberhalb des Maximalwertes noch unterschieden werden kann: Die größere der beiden Geschwindigkeiten wird nach der Drosselung immer noch größer sein, wenn auch bei zunehmender Überschreitung mit immer kleinerer Differenz. Die Konstante k kann in Abhängigkeit des gewünschten Maximalwertes für die Geschwindigkeit gewählt werden. Durch k = vmax / 3 werden beispielsweise alle Geschwindigkeiten gedrosselt, die sich im oberen Drittel des Maximalwertes oder darüber befinden. 3.4.4 Oberflächenspannung Die elastische Zugkraft der Gummioberfläche des Wasserballons wird, wie von der Aufgabenstellung vorgesehen, durch ein Feder–Masse-System umgesetzt. Dabei Seite 35 Entwurf 3 dienen sinnvollerweise die Edges zwischen den Vertices als Verbindungsfedern. Um möglichst unabhängig von einer bestimmten Strukturierung des verwendeten Geometriemodells zu bleiben, wird dabei jede Edge als Feder aufgefasst. Eine Feder zwischen zwei beweglichen Massepartikeln zieht diese gleichzeitig aufeinander zu. Im Rahmen des Simulationsschrittes wird aber zu jedem Zeitpunkt nur ein einzelnes Massepartikel betrachtet. Um die auf beide Partikel entstehenden Kräfte unabhängig voneinander bestimmen zu können, wird die Feder zwischen ihnen als eine doppelte Feder aufgefasst. Jeweils eines der beiden Massepartikel dient dabei als Ankerpunkt für die Kraftübertragung auf das andere. Abbildung 3.5: Geometriemodell mit Doppelfedern Eine Vertex erfährt also durch jede ihrer Nachbarvertices eine Zugkraft. Die Gesamtkraft folgt aus der Summe der Einzelkräfte. Ist N v i die Menge aller Nachbarvertices von v i und l :V ×V ℝ die initiale Federlänge, dann folgt aus Kapitel 2.3.2 (Feder–Masse-Systeme): f S v i = ∑ v j ∈ N vi E⋅v i − v j l vi , v j 3.4.5 Innendruck Die elastische Gummioberfläche des Wasserballons ist stets bestrebt, sich zusammenzuziehen. Damit sein Volumen erhalten bleibt, muss der Innendruck simuliert werden. Es wurden dafür zwei Methoden entwickelt. Seite 36 Entwurf 3 Die erste Methode ist rein physikalisch motiviert. Zieht sich das Gummi des Ballons zusammen, kommt es im Bereich der Oberfläche zu einer leichten Kompression des Wassers und damit zu einer Verringerung des Ballonvolumens um V. Anhand der Kompressibilität von Wasser kann zu der Volumenabnahme eine resultierende Drucksteigerung berechnet werden: [Vog99] p = − V ⋅V Durch den Überdruck im Inneren entsteht eine Kraft auf die Oberfläche, die Druckkraft. Diese greift auf der gesamten Oberfläche mit dem gleichen Betrag an und wirkt senkrecht nach außen zu dieser. Auf ein Flächenstück F i wirkt also die Kraft FP = p n⋅ i A F i , wobei n i Normaleneinheitsvektor an F i und A F i der Flächeninhalt von F i ist. Um zu der Druckkraft eine Beschleunigung zu berechnen, wird die Kraft gleichmäßig auf die umliegenden Massepartikel verteilt. Für das Flächenstück F i sind dies die drei Vertices, die das Dreieck um F i aufspannen. Die Gesamtkraft, die auf eine einzelne Vertex v j wirkt, ergibt sich somit aus der Summe aller Kräfte, die sie durch in ihr zusammenlaufende Flächenstücke erhält: f P v j = 1 ∑ p ni⋅A F i ∣ v j ∈ F i 3 Die zweite Methode zur Erhaltung des Innenvolumens nutzt aus, dass Wasser eine sehr geringe Kompressibilität hat. Es kann in der Größenordnung der Kräfte, wie sie an einem Wasserballon entstehen, als inkompressibel angesehen werden. Daraus folgt, dass das Volumen auch bei einer Deformation des Wasserballons konstant bleiben muss. Kommt es durch das Zusammenziehen der Oberfläche oder durch eine Kollision mit der Simulationsgeometrie zu einer Volumenabnahme, so wird durch eine Schätzfunktion ein Korrekturfaktor ermittelt. Es werden anschließend alle Vertices entlang ihrer Normalen um diesen Korrekturfaktor nach Seite 37 Entwurf 3 außen verschoben – dies entspricht einer Bewegung, die durch einen Überdruck im Inneren verursacht werden würde. Es ist allerdings kaum möglich, eine gute Schätzfunktion auf deduktive Weise zu erhalten, denn der Wasserballon kann sich in allen erdenklichen Lagen innerhalb der Szenengeometrie befinden. Liegt er z. B. auf einer Ebene auf, so werden die nach unten korrigierten Vertices bei der Kollisionserkennung umgehend wieder zurückgesetzt. Eine Schätzfunktion, die für den fallenden Wasserballon einen guten Korrekturwert ermitteln würde, kann das Volumen in einer solchen Situation nicht aufrecht erhalten. Es kann jedoch ausgenutzt werden, dass das Volumen einer Kugel in einem kubischen Verhältnis zu ihrem Radius steht. Das Verschieben einer Vertex entlang ihrer Normalen entspricht im Groben einer Verlängerung des Radi, weshalb die Volumendifferenz auch in einem kubischen Verhältnis zu dem Korrekturfaktor stehen sollte. Auf diese Weise kann zumindest ansatzweise ein angemessener Korrekturfaktor ermittelt werden. Um die Volumendifferenz aber tatsächlich auszugleichen, muss der Korrekturfaktor an die jeweilige Lage des Wasserballons angeglichen werden. Dies geschieht durch eine zeitliche Adaption. In jedem Simulationsschritt wird die Abweichung vom Zielvolumen sowie der daraufhin ermittelte Korrekturfaktor abgespeichert. Im nächsten Simulationsschritt wird überprüft, ob das Zielvolumen mit dem gespeicherten Korrekturfaktor erreicht werden konnte. Falls nicht, muss der neue Korrekturfaktor entsprechend größer gewählt werden. Seite 38 Entwurf 3 3.5 Eine Topologische Datenstruktur 3.5.1 Aufbau Bei der polygonalen Geometriedarstellung gehen üblicherweise Informationen über die Topologie der Geometrie verloren, da zum Rendern nur die Topografie benötigt wird. Diese kann schon mit einer Liste unzusammenhängender Faces beschrieben werden. [ESW97] Für die Simulation werden jedoch topologische Informationen zu den Vertices benötigt, da an die Geometrie diesbezüglich keine speziellen Anforderungen, wie etwa eine bestimmte Grundstruktur oder Ordnung, gestellt wurde. Die Topologie kann aus den Koordinaten der Vertices dynamisch rekonstruiert werden; diese Vorgehensweise ist aber nicht zweckmäßig, da der erforderliche Rechenaufwand den Einsatz in einer Echtzeit-Umgebung erschweren würde. Es wird also eine Datenstruktur benötigt, die die Topologie erhalten kann. Für das Feder–Masse-System sind dabei die Nachbarschaftsbeziehungen der Vertices wichtig: Zu jeder Vertex müssen alle über Edges erreichbaren Nachbarvertices abgefragt werden können. Diese Abfrage sollte zudem schnell sein, da in jedem Simulationsschritt für jede Vertex mindestens einmal alle Nachbarvertices ermittelt werden müssen. Die Vertices können dabei von der Datenstruktur in einer beliebigen Reihenfolge geliefert werden. Die Datenstruktur sollte zudem in der Lage sein, eine dynamische Anzahl von Elementen aufnehmen zu können, wie es etwa bei der Generierung geodätischer Kugeln benötigt wird. Die geforderten Laufzeiten und Eigenschaften lassen sofort an eine verkettete Liste denken. Ihre Größe kann dynamisch an die Menge der Daten angepasst werden und ein sequentielles Abfragen der Listenelemente läuft konstant in der Anzahl der Elemente. Damit die Topologie berücksichtigt werden kann, wurde das Konzept der verketteten Liste um Datenkapseln erweitert. Eine Datenkapsel ist dabei nichts anderes als eine Art Zeiger auf das eigentliche Datum, z. B. auf eine Vertex. Der Vorteil gegenüber einer normal verketteten Liste besteht darin, dass die Daten selbst nicht Bestandteil der Listenstruktur sind. Stattdessen wird für jedes einzufügende Element eine Datenkapsel erstellt, die auf Seite 39 Entwurf 3 das entsprechende Datum verweist. Die Datenkapseln selbst werden untereinander wie Elemente einer normalen Liste verkettet. Auf diese Weise kann ein Datum zur gleichen Zeit aus mehreren Listen referenziert werden, ohne dass es vervielfältigt werden müsste. Abbildung 3.6: Verkettete Liste mit Datenkapseln Für die Gesamtgeometrie des Wasserballons wird auf diese Weise eine Liste von Datenkapseln angelegt, in der jede Vertex der Geometrie genau einmal referenziert wird. Zudem wird für jede einzelne Vertex eine weitere Liste von Datenkapseln angelegt, die alle Nachbarvertices enthält. Eine Vertex taucht also genau einmal in der Liste für die Gesamtgeometrie auf und jeweils ein weiteres mal in der Liste jeder ihrer Nachbarvertices. Die geforderten Laufzeiten können von dieser Datenstruktur eingehalten werden. Die Abfrage aller vorhandenen Vertices benötigt jeweils zwei Schritte pro Vertex, wenn mit der ersten Datenkapsel der Liste begonnen und anschließend die Liste sequentiell durchlaufen wird: das Abfragen der Datenkapsel aus der Liste und ihre Auflösung zum Datum. Bei ∣V ∣ Vertices werden also insgesamt 2⋅∣V ∣ = O ∣V ∣ Schritte benötigt. Das Gleiche gilt für die Abfrage der Nachbarvertices. 3.5.2 Die Operation Face-Split Bei der Erzeugung von geodätischen Kugeln aus einem Ikosaeder wird eine Funktion zur Unterteilung der Faces benötigt. Um ein einzelnes Face zu unterteilen, müssen lediglich neue Vertices in der Mitte aller zum Face gehörenden Edges eingefügt werden. Diese bilden zusammen mit den schon vorhandenen Seite 40 Entwurf 3 Vertices die Ausgangspunkte für die Unterteilung. Durch eine voneinander unabhängige Teilung der Faces wird allerdings die Topologie der Geometrie zerstört, da zwei benachbarte Faces auf ihrer Verbindungs-Edge je zwei separate Vertices generieren: Abbildung 3.7: Durch Face-unabhängige Unterteilung wird die Topologie zerstört Bei einer Deformation der Oberfläche entstehen so Risse in der Geometrie, da die Faces nicht mehr untereinander verbunden sind. Um die Topologie zu erhalten, müssen die von einem Face eingefügten Vertices an die umliegenden Faces übermittelt werden. Die umliegenden Faces können leicht ermittelt werden, da die topologische Datenstruktur zu jeder Vertex eine Referenz auf alle Faces enthält, von denen sie ein Teil ist. Auf diese Weise werden bei der weiteren Unterteilung der Faces nur an solchen Edges neue Vertices eingefügt, die an ein noch nicht unterteiltes Face grenzen. Die Topologie bleibt dadurch erhalten. Abbildung 3.8: Eine Übermittlung der eingefügten Vertices auf die umliegenden Faces erhält die Topologie Seite 41 4 Umsetzung Kapitel 4 Umsetzung In diesem Kapitel wird beschrieben, wie das zuvor konzipierte Verfahren umgesetzt wurde. Es wird zunächst kurz die Funktionsweise von Szenengraphen erläutert und der bei der Implementierung verwendete Szenengraph OGRE vorgestellt. Anschließend wird die bei der Umsetzung verwendete Objektstruktur dargestellt. Danach werden zwei Nebeneffekte des Simulationsverfahrens beschrieben, die bei der Implementierung an einer UV-Sphere aufgetreten sind. Zum Abschluss des Kapitels werden Beispiele aus dem Quelltext der entwickelten C++ Anwendung aufgeführt und erläutert. Seite 42 Umsetzung 4 4.1 Der 3D-Szenengraph OGRE Vor der Implementierung muss eine Methode festgelegt werden, mit der die Simulation visuell umgesetzt wird, denn die weitere Implementierung wird diese Methode als Grundlage zur Ausgabe der berechneten Daten verwenden. Neben der Neuentwicklung einer Ausgabemechanik gibt es die Möglichkeit, auf eine vorhandene Grafikbibliothek wie z. B. DirectX oder OpenGL zurückzugreifen. Mittlerweile gibt es aber auch eine Vielzahl frei verfügbarer 3D-Szenengraphen. Ein Szenengraph ist eine hierarchische Datenstruktur, mit der der logische und räumliche Aufbau einer Szene beschrieben werden kann. Der Szenengraph enthält dazu einen Wurzelknoten, der als Basis für die Anordnung der Szene verwendet wird. An die Wurzel werden Kindknoten angefügt, die selbst wieder Wurzel eines Teilgraphen sein können. An die Knoten des Szenengraphen werden auch die Objekte der Szene eingefügt. Je nach Szenengraph können die Objekte dabei Geometrien, Lichter oder Materialien repräsentieren. Um eine hierarchische Modellierung zu ermöglichen, enthalten die Knoten des Szenengraphen jeweils eine Transformationsmatrix, die auf alle Objekte des Knotens selbst, aber auch auf alle Kindknoten angewendet wird. Dadurch werden an einem Objekt alle Transformationen durchgeführt, die die Knoten auf dem Pfad von seinem Vaterknoten bis zur Wurzel des Szenengraphens enthalten. So bewegen sich z. B. die Teile einer zusammengesetzten Geometrie zu dieser mit, wenn sie durch einen Teilgraphen beschrieben sind und die Wurzel des Teilgraphen eine Transformation enthält. BREINER hat in [Bre06] eine Studie über die Leistungsfähigkeit verschiedener aktueller Sznenengraphen erstellt. Dabei hat sich der OpenSource-Szenengraph OGRE als besonders vorteilhaft herauskristallisiert. (siehe auch [Bre04], [Sch06]) OGRE (Object-oriented Graphics Rendering Engine) ist ein flexibler, objektorientierter 3D-Szenengraph in C++, der speziell auf die Verwendung mit hardwarebeschleunigter 3D-Grafik hin entwickelt wurde. Daher wurde für die Implementierung eine Anbindung an OGRE als Methode zur visuellen Umsetzung der Simulation gewählt. Seite 43 Umsetzung 4 4.2 Objektstruktur 4.2.1 Allgemeiner Programmaufbau Die bei der Umsetzung erstellten Objekte lassen sich grob in die drei Kategorien Anbindung an Ogre, Geometrie und physikalische Kräfte einteilen. Die drei Programmbereiche werden durch die zentrale Klasse Core verknüpft. Force Base {abstract} Append(Force*): ApplyForces() = 0 void Og re ::Root Force Gravity Og re ::Re nde rWindow Force Sping Og re ::Came ra Force Pre ssure Og re ::Sce ne Mg r Og re ::Frame Liste ne r Frame Liste ne r frameStarted(Ogre::FrameEvent&): bool keyClicked(Ogre::KeyEvent*): void updateGUI(): void Core renderScene(): createScene(): destroyScene(): checkCollision(Ogre::Vector3*): void void void bool Ge oBase {abstract} Abbildung 4.1: Anbindung an OGRE und Struktur der Basisobjekte Die Klasse Core erstellt und verwaltet dabei die zentralen Objekte der anderen Klassen. Zu Beginn werden die benötigten Klassen zum Betrieb von OGRE instantiiert und initialisiert. Es wird dann mit der Klasse Ogre::SceneMgr die Simulationsszene angelegt; dazu gehören die Geometrie sowie Beleuchtung, Materialien und eine Instanz der Klasse Ogre::Camera, mit der Blickpunkt und -richtung festgelegt werden. Anschließend wird die Geometrie des Wasserballs generiert, was durch die abstrakte Klasse GeoBase bzw. die daran gebundenen Erbklassen für die verschiedenen implementierten Geometriemodelle veranlasst wird. Seite 44 Umsetzung 4 Schließlich werden die verschiedenen physikalischen Kräfte initialisiert. Als Schnittstelle dient hierzu die abstrakte Klasse ForceBase, die als Basisklasse für alle Kräfte verwendet wird. Die Klasse Core steuert zudem den Simulationsablauf. Sie besitzt dazu die Funktion renderScene(), von der aus jeweils ein Simulationsschritt eingeleitet wird. Die Funktion wird jeweils vor dem Rendervorgang für ein neues Einzelbild aufgerufen. Hierbei ist ein Objekt der Klasse FrameListener das Bindeglied zum Renderprozess von OGRE: Nachdem es registriert wurde, wird vor dem Rendern jedes neuen Einzelbildes die Funktion frameStarted() aufgerufen. Die Klasse FrameListener dient zudem der Abfrage von Tastatur- und Mausereignissen. 4.2.2 Geometriemodelle Als Basisklasse für die Geometriemodelle wurde die Klasse GeoBase implementiert. Durch sie wird in der Simulationsszene der Wasserballon dargestellt. Sie enthält die Geometriedaten der Ballonoberfläche und alle sonstigen zum Rendern benötigte Objekte, wie etwa verschiedene Materialien. Mit der Funktion draw() aktualisiert die Klasse ihre Geometriedaten im Szenegraphen von OGRE. Um eine möglichst hohe Geschwindigkeit zu erreichen, wird dazu – sofern verfügbar – ein Bereich im Speicher der Grafikhardware alloziiert. Darüber hinaus bietet GeoBase eine Schnittstelle für die physikalischen Kräfte. Sie stellt ihnen einen Zugang zu den Vertices des Geometriemodells bereit, die den Massepartikeln des Wasserballons entsprechen. Sie hält zudem Klassenvariablen zur Erfassung der physikalischen Eigenschaften des Ballons wie etwa seine Masse, Dichte oder Kompressibilität. Seite 45 Umsetzung 4 Og re ::Simple Re nde rable Ge oBase {abstract} mass: float volume: float area: float doPhysics(): void calcVolume(): void draw(): void createGeometry() = 0 Ge oUVSphe re radius: rings: segments: int int int createGeometry(): void Ge oIcosahe dron edgeLength: int Ve rte xGuard Face Guard createGeometry(): void Ge oGe ode stic subdivisions: int createGeometry(): void Abbildung 4.2: Objektstruktur der Geometriemodelle Auch bei der eigentlichen Simulation ist GeoBase beteiligt. Da alle Geometriemodelle die benötigten Eigenschaften haben, kann die Funktion zur Berechnung des aktuellen Volumens zentral untergebracht werden. Zudem wird in der Funktion doPhysics() die zweite Phase des Simulationsschrittes durchgeführt, bei dem die auf die Massepartikel wirkende Gesamtkraft in eine Bewegung umgesetzt wird. Die von GeoBase abgeleiteten Klassen für die einzelnen Geometriemodelle enthalten lediglich die modellspezifische Funktion createGeometry(), die die gleichnamige virtuelle Funktion der Basisklasse ersetzt und ihrem Namen gerecht wird, indem sie zu jedem Geometriemodell die entsprechenden Geometriedaten erzeugt. 4.2.3 Datenstrukturen für Topologie und physikalische Kräfte Damit die Topologie dauerhaft in der Datenstruktur für eine Geometrie gespeichert werden kann, wird das Konzept aus Kapitel 3.5 (Eine Topologische Seite 46 Umsetzung Datenstruktur) auf eine entsprechende Klassenstruktur übertragen. 4 Diese Klassenstruktur wird anschließend für die zu haltenden Daten angepasst. Auf diese Weise entstanden je ein Satz Klassen für Vertices und Faces. Die Klassen sind im Kern gleich aufgebaut, weswegen hier stellvertretend die Klassen zur Verwaltung der Vertices erläutert werden. Ve rte xGuard count: int root: VertexCapsule* Append(Vertex*): void getRoot(): VertexCapsule* releaseData(): void Ve rte xCapsule next: VertexCapsule* data: Vertex* setData(Vertex*): void getData(): Vertex* getNext(): VertexCapsule* ..... Ve rte xCapsule next: VertexCapsule* data: Vertex* setData(Vertex*): void getData(): Vertex* getNext(): VertexCapsule* Ve rte x position: normal: totalForce: velocity: mBuddies: mFaces: Ve rte x Ogre::Vector3 Ogre::Vector3 Ogre::Vector3 Ogre::Vector3 VertexGuard* FaceGuard* position: normal: totalForce: velocity: mBuddies: mFaces: Ogre::Vector3 Ogre::Vector3 Ogre::Vector3 Ogre::Vector3 VertexGuard* FaceGuard* Abbildung 4.3: Verkettete Liste mit Datenkapseln für Vertices Durch die Klasse VertexGuard werden die Datenkapseln in einer Listenstruktur organisiert. Es wurden hierfür entsprechende Funktionen zum Einfügen und Entfernen von Datenkapseln implementiert, wie sie sich auch bei normalen verketteten Listen finden. Die Klasse VertexCapsule bildet die Datenkapsel für eine einzelne Vertex. Sie enthält einen Zeiger auf die nächste und vorherige Datenkapsel sowie auf das gekapselte Datum, in diesem Falle ein Objekt der Klasse Vertex. Seite 47 Umsetzung 4 Die Klasse Vertex enthält schließlich alle Informationen, die zu einer Repräsentation des Massepartikels nötig sind. Dies sind neben der Position und der Einheitsnormalen auch die Geschwindigkeit und die Summe der Kräfte, die auf das Massepartikel einwirken. Die Informationen über die Topologie der Vertex wird durch eine weitere Instanz der Klasse VertexGuard sowie einer Instanz der Klasse FaceGuard integriert, die das Pendant zur Verwaltung von Faces ist. Wie das UML-Diagramm schon anzeigt, können Objekte der Klasse Vertex auch unabhängig von einer Datenkapsel bestehen. Dies ist z. B. nötig, wenn bei der Verfeinerung der geodätischen Kugel eine Seitenfläche aus der Geometrie entfernt wird, um sie durch eine Unterteilung zu ersetzen: Die entsprechende Klasse Face hält Datenkapseln auf alle Vertices, durch die ihre Edges beschrieben werden und würde diese Vertices mit löschen, wenn sie selbst entfernt wird. Da die Vertices aber unabhängig von den Datenkapseln verwaltet werden, ergibt sich das Problem, dass bei der Terminierung der Simulation der von den Vertices belegte Systemspeicher nicht wieder freigegeben wird. Daher enthält die Klasse VertexGuard zusätzlich die Funktion release(), die alle von ihr verkapselten Datenelemente löscht. Die Funktion wird bei der Terminierung sinnvollerweise von dem Objekt aufgerufen, das die Vertexdaten auch generiert hat: einer Instanz der Klasse GeoBase. Etwas abweichend wurde die Datenstruktur für die physikalischen Kräfte implementiert. Diese werden auch in einer Listenstruktur verwaltet, es ist jedoch keine Kapselung der Daten nötig. Für jede auf ein Massepartikel wirkende Kraft wird ein separates Objekt der Klasse Force erstellt, das die dem Massepartikel entsprechende Vertex referenziert. Für eine physikalische Kraft, die auf alle Massepartikel wirkt, werden also mehrere Objekte der Klasse Force instantiiert, je ein Objekt pro Vertex. Wenn gleichzeitig verschiedene Kräfte auf ein Massepartikel einwirken, wird die dem Massepartikel entsprechende Vertex von mehreren Instanzen der Klasse Force referenziert. Seite 48 Umsetzung Force Base {abstract} mForces: 4 Force Gravity init(): void ApplyForces(): void FaceGuard* Append(Force*): void ApplyForces() = 0 Force Guard mForces: FaceGuard* ApplyForces(): Force source: Vertex* target: Vertex* targetDirection: Ogre::Vector3 Apply(): void ... void Force source: Vertex* target: Vertex* targetDirection: Ogre::Vector3 Apply(): void Ve rte x ... Ve rte x Ve rte x Abbildung 4.4: Anbindung der Kräfte an die Vertices Seite 49 Umsetzung 4 4.3 Nebeneffekte des Simulationsverfahrens Die auf eine Vertex einwirkende elastische Gesamtkraft ist die Summe der Federkräfte ihrer Nachbarvertices. Hieraus ergibt sich das Problem, dass der Betrag der Kraft von der Anzahl der Nachbarn abhängig ist. Bei der regelmäßigen Struktur einer geodätischen Kugel fällt dieser Umstand kaum ins Gewicht, da alle Vertices entweder fünf oder sechs Nachbarn haben. Bei einer UV-Sphere kann diese Differenz jedoch deutlich größer ausfallen. Je nach gewählter Segmentanzahl haben die beiden Vertices an den Polkappen m, alle anderen Vertices genau sechs Nachbarn. Ein für die restlichen Vertices angemessener Dämpfungsfaktor ist mit der Vielzahl an Federkräften, die auf die Polkappen wirken, daher überfordert. Es kommt zu einer starken Oszillation, die sich schnell auf die ganze UV-Sphere ausbreitet: Abbildung 4.5: Zunehmende Oszillation im Geometriemodell einer UV-Sphere Um diese Reaktion auszugleichen, kann das Elastizitätsmodul einer auf eine Vertex wirkenden Feder durch die Anzahl der vorhandenen Nachbarvertices geteilt werden. In der Summe ist dann das Gesamt-Elastizitätsmodul aller Vertices gleich groß. Tatsächlich tritt die oben gezeigte Oszillation dadurch nicht mehr auf. Ein interessanter Effekt entsteht in der Annahme, dass die Oberfläche eines Ballons in befülltem Zustand bereits unter Spannung steht, d.h. dass die Ruhelänge der angesetzten Federn kleiner ist als ihre Länge zu Beginn der Simulation. Implementiert man Federn mit einer Ruhelänge von 0, zeigt eine UV-Sphäre ein zunächst sonderbares Verhalten: Seite 50 Umsetzung 4 Abbildung 4.6: Bildung der Minimalfläche Bei näherer Überlegung wird jedoch klar, dass sich die Oberfläche der UVSphäre der Form ihrer Minimalfläche nähert, diese jedoch von einer regelmäßigen Kugel abweicht. Ursache hierfür sind die Längenunterschiede der Federn zu Beginn der Simulation. Durch den Wegfall der Ruhelänge in der Berechnung sind alle Federn bestrebt, dieselbe möglichst kurze Dehnung zu erfahren. Innerhalb einiger Sekunden gleichen sie daher ihre Länge an, soweit es der Innendruck des Ballons zulässt. Seite 51 Umsetzung 4 4.4 Codebeispiele 4.4.1 Rekonstruktion der Vertextopologie Die meisten Algorithmen zur Generierung von Geometriedaten berücksichtigen nicht explizit die Topologie, wenn diese später nicht verwendet wird. [ESW97] Um diese Algorithmen trotzdem nutzen zu können, ist es sinnvoll, die Topologie der Vertices unabhängig vom verwendeten Algorithmus zu regenerieren. Dazu werden lediglich die generierten Faces benötigt: void GeoBase::prepareBuddies() { //get root capsule and face data FaceCapsule* cFace = this->mFaces->getRoot(); Face* face = cFace->getData(); //for all faces do for(std::size_t i = 0; i < this->mFaces->count(); i++) { //notify face vertices about their neighbours face->mVertices[0]->hasBuddies( face->mVertices[1], face->mVertices[2]); face->mVertices[1]->hasBuddies( face->mVertices[0], face->mVertices[2]); face->mVertices[2]->hasBuddies( face->mVertices[0], face->mVertices[1]); } //get next capsule and face data cFace = cFace->getNext(); face = cFace->getData(); } Die Funktion prepareBuddies() informiert jede Vertex eines Faces über ihre beiden Nachbarvertices. Die jeweilige Vertex überprüft dann, ob ihr die mitgeteilten Nachbarn schon bekannt sind und nimmt diese falls nötig in ihre Nachbarliste auf. 4.4.2 Berechnung der Normalenvektoren Bei der Simulation des Wasserballons müssen nach jedem Simulationsschritt die Normalenvektoren auf allen Vertices und Faces neu berechnet werden, da die Gummioberfläche vielleicht deformiert wurde. Eine schnelle Möglichkeit, die Seite 52 Umsetzung 4 Normale zu einem Face zu erhalten, ist das Kreuzprodukt zweier Randvektoren zu bilden, denn es ist senkrecht zu der von den Vektoren aufgespannten Ebene. Der Ergebnisvektor muss anschließend nur normiert werden, was durch eine Division durch seine Länge erreicht wird: void Face::generateNormal() { //get edge vectors Ogre::Vector3 v = this->mVertices[1]->Position this->mVertices[0]->Position; Ogre::Vector3 w = this->mVertices[2]->Position this->mVertices[0]->Position; //calculate face normal this->Normal = v.crossProduct(w); this->Normal.normalise(); } Die Normalen zu den Vertices können anhand der Normalen der Faces berechnet werden, die in ihr zusammenlaufen. Die Normalen werden dazu vektoriell addiert und das Ergebis normalisiert: void Vertex::generateNormal() { //we need at least one face if(this->mFaces->hasNoData()) return; //calculate average of face normals FaceCapsule* cFace = this->mFaces->getRoot(); for(std::size_t i = 0; i < this->mFaces->count(); i++) { this->Normal += cFace->getData()->Normal; cFace = cFace->getNext(); } this->Normal.normalise(); } 4.4.3 Volumenberechnung Ebenfalls neu berechnet werden muss nach jedem Simulationsschritt das Volumen des Wasserballons. Dazu wird das in Kapitel 2.2 (Volumenberechnung Seite 53 Umsetzung 4 mit dem Gaußschen Integralsatz) vorgestellte Verfahren angewendet. Als Nebenprodukt wird dabei gleichzeitig der Flächeninhalt der einzelnen Faces und der gesamten Oberfläche ermittelt: void GeoBase::calcVolume() { //reset values from last step this->Volume = 0.0f; this->Area = 0.0f; float faceA = 0.0f; //get root capsle and face data FaceCapsule* cFace = this->mFaces->getRoot(); Face* face = cFace->getData(); //for all faces do for(std::size_t i = 0; i < this->mFaces->count(); i++) { //calc face area (doubled value) faceA = cFace->getData()->fastAreaDbl(); this->Area += faceA; //calc volume with gauss's theorem this->Volume += faceA * face->Normal.dotProduct( face->mVertices[0]->Position); //get next capsule and face data cFace = cFace->getNext(); face = cFace->getData(); } //calculate final area and volume this->Area /= 2.0f; this->Volume = Ogre::Math::Abs(this->Volume) / 6.0f; } Die Fläche eines einzelnen Faces wird durch das Kreuzprodukt ermittelt: float Face::fastAreaDbl() { //get edge vectors Ogre::Vector3 v = this->mVertices[1]->Position this->mVertices[0]->Position; Ogre::Vector3 w = this->mVertices[2]->Position this->mVertices[0]->Position; //calculate face area (doubled value) return v.crossProduct(w).length(); } Seite 54 Umsetzung 4 4.4.4 Simulationsschritt In der ersten Phase des Simulationsschrittes werden alle Einzelkräfte berechnet. Ist die jeweilige Kraft in der Simulationsumgebung aktiviert, so wird sie mittels der Funktion ForceBase::Apply() auf das Geometriemodell übertragen: //apply gravity force if(this->forceGravity) this->mGravity->Apply(dt); //apply volume pressure force if(this->forcePressure) this->mPressure->Apply(dt); //apply spring force if(this->forceSpring) this->mSpring->Apply(dt); Anschließend erfolgt die zweite Phase des Simulationsschrittes. Diese wird durch die Funktion GeoBase::doPhysics() durchgeführt: void GeoBase::doPhysics(double dt) { [...] //global vertex position vertex->Position += vertex->velocity * dt; //transform force into acceleration a = vertex->totalForce / this->VertexMass; //calculate local velocity dV = a * dt; //local vertex position dS = 0.5f * dV * dt; vertex->Position += dS; //do collision detection this->mCore->checkCollision(&vertex->Position); //apply dampers vertex->velocity *= this->semilogDamp( vertex->velocity.normalise()); vertex->velocity -= vertex->velocity * this->mCore->envDamp * dt; } Seite 55 Bewertung 5 5 Bewertung Kapitel 5 Bewertung In diesem Kapitel werden die Ergebnisse vorgestellt, die bei der Umsetzung des entwickelten Simulationsverfahrens erzielt wurden. Zu Beginn wird mit Screenshots aus der entwickelten Anwendung ein visueller Eindruck gegeben. Es folgt eine Analyse über die Laufzeit des Verfahrens. Danach werden zur Bewertung der Berechnungsgenauigkeit Messwerte produziert und denen einer idealen physikalischen Simulation gegenübergestellt. Zum Abschluss werden die Nachteile des Verfahrens diskutiert. Seite 56 Bewertung 5 5.1 Ergebnisse An dieser Stelle sollen statt vieler Worte zunächst einige Bilder einen Eindruck von dem vermitteln, was im Rahmen dieser Arbeit erreicht wurde. Im Folgenden werden zwei Bewegungsabläufe eines simulierten Wasserballons bei einem Aufprall auf eine Ebene gezeigt. Der Wasserballon fiel dabei jeweils aus einem Meter Höhe bei Normalfallbeschleunigung. In der ersten Simulation wurde ein relativ starkes Elastizitätsmodul verwendet, wie es auch für einen echten Wasserballon charakteristisch ist: [Dom00] Abbildung 5.1: Aufprall eines Wasserballons mit starkem Elastizitätsmodul In der zweiten Simulation wurde ein deutlich niedrigeres Elastizitätsmodul verwendet, was den Ballon zeitweise wie einen aufschlagenden Wassertropfen aussehen lässt: Seite 57 Bewertung 5 Abbildung 5.2: Aufprall eines Wasserballons mit niedrigem Elastizitätsmodul Leider gehörte nicht selten auch das, was das letzte Bild zeigt, zu den gemachten Erfahrungen bei der Implementierung – eine aufgrund zu starker Oszillation außer Kontrolle geratene Simulation: Abbildung 5.3: Nicht mehr kontrollierbare Simulation Seite 58 Bewertung 5 5.2 Laufzeitanalyse Während der Durchführung eines Simulationsschrittes werden folgende Werte berechnet: • Normalen für alle Vertices und Faces • Flächeninhalt für alle Faces und die Gesamtoberfläche • Innenvolumen • Einzelkräfte auf jedes Massepartikel • Gesamtkraft auf jedes Massepartikel • neue Position für jedes Massepartikel • neue Geschwindigkeit für jedes Massepartikel Zur Berechnung der Normalen eines Faces wird das Kreuzprodukt aus zwei aufspannenden Vektoren gebildet und anschließend normiert. Pro Face fällt dafür eine konstante Zahl von Rechenschritten an. Nachdem die Normalen auf allen Faces ermittelt worden sind, werden die Normalen der Vertices bestimmt. Für jede Vertex werden dazu die Normalen der in ihr zusammenlaufenden Faces vektoriell addiert und der Ergebnisvektor normiert, wofür pro angrenzendem Face konstante Laufzeit benötigt wird. Während der Berechnung aller Normalen wird jedes Face und jede Vertex einmal in der Datenstruktur aufgesucht. Zusätzlich werden für jede Vertex alle angrenzenden Faces noch einmal besucht. Da für das Geometriemodell eine Dreiecksstruktur vorausgesetzt wurde, wird infolge dessen jedes Face genau drei mal aufgesucht, nämlich von seinen drei Vertices. Alle Anfragen werden sequentiell und in einer beliebiger Reihenfolge durchgeführt, somit erreicht die eingesetzte Datenstruktur eine konstante Laufzeit pro abgefragtem Element (die Vertices haben eine lokale Referenz auf ihre Faces). Somit ergibt sich als Laufzeit zum Berechnen aller Normalen c1⋅∣F∣ c 2⋅∣V ∣ 3 c 3⋅∣F ∣ c 4⋅∣ F∣ ∣V ∣ = O ∣ F∣ ∣V ∣ Bevor das Innenvolumen bestimmt werden kann, muss zunächst der Flächeninhalt aller Faces einzeln ermittelt werden. Dazu wird erneut das Seite 59 Bewertung 5 Kreuzprodukt berechnet, nur ohne anschließende Normierung. Die Flächeninhalte werden während der Berechnung der Einzelflächen aufsummiert, so dass zur Berechnung der Einzelflächen und der Gesamtfläche eine konstante Laufzeit pro Face benötigt wird. Zur Berechnung des Volumens wird jede Einzelfläche mit dem Skalarprodukt aus einem Flächenpunkt und der Flächennormalen multipliziert und die jeweiligen Ergebnisse aufsummiert. Da bei der Berechnung der Flächeninhalte und des Volumens ebenfalls keine bestimmte Reihenfolge der Faces eingehalten werden muss, beträgt die Laufzeit hierfür c 1⋅∣F∣ c 2⋅∣F ∣ = O ∣F∣ Bei der Übertragung der physikalischen Kräfte kommt es je nach Art der Kraft zu unterschiedlichen Laufzeiten. Die Gravitationskraft überträgt je eine Einzelkraft auf jedes Massepartikel, benötigt also konstante Laufzeit pro Vertex. Für den Innendruck wird zunächst einmalig in konstanter Zeit der Überdruck bzw. der Korrekturfaktor ermittelt. Anschließend wird jedes Face einmal aufgesucht und die resultierende Kraft auf die drei Vertices des Faces übertragen, was pro Vertex eine konstante Zahl an Rechenschritten benötigt. Für die elastische Zugkraft der Gummioberfläche wird wegen der Doppelfedern jede Edge zweimal ausgewertet, d.h. es wird ihre relative Längenänderung und die daraus resultierende Zugkraft auf die entsprechenden Vertices berechnet. Da jede Edge immer zu genau zwei Faces gehört, ist die benötigte Laufzeit zur Ermittlung aller Einzelkräfte durch c1⋅∣V ∣ c 2 3 c 3⋅∣F ∣ 3 c4⋅∣ F∣ = O ∣ F∣ ∣V ∣ gegeben. Die Ermittlung der Gesamtkraft für jedes Massepartikel erfolgt simultan zur Ermittlung der Einzelkräfte; diese werden bei der Übertragung auf eine Vertex aufsummiert, so dass anschließend neben allen Einzelkräften auch die Gesamtkraft ermittelt ist. Die benötigte Laufzeit ist in der obigen Gleichung also bereits enthalten. Die benötigte Zeit zur Bestimmung der neuen Position und Geschwindigkeit sowie die Durchführung der Kollisionkorrektur benötigt bei dem hier verwendeten Erkennungsverfahren ebenfalls eine konstante Laufzeit pro Massepartikel, so dass die Durchführung eines Simulationsschrittes insgesamt O ∣ F∣ ∣V ∣ O ∣F∣ O ∣F∣ ∣V ∣ c 1⋅∣V ∣ = O ∣ F∣ ∣V ∣ Seite 60 Bewertung 5 Rechenschritte erfordert. Die benötigte Zeit für einen Simulationsschritt ist also linear in der Komplexität des verwendeten Geometriemodells. Durch die zusätzliche Verwendung von Hardware-Vertex-Buffern und Backface-Culling kann eine hardwarebeschleunigte Darstellung zudem voll ausgenutzt werden. Das Verfahren eignet sich von seiner Performance also sehr gut für eine interaktive Simulationsumgebung. Auf einem handelsüblichen Desktop-Computer mit 2,4 GHz Prozessor und 500 MHz 3D-Grafikbeschleuniger konnten bei einem Geometriemodell aus 20.000 Polygonen etwa 15 Einzelbilder pro Sekunde generiert werden. Einen runden Eindruck erhält man je nach Geometriemodell ab etwa 2.000 Polygonen. Die hierbei erreichte Bildrate betrug etwa 800 Einzelbilder pro Sekunde. Seite 61 Bewertung 5 5.3 Berechnungsgenauigkeit Das im Rahmen dieser Arbeit entwickelte Verfahren zur Simulation von Massepartikel beruht auf vereinfachten physikalischen Gegebenheiten. Es muss daher mit einer Abweichung der Berechnungsergebnisse von denen einer idealen Simulation gerechnet werden. Um die auftretenden Abweichungen genauer untersuchen zu können, wurde ein Programm zur Simulation eines einfachen Feder–Masse-System implementiert. Die Simulation wurde dabei anhand einer ideal konstruierten Bewegungsgleichung durchgeführt, wie sie in Kapitel 2.3.2 (Feder–Masse-Systeme) behandelt wurde. Zudem wurde das im Rahmen dieser Arbeit entwickelte Verfahren integriert. Die erwartete Abweichung ist, wie in Kapitel 3.3.2 (Simulation der auftretenden Kräfte) erläutert, Abhängig von der Länge der Berechnungsintervalle. Diese Vermutung wurde durch die erhaltenen Messwerte bestätigt: Abbildung 5.4: Simulation eines Feder–Masse-Systems über eine Zeitdauer von 10 Sekunden mit verschieden Zeitintervallen. Oben: 1 ms und 10 ms Rechts: 100 ms Die grüne Kurve zeigt die Schwingung eines idealen Systems, die rote die des vereinfacht simulierten. Bei Zeitintervallen von 1 ms Dauer ist fast keine Abweichung zu erkennen. Bei 10 ms und 100 ms kann ein Anstieg der Amplitude beobachtet werden. Eine Erklärung Seite 62 Bewertung 5 hierfür ist die Simulation der Massepartikel zu diskreten Zeitpunkten. Fällt nicht zufällig der Zeitpunkt, an dem sich die Abwärtsbewegung des Massepartikels in eine Aufwärtsbewegung ändert, genau auf eine Intervallgrenze, so wird es im folgenden Zeitintervall weiter ausgelenkt, als es in einer idealen Simulation der Fall sein würde. Die Zugkraft der Feder wird dadurch erhöht; folglich wird das Massepartikel im weiteren Simulationsverlauf mit einer entsprechend stärkeren Beschleunigung nach oben bewegt. Seine maximale Auslenkung nach oben fällt dadurch um den Teil größer aus, den es vorher zu weit nach unten bewegt wurde. Kombiniert mit weiteren Abweichungen entsteht ein sich selbst verstärkender Prozess, der immer größer werdende Auslenkungen zur Folge hat. Die Messkurve für Zeitintervalle von 100 ms zeigt eine solche Eskalation: Die Simulation ist nicht mehr kontrollierbar. Dieser Effekt kann auch bei der Anwendung des Verfahrens auf den Wasserballon beobachtet werden. Es stellt sich daher die Frage, welche Gegenmaßnahmen sich zu einer effektiven Stabilisierung des Verfahrens eignen. Dabei hat sich eine Dämpfung des Systems als bislang beste Methode erwiesen. Durch die Drosselung auf eine Maximalgeschwindigkeit, wie es im Kapitel 3.4.3 (Dämpfung) beschrieben wurde, kann eine Stabilisierung des Systems unabhängig von der Intervalldauer bewirkt werden: Abbildung 5.5: Dämpfung durch eine Maximalgeschwindigkeit Die Charakteristik des Systems bleibt erhalten, es kommt allerdings zu einer Phasenverschiebung der Bewegungskurve. Seite 63 Bewertung 5 Eine lineare Dämpfung in Abhängigkeit von der aktuellen Geschwindigkeit eines Massepartikels, wie ebenfalls in Kapitel 3.4.3 beschrieben, bewirkt sogar noch bessere Ergebnisse. Abbildung 5.6: Empirisch ermittelte Dämpfungsfaktoren. Links (für 10 ms): 0.99925. Rechts (für 100 ms): 0.9685. Wie die Messwerte zeigen, verläuft die Bewegungskurve jetzt nahezu identisch zu der eines idealen Systems. Die eingesetzten Dämpfungsfaktoren wurden allerdings auf empirische Weise ermittelt und lassen sich nicht ohne weiteres auf andere Simulationsobjekte übertragen. Seite 64 5 Bewertung 5.4 Nachteile des Verfahrens Während der Implementierung des Verfahrens hat sich gezeigt, dass es mitunter sehr schwierig ist, die verschiedenen physikalischen Kräfte in Einklang zu bringen. Nach [Vog99] führt jede Abweichung von einem stabilen Gleichgewichtszustand zunächst zu einer proportionalen Rücktreibungskraft, die in Abwesenheit von Reibung zu harmonischen Schwingungen führt. Dieser Effekt führt in Kombination mit der niedrigen Kompressibilität des Wassers zu einem äußerst instabilen System. Schon bei einer geringen Abnahme des Innenvolumens entstehen so große Kräfte auf die Massepartikel, dass diese regelrecht nach außen katapultiert werden. Dabei kommt es zu einer sich selbst verstärkenden Oszillation, wie sie im vorangehenden Kapitel auch für die Feder–Masse-Systeme beschrieben wird. Um die Simulation durchführen zu können, müssen in der Praxis daher deutlich niedrigere Werte für die Kompressibilität des Wassers angenommen werden. Zudem muss, wie in Kapitel 2.3.3 (Feder–Masse-System mit Dämpfer) erläutert, eine hohe Dämpfung eingesetzt werden, um eine systembedingte Oszillation durch das Feder–Masse-System zu unterdrücken. Von weiteren Ansätzen, die zur Stabilisierung der Simulation testweise implementiert wurden, haben sich die in Kapitel 3.4.3 (Dämpfung) entwickelte Funktion zur Erzwingung einer Maximalgeschwindigkeit sowie die in Kapitel 3.4.5 (Innendruck) beschriebene Anwendung eines Korrekturfaktors am ehesten bewährt. Die letztgenannte Methode führt dabei noch zu optischen Nebeneffekten, da die Positionen der Vertices direkt beeinflusst werden und somit kein kontinuierlich erscheinender Bewegungsverlauf erzeugt wird; sie bietet aber wahrscheinlich die beste Ausgangsbasis für eine Verbesserung des Verfahrens in dieser Hinsicht. Ein weiterer Nachteil ist die nur schrittweise Ausbreitung eingebrachter Kräfte über das Geometriemodell, wie es auch bei der in Kapitel 2.4.3 (Wasseroberfläche und Stoff mit Feder–Masse-Systemen) vorgestellten Publikation der Fall ist. Es ist die Folge aus der Betrachtung der einzelnen Massepartikel zu diskreten Zeitpunkten und ihre Unabhängigkeit zu anderen Massepartikeln innerhalb der dazwischenliegenden Zeitfenster. Dieser Nachteil kann allerdings in einer Echtzeit- Seite 65 Bewertung 5 Anwendung mit dem Schwerpunkt einer schnellen Berechnung vernachlässigt werden, denn der Einfluss einer eingebrachten Kraft nimmt mit zunehmender Entfernung von den angegriffenen Massepartikel ab. Je größer also der Einfluss einer eingebrachten Kraft auf ein Massepartikel ist, desto schneller wird sie sich über das Geometriemodell zu diesem ausgebreitet haben. Weiterhin können durch die Art der Berechnung keine Vorhersagen über den Zustand des Wasserballons zu einem zukünftigen Zeitpunkt gemacht werden, ohne dass die Simulation schrittweise bis zu diesem Zeitpunkt durchgeführt wird. In einer interaktiven Simulationsumgebung verliert eine Vorhersage jedoch dadurch an Bedeutung, dass die Rahmenbedingungen jederzeit geändert werden können und eine Vorhersage damit hinfällig wäre. Vorherige Simulationsverläufe können mit der in Kapitel 3.3.2 (Simulation der auftretenden Kräfte) beschriebenen Wahl konstant langer Zeitintervalle reproduziert werden. Schließlich ergeben sich durch die Polygondarstellung Ungenauigkeiten bei der Kollisionserkennung. So kann es vorkommen, dass der Wasserballon eine Spitze in der Szenengeometrie durchdringt, ohne dass dies erkannt wird – etwa wenn die Spitze mittig auf eine Seitenfläche trifft und sich die umliegenden Vertices noch außerhalb der Szenengeometrie befinden. Eine solche Situation kann nur von einer doppelseitigen Kollisionserkennung korrekt bewertet werden. Aber auch dann sind die Möglichkeiten einer Angleichung der Ballonoberfläche an die Szenengeometrie begrenzt, da hierfür die Seitenflächen des verwendeten Geometriemodells eine genau an die unterliegende Struktur angepasste Triangulierung aufweisen müsste. Abbildung 5.7: Fehlgeschlagene Kollisionserkennung Seite 66 6 Ausblick Kapitel 6 Ausblick Dieses Kapitel beschreibt mögliche Erweiterungen und Verbesserungen, die an dem Simulationsverfahren vorgenommen werden können. Es wird skizziert, wie Haft- und Gleitreibungskräfte in die Simulationsumgebung einbezogen werden können, sowie ein Ansatz gegeben, mit dem unter Umständen die Genauigkeit der Berechnung verbessert werden kann. Zum Abschluss der Diplomarbeit wird in einem Fazit auf die Ergebnisse der Arbeit zurückgeblickt. Seite 67 Ausblick 6 6.1 Verbesserungen 6.1.1 Einbindung einer Gleit- und Haftreibungskraft Die Konzeption des entwickelten Verfahrens erlaubt die Eingliederung weiterer physikalischer Kräfte in die Simulation. Im Folgenden wird eine Möglichkeit skizziert, um Haft- und Gleitreibungskräfte zu integrieren. Eine Haft- bzw. Gleitreibungskraft entsteht immer dann, wenn es zu einer Berührung zweier Oberflächen kommt. Die Grundlage für diese Art von Kraft wird daher die Kollisionserkennung sein. Kommt es zu einer Kollision eines Massepartikels mit der Szenengeometrie, so wird dieses mit einem entsprechenden Hinweis markiert. Im folgenden Simulationsschritt wird überprüft, ob ein markiertes Massepartikel erneut mit der Szenengeometrie kollidiert ist. Ist dies der Fall, muss sich das Massepartikel im letzten Zeitintervall entlang der Oberfläche der Szenengeometrie bewegt und damit einer Gleitreibungskraft ausgesetzt haben. t Fg v F ges FN Abbildung 6.1: Gleitreibungskraft Um den Betrag der Krafteinwirkung zu ermitteln, wird anhand der Gesamtkraft, die auf das Massepartikel einwirkt, der senkrecht zur zurückgelegten Strecke wirksame Anteil ermittelt. Wird dabei die Haftreibungskraft überschritten, so wird die Position des Massepartikels wie bei einer normalen Kollisionskorrektur versetzt und eine entsprechende Gleitreibungskraft entgegengesetzt der Bewegungsrichtung auf es übertragen. Bleibt die Haftreibungskraft unterschritten, wird das Massepartikel auf seine Ausgangsposition zurückgesetzt, da es sich im Zeitintervall nicht bewegen konnte. Seite 68 Ausblick 6 6.1.2 Mögliche Erhöhung der Berechnungsgenauigkeit Eine Vereinfachung bei der Berechnung basiert auf der Annahme, dass die auf ein Massepartikel wirkende Beschleunigung innerhalb eines Zeitintervalls konstant ist, obwohl sich das Massepartikel innerhalb des Zeitintervalls offensichtlich bewegt und damit die auf sich wirkenden Kräfte beeinflusst hat. Von der grundlegenden Vorgehensweise, ein Massepartikel unabhängig von anderen Partikeln zu betrachten, kann, ohne immense Geschwindigkeitseinbußen hinnehmen zu müssen, nicht abgesehen werden. Für jedes Zeitintervall sind aber zumindest die Werte der aktuellen und vorherigen Beschleunigung bekannt. Es wird dennoch bei der Simulation davon ausgegangen, dass die Beschleunigung konstant ist und der aktuelle Wert für die Berechnung verwendet. Eine Interpolation zwischen den beiden Werten dürfte eine größere Genauigkeit ergeben. Möglich wäre auch, innerhalb eines Zeitfensters eine Differentialgleichung für jedes Massepartikel aufzustellen, die die jeweils anderen Partikel als unbeweglich ansieht und nur in einem lokalen Kontext gelöst wird. Seite 69 Ausblick 6 6.2 Fazit Das vorgestellte Verfahren zur Simulation eines wassergefüllten Ballons eignet sich durch seine lineare Laufzeit und ausreichende Berechnungsgenauigkeit sehr gut zum Einsatz in einer interaktiven Simulationsumgebung. Die schnelle Laufzeit wird allerdings durch eine Vereinfachung der physikalischen Gegebenheiten erkauft. Das Verfahren ist daher nur bedingt in Situationen einsetzbar, in denen eine hohe Berechnungsgenauigkeit im Vordergrund steht. Durch die vereinfachte Berechnung entstehen zudem einige Nebeneffekte, die durch Korrekturverfahren ausgeglichen werden müssen. Es gelingt mit dem Simulationsverfahren trotzdem, charakteristische Bewegungsmuster eines Wasserballons nachzubilden. Die Berechnungsgenauigkeit kann innerhalb bestimmter Grenzen durch die Wahl kurzer Zeitintervalle und hoch aufgelöster Geometriemodelle beeinflusst werden. Die Verwendung einer geodätischen Kugel brachte hierbei die besten Resultate und bietet zudem eine gute Grundlage für die Anwendung von Level-ofDetail-Verfahren. [Hom06] Durch die Möglichkeit, vorangegangene Simulationsabläufe reproduzieren zu können, erschließen sich zusätzliche Anwendungsgebiete im Bereich der EchtzeitComputergrafik. Die Einsetzbarkeit kann noch erweitert werden, wenn es gelingt, das Innenvolumen des Ballons konstant zu halten. Auf dieser Grundlage müsste die Verwendung in nicht-Echtzeit-Simulationen neu bewertet werden. Interessante Möglichkeiten ergeben sich bei der Simulation biologischer Strukturen: Eine Zelle kann als wassergefüllter Körper mit einer elastischen Oberfläche betrachtet werden. [Dom00] Mit der hohen Berechnungsgeschwindigkeit des entwickelten Verfahrens könnten dann mehrschichtige Zellstrukturen bis hin zu ganzen Gewebepartien simuliert werden. Durch die verwendete Objektstruktur kann das Verfahren gut erweitert werden. Durch die Implementierung mit Hilfe des Szenengraphen OGRE besteht zudem die Möglichkeit, den entwickelten Programmcode auf verschiedenen Betriebssystemen (derzeit Windows, Linux und Mac OSX) einzusetzen. Seite 70 A Literaturverzeichnis 7 Anhang A: Literaturverzeichnis Anhang A Literaturverzeichnis [BM01] Brüderlin, Beat; Meier, Andreas: Computergrafik und Geometrisches Modellieren. Teubner Verlag, 2001. [Bre04] Breiner, Tobias: Openscenegraph, openSG, RealiMation, VirTools und Java3D (Interner Bericht). Johann-Wolfgang-GoetheUniversität Frankfurt, 2004. [Bre06] Breiner, Tobias: Open-Source-Szenegraphen im Vergleich (Interner Bericht). Johann-Wolfgang-Goethe-Universität Frankfurt, 2006. [Dom00] Domke, Jan: Mikromechanische Eigenschaftendünner Polymerfilme und lebender Zellen (Dissertation). Ludwig-Maximilians-Universität München, 2000. [Edw01] Edwards, P.: Mass-Spring-Damper Systems: The Theory. Bournemouth University, 2001. [ESW97] Encarnação, J.; Straßer, W.; Klein, R: Graphische Datenverarbeitung 2: Modellierung komplexer Objekte. Kapitel 1.3.6 Datenstrukturen, Seiten 37-40. R. Oldenburg Verlag, 1997. [FD97] Fischer, Tilo; Dorn, Hans-Jerg: Physikalische Formeln und Daten. Ernst Klett Verlag, 1997. [FDF97] Foley, James D.; Dam van, Andries; Feiner, Steven K.; Hughes, John F.: Computer Graphics. Principles and Practice in C. Kapitel 5.5 Efficiency, Seiten 212 f. Addison-Wesley Professional, 1997. [Fom00] Fomitchev, Max I.: 2D Surface Deformation. http://www.gamasutra.com/features/20000216/deformation_pfv.ht m (2000) [Gol94] Goldman, Ronald N.: Area of planar Polygons and Volume of Polyhedra. In: Graphics Gems II. Hrsg. von James Arvo. AP Professional, 1994. [Hom06] Homann, Jörg: Fraktale Planetengenerierung (Diplomarbeit). Johann-Wolfgang-Goethe-Universität Frankfurt, 2006. [MH99] Möller, Thomas; Haines, Eric: Real-Time Rendering. Kapitel 10 Intersection Test Methods, Seiten 289-339. AK Peters, 1999. Seite 71 A Literaturverzeichnis [MW99] Merzinger, Gerhard; Wirth, Thomas: Repetitorium der höheren Mathematik. Binomi Verlag, 1999. [NT98] Nedel, Luciana Porcher; Thalmann, Daniel: Real Time Muscle Deformations Using Mass-Spring Systems. EPFL - Swiss Federal Institute of Technology, 1998. [Sch06] Schmidt, Björn: Raytracing und Szenegraphen (Diplomarbeit). Johann-Wolfgang-Goethe-Universität Frankfurt, 2006. [Str98] Strauss, Daryll: Visuelle High-Tech-Effekte mit Linux. iX Archiv 3/98, 1998. [Vog99] Vogel, Helmut: Gerthsen Physik. Springer Verlag, 1999. [www01] Wikipedia: Platonischer Körper. http://de.wikipedia.org/wiki/Platonischer_Körper (2006) [www02] Wikipedia: Skalarprodukt. http://de.wikipedia.org/wiki/Skalarprodukt (2006) [www03] Wikipedia: Bonaventura Cavalieri. http://de.wikipedia.org/wiki/Bonaventura_Cavalieri (2006) [www04] Wikipedia: Hookesches Gesetz. http://de.wikipedia.org/wiki/Hookesches_Gesetz (2006) [www05] Wikipedia: Harmonische Schwingung. http://de.wikipedia.org/wiki/Harmonische_Schwingung (2006) Seite 72 Verwendete Software B 8 Anhang B: Verwendete Software Anhang B Verwendete Software Textverarbeitung, Layout, Erstellung und Aufbereitung von Vektorgrafiken: OpenOffice (http://www.openoffice.org) Implementierung, Prototyping: Eclipse (http://www.eclipse.org) CDT (http://www.eclipse.org/cdt) MinGW (http://www.mingw.org) GCC (http://gcc.gnu.org) OGRE (http://www.ogre3d.org) Python (http://www.python.org) FreeBasic (http://www.freebasic.net) 3D-Modelling, Export und Aufbereitung von Vektorgrafiken, Aufbereitung von Rastergrafiken: Blender (http://www.blender.org) Inkscape (http://www.inkscape.org) The GIMP (http://www.gimp.org) Seite 73