Adaptive Echtzeit–Simulation von Stoff und Haaren Diplomarbeit im
Transcrição
Adaptive Echtzeit–Simulation von Stoff und Haaren Diplomarbeit im
Adaptive Echtzeit–Simulation von Stoff und Haaren Diplomarbeit im Fach Informatik vorgelegt von Anne-Kathrin Braun Institut für Computervisualistik Arbeitsgruppe Computergrafik Abteilung für Virtuelle und Erweiterte Realität Prüfer: Prof. Dr. –Ing. Stefan Müller Betreuer: Dipl. –Math. Alexander Rettig Januar 2005 2 Eidesstattliche Erklärung Hiermit erkläre ich an Eides statt, dass die vorliegende Arbeit selbständig verfasst wurde und keine anderen als die angegebenen Quellen und Hilfsmittel verwendet wurden. Die Arbeit wurde bisher in gleicher oder ähnlicher Form keiner anderen Prüfungsbehörde vorgelegt und auch nicht veröffentlicht. Koblenz, den 31.01.05 Unterschrift 3 Danksagung An dieser Stelle möchte ich mich bei allen bedanken, die mich bei der Anfertigung dieser Arbeit unterstützt haben. Mein Dank geht an die Mitarbeiter der Abteilung für Virtuelle und Erweiterte Realität des Fraunhofer IGD, und ganz besonders an meinen Betreuer Alexander Rettig. Bedanken möchte ich mich auch bei meinem Prüfer Stefan Müller von der Universität Koblenz-Landau für Anregungen und Ratschläge. 4 Inhaltsverzeichnis 1 Einleitung 1.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Anforderungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Übersicht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Grundlagen 2.1 Physikalische Grundlagen . . . . . . . 2.1.1 Kinematik . . . . . . . . . . . . 2.1.2 Dynamik . . . . . . . . . . . . 2.2 Simulationsmodelle . . . . . . . . . . . 2.2.1 Kinematische Modelle . . . . . 2.2.2 Kontinuum–Mechanik Modelle 2.2.3 Partikelsysteme . . . . . . . . . 2.3 Numerische Integration . . . . . . . . . 2.3.1 Explizites Euler–Verfahren . . . 2.3.2 Runge–Kutta–Verfahren . . . . 2.3.3 Verlet–Verfahren . . . . . . . . 2.3.4 Implizites Euler–Verfahren . . . 2.4 Kollisionserkennung und -antwort . . . 7 7 7 8 . . . . . . . . . . . . . 9 9 9 11 13 13 13 15 16 18 19 20 21 22 3 Adaptive Strukturen 3.1 Einführung in adaptive Strukturen . . . . . . . . . . . . . . . . . . . . 3.2 Level of Detail für Kleidung . . . . . . . . . . . . . . . . . . . . . . . 3.3 Level of Detail für Haare . . . . . . . . . . . . . . . . . . . . . . . . . 25 25 26 30 4 Konzept und Design 4.1 Modellierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Dynamiksimulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3 Rendering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 37 39 45 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . INHALTSVERZEICHNIS 6 5 Realisierung 5.1 Implementierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Tests und Ergebnisse . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3 Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 47 50 59 6 Zusammenfassung und Ausblick 6.1 Zusammenfassung . . . . . . . . . . 6.2 Ausblick . . . . . . . . . . . . . . . . 6.2.1 Optimierung und Ergänzung . 6.2.2 Weiterführende Überlegungen 61 61 63 63 63 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A Bilder B Algorithmen B.1 Explizite Euler-Integration . . . . . . . . . . . . . . . . . . B.2 Velocity-Verlet-Integration . . . . . . . . . . . . . . . . . . B.3 Implizite Euler-Integration . . . . . . . . . . . . . . . . . . B.3.1 Jacobi-Matrizen berechnen . . . . . . . . . . . . . . B.3.2 Hilfsfunktion für Multiplikation mit Jacobi-Matrizen B.3.3 Methode der konjugierten Gradienten . . . . . . . . B.4 Algorithmus zu Konstruktion des Zylinders . . . . . . . . . 65 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 73 73 74 74 75 75 76 Kapitel 1 Einleitung 1.1 Motivation Ein interessantes Forschungsgebiet im Bereich der Computergrafik ist die Entwicklung von virtuellen Charakteren - so genannten Avataren. Das Ziel bei der Entwicklung von Avataren ist es die Mensch-Maschine-Kommunikation zu verbessern, indem sie als persönliche Dialogpartner agieren. D.h. ein virtueller Charakter soll von seiner realen Umwelt beeinflusst werden können. Dies bietet eine völlig neue Qualität der Interaktion. Ein Gebiet von großer Bedeutung für den Einsatz von solchen Avataren ist der Bereich der Bildungssoftware. Durch einen personifizierten Tutor gewinnt das System nachweislich an Effizienz und führt somit zu einem nachhaltigen Lernerfolg. Doch nicht nur in der Bildungssoftware können solche Charaktere zum Einsatz kommen. Möglichkeiten bieten sämtliche interaktive Anwendungen insbesondere im Bereich E-Business. Bei der Animation von Avataren sind besonders die Bewegung von Haaren und Kleidung von großer Bedeutung. Denn Haare und Kleidung tragen maßgeblich dazu bei, den Charakter glaubwürdig und realistisch erscheinen zu lassen und somit die Akzeptanz des Anwenders zu gewinnen. 1.2 Anforderungen Der Avatar soll sich auf das Verhalten eines menschlichen Benutzers möglichst natürlich und angemessen verhalten. Die Bewegungsabläufe müssen ad hoc passieren, eine vorher modellierte Punktemenge, die in aufeinander folgenden Keyframes eine Animationssequenz bilden, sind nicht möglich. Die Simulation kann also nicht wie bei manuell erstellten und langwierig gerenderten Figuren wie in der Filmindustrie, oder durch Avatare, welche durch Bewegungssensoren an realen Schauspielern gesteuert werden, erfolgen. Eine authentisch wirkende Lösung ist eine Simulation basierend auf den Gesetzen 7 8 KAPITEL 1. EINLEITUNG der Physik, was bedeutet, dass die Bewegung für jedes Frame neu berechnet werden muss. Das stellt eine große Herausforderung an die Geschwindigkeit des Systems. Denn durch die Interaktivität mit dem Benutzer muss die Simulation in Echtzeit erfolgen. Die Darstellung der Bewegung und deren Berechnung muss so schnell erfolgen, dass sie zur Laufzeit erfolgen kann, ohne die Animation zu stark zu beeinträchtigen. Eine echtzeitfähige Animation erhält man bei ca. 25 Frames pro Sekunde (fps). Bei der physikalisch-basierten Simulation der Haare und Textilien ist die Berechnung der Verformungen und Bewegungen durch zeitliche Integration der Bewegungsgleichung sowie das Erkennen und Behandeln von Kollision besonders zeitaufwendig. Es gilt daher Lösungen zu finden, um die Simulation zu beschleunigen und echtzeitfähig zu machen. 1.3 Übersicht Es gibt diverse Möglichkeiten der Anforderung der Echtzeitfähigkeit gerecht zu werden. Eine einfache Möglichkeit wäre eine grobe Modellierung der Oberfläche, um so die Anzahl der Berechnungen zu verringern, was allerdings die optische Qualität vermindert. Eine Erweiterung davon wäre mit verschiedenen Darstellungsstufen zu arbeiten, mit so genannten Level of Details. Damit wird die Rechenzeit reduziert, ohne dass allzu große Verluste in der Darstellung entstehen. In der Untersuchung von solchen adaptiven Strukturen und Simulationsmodellen beim Animieren von Haaren und Kleidung liegt der Schwerpunkt dieser Diplomarbeit. Ferner wird ein Konzept erarbeitet, bei dem die Untersuchungsergebnisse einfließen. Das Konzept wird abschließend in der Programmiersprache C++ umgesetzt. Aus oben genannten Gründen erfolgt die Simulation durch Nachbildung physikalischer Gesetzmäßigkeiten, d.h. Anwenden von Gesetzen der Mechanik insbesondere der Kinematik und der Dynamik. Im nächsten Kapitel werden kurz die für die Simulation relevanten physikalischen Grundlagen aufgeführt sowie Modelle beschrieben, um diese abzubilden. Des weiteren werden einige Integrationsverfahren vorgestellt, die nötig sind, um die Animation zeitlich voranzubringen. Das dritte Kapitel behandelt verschiedene adaptive Modelle zur Beschleunigung von Kleidung und Haaren und zeigt den aktuellen Stand der Technik auf diesem Bereich. Wie ein adaptives Modell realisiert werden kann, wird im vierten und fünften Kapitel am Beispiel von Haarsimulation beschrieben. In Kapitel vier wird das Konzept vorgestellt. Die Implementierung und die, unter Zuhilfenahme von OpenSG und der VR-Umgebung Avalon, entstandenen Ergebnisse werden in Kapitel fünf präsentiert. Kapitel 2 Grundlagen In diesem Kapitel werden die Grundlagen beschrieben, die für die physikalisch-basierte Simulation nötig sind. Ganz grundlegend ist hierbei die verwendete Physik und deren Modellierung. Im Abschnitt Numerische Integration wird der Teil der Mathematik beschrieben, der nötig ist, um die Animation in Bewegung zu bringen. Abschließend wird die Problematik der Kollisionsbehandlung aufgegriffen und Techniken zur Kollisionserkennung und -antwort vorgestellt. 2.1 Physikalische Grundlagen Der Teil der Physik, der für die Simulation von deformierbaren Materialien von Bedeutung ist, ist die Mechanik. Genauer gesagt die Kinematik, die sich allgemein mit Bewegungsvorgängen der Körper beschäftigt, und die Dynamik, die die Ursachen dafür untersucht. Ein Körper wird idealisiert als materieller Punkt mit einer Masse m verstanden. 2.1.1 Kinematik Die beiden wichtigen Größen in der Kinematik sind Geschwindigkeit v( ms ) und Beschleunigung a( sm2 ). Allgemein ist die Geschwindigkeit v die Strecke s die in einer Zeit t zurückgelegt wurde. ∆s (2.1) ∆t Für eine infinitesimal kurze Zeitspanne drückt man die Geschwindigkeit durch einen Differentialquotienten nach der Zeit t aus, und erhält v= v = limt→∞ ∆t 9 ds ∆s = = ṡ ∆t dt (2.2) KAPITEL 2. GRUNDLAGEN 10 Geometrisch kann man sich die Geschwindigkeit als Steigung der Kurve im WegZeit-Diagramm vorstellen. Abb. 2.1: Weg-Zeit-Diagramm mit entsprechendem Geschwindigkeits-Zeit-Diagramm Als Beschleunigung bezeichnet man die Geschwindigkeit innerhalb einer Zeitspanne mit ∆v a= (2.3) ∆t Der Differentialquotient lautet a = limt→∞ ∆t ∆v dv = = s̈ = v̇ ∆t dt (2.4) Geometrisch kann man die Beschleunigung als Steigung der Kurve im GeschwindigkeitZeit-Diagramm deuten. Abb. 2.2: Geschwindigkeits-Zeit-Diagramm mit entsprechendem BeschleunigungsZeit-Diagramm Für den in dem Fall der Materialsimulation auftretenden Dreidimensionalität wird der Punkt im Raum durch einen Ortsvektor r(t) beschrieben, der vom Koordinatenursprung zum Ort des betreffenden Punktes zum Zeitpunkt t führt mit x(t) r(t) = y(t) z(t) (2.5) 2.1. PHYSIKALISCHE GRUNDLAGEN 11 Den Weg, den der Punkt im Raum verfolgt, wird als Bahnkurve bezeichnet. Die Ortsvektoren zu den unterschiedlichen Zeiten bilden diese ab. Der Geschwindigkeitsvektor lautet ẋ ∆r dr v = limt→∞ ∆t = = ẏ = ṙ(t) ∆t dt ż (2.6) der immer tangential zur Bahnkurve liegt. Abb. 2.3: Bahnkurve mit tangentialem Geschwindigkeitsvektor Der Beschleunigungsvektor ist analog die nach der Zeit und somit ẍ ˙ dr = ÿ a= dt z̈ 2.1.2 Ableitung des Geschwindigkeitsvektors = r̈(t) (2.7) Dynamik Die Bewegungen, mit denen sich die Kinematik beschäftigt, werden durch Kräfte verursacht. Die Dynamik beschäftigt sich mit diesen und unterteilt sie in interne Kräfte, KAPITEL 2. GRUNDLAGEN 12 welche das Material zusammenhalten, und externe Kräfte, welche von außen wirken. Diese Kräfte verändern den Zustand eines Körpers bzw. verändern dessen Bewegung. Newton hat die Gesetzmäßigkeiten, die diese Bewegungen beschreiben wie folgt formuliert. Newtonsche Axiome: (aus [6]) Axiom 1: Trägheitsgesetz: Jeder Körper behält seine Geschwindigkeit nach Betrag und Richtung so lange bei, wie er nicht durch äußere Kräfte gezwungen wird, seinen Bewegungszustand zu verändern. Axiom 2: Aktionsgesetz: Die zeitliche Veränderung der Bewegungsgröße, des Impulses p = mv, ist gleich der resultierenden Kraft F . Um eine konstante Masse zu beschleunigen, ist eine Kraft F erforderlich, die gleich dem Produkt aus Masse m und Beschleunigung a ist. ⇒ F = ma Axiom 3: Wechselwirkungsgesetz: (actio = reactio) Wirkt ein Körper 1 auf einen Körper 2 mit der Kraft F12 , so wirkt der Körper 2 auf Körper 1 mit der Kraft F21 ; beide Kräfte haben den gleichen Betrag, aber entgegengesetzte Richtungen ⇒ F12 = −F21 Die wichtigen Größen der Dynamik sind folglich Masse m (kg) und Kraft F (N). Es gibt verschiedene Kräfte, die auf einen Massepunkt einwirken können. Eine externe Kraft ist die Schwerkraft mit F = mg (mit g = 9,81 sm2 ). Neben der Schwerkraft zählt auch die Reibungskraft zu den externen Kräften. Die Reibungskraft und speziell in diesem Fall der Luftwiderstand ist definiert mit F = −Dv 2 (2.8) , mit D als Luftwiderstandskoeffizient. Zu den internen Kräften gehören die Elastische Kraft oder auch Federkraft sowie die Dämpfungskraft. Die Federkraft ist definiert mit F = (|xij | − L ∗ F K) (2.9) , wobei L die Länge der Feder in Ruhelage, xij die Verschiebung mit xij = xj − xi und F K ist die Federkonstante ist. Dieses Gesetz nennt man auch das Hook’sche Gesetz. Die Federkonstante gibt die Steifheit der Feder an Die Dämpfungskraft ist definiert mit Fd1 = (v2 − v1 ) ∗ |xij | ∗ D (2.10) ,wobei D die Dämpfungskonstante ist und Fd1 = −Fd2 ist. Die Fähigkeit, die Feder beim Nachlassen der Verformungskraft wieder in die ursprüngliche Form zurückzuführen, nennt man Elastizität. 2.2. SIMULATIONSMODELLE 2.2 13 Simulationsmodelle Das geometrische Modellieren ist die Grundlage für die Berechnung des physikalischgeometrischen Verhaltens. Es werden kinematische und physikalisch-basierte Modelle unterschieden (s. Tabelle 2.1). Erstere werden in der Literatur oft als passiv bezeichnet, weil die Elemente bzw. Segmente, aus denen sich das Modell zusammensetzt, nicht miteinander interagieren [5]. Aktiv sind dagegen alle physikalisch-basierten Modelle. Kinematische Modelle Cantilever-Beam-Modell Physikalisch-basierte Modelle Kontinuum-Mechanik-Modelle Partikelsysteme Finite-Elemente-Modell (FEM) Masse-Feder-System Finite-Differenzen-Modell (FDM) Tabelle 2.1: Verschiedene Simulationsmodelle Zu den kinematischen Modellen gehört das Cantilever-Beam-Modell [14], welches sich gut zur Modellierung von Haaren eignet. Die physikalisch-basierten Modelle, welche im Gegensatz zu den kinematischen Modellen die Gesetze der Physik abbilden, werden in zwei Kategorien unterteilt. Zum einen gibt es die stetigen Kontinuum-MechanikModelle, zu denen die Finite-Elemente-Modelle und die Finite-Differenzen-Modelle gehören. Auf der anderen Seite gibt es die Partikelsysteme, zu denen Masse-FederSysteme zählen. Im folgenden werden diese Modelle kurz vorgestellt. 2.2.1 Kinematische Modelle Beim Cantilever-Beam-Modell, als Beispiel für ein kinematisches Modell, wird das Haar in i Segmente gi unterteilt. Wirkt die Schwerkraft auf das Haar, resultiert das Bied2 y gemoment M mit dx 2 = −M/(E + I). Dabei steht E für den Young Modulus, welcher das Verhältnis von Druck zu Spannung ausdrückt und I für das zweite Flächenmoment. Die Verschiebung nach y muß nun für jedes Segment berechnet werden und zwar rekursiv (vgl. Abb. 2.4). Die Richtung des zuletzt gebogenen Segmentes gibt die x-Achse vor. Anhand dieser x-Achse wird die Verschiebung nach y berechnet und dieser Wert auf das letzte ∆y addiert. Mit dem neuen Verschiebevektor wird das aktuelle Segment gebeugt. 2.2.2 Kontinuum–Mechanik Modelle Für stetige Modelle, wie die Kontinuum-Mechanik-Modelle, benutzt man stetige Ausdrücke in Form von Lagrangschen Gleichungsmodellen. Dabei erfolgt eine Diskreti- KAPITEL 2. GRUNDLAGEN 14 Abb. 2.4: Biegevorgang beim Cantilever-Beam-Modell sierung in Elemente, d.h. die Bewegungsgleichung wird auf jedes infinitesimal kleine Oberflächenelement angewendet. Terzopoulos‘ [5] grundlegende Arbeit für die Simulation von Kleidung basierte auf der Vereinfachung der Elastizitäts-Theorie. Die Lagrangsche Bewegungsgleichung à δ δr µ δt δt ! +γ δξ(r) = f (r, t) δr (2.11) mit der Position r von Partikel a zur Zeit t, der Dichte µ des Partikels a, der Dämpfungsdichte γ und der äußeren Kraft f (r, t). ξ(r) ist die Funktion, welche die Energie der Deformation mißt. Kontinuum-Modelle bieten die Möglichkeit das Material durch zwei Konstanten, statt wie bei Masse-Feder-Systemen durch eine, zu beschreiben. Die Konstanten sind der Young Modulus E (s. 2.2.1) und der Poisson-Koeffizient v, welcher die Reaktion des Materials orthogonal zur Deformationsrichtung mißt. Um die Lösung der partiellen Differentialgleichung zu approximieren, wird die Methode der Finiten Elemente (FEM) oder die Methode der Finiten Differenzen (FDM) verwendet. Bei dem Finite-Differenzen-Modell werden die Ableitungen durch die finiten Differenzen δr rt+∆t − rt−∆t = δt 2∆t 2 rt+∆t − 2rt + rt−∆t δ r = 2 δt ∆t2 (2.12) (2.13) ersetzt. Die Methode führt allerdings im Falle eines unstrukturierten Netzes zu Problemen. Um diese zu umgehen werden stattdessen Finite-Elemente-Modelle benutzt. Entsprechend der Elastizitätstheorie wird dabei die Kraft, die auf ein Element angewendet wird, vom Nachbarelement entnommen oder umgekehrt an das Nachbarelement weitergegeben. Dadurch erhält man zwar eine akkurate Modellierung, aber die Berechnung ist 2.2. SIMULATIONSMODELLE 15 sehr zeitintensiv. 2.2.3 Partikelsysteme Bei den Partikelsystemen wird dagegen nicht das absolute Materialvolumen betrachtet, wie bei den stetigen Modellen, sondern bei diesen Modellen wird das Material zu einer Menge interagierender Massepunkte im Raum diskretisiert. Dadurch wird der Rechenaufwand stark reduziert. Durch Bewegung der einzelnen Massepunkte wird das Modell deformiert. Ein Partikelsystem besteht aus zwei Teilen. Den Partikeln und den Einheiten, die Kräfte auf die Partikel ausüben. Bei einem Masse-Feder-System sind das eine Menge von Massepunkten und die dazugehörigen Federn. Der Massepunkt selbst besitzt eine Masse, Position und Geschwindigkeit. Die Bewegung des Materials ergibt sich aus der Bewegung der Massepunkte. Bei einem Masse-Feder-System werden die einzelnen Massen netzartig angeordnet, z.B. mit m × n für Kleidung oder mit m × 1 für Haare. Die Massepunkte werden durch Federn verbunden, welche ihrerseits keine Masse besitzen und eine Ruhelänge größer als Null haben müssen. Es gibt verschiedene Federtypen, d.h die Massen können auf unterschiedliche Art und Weise verbunden werden. Man unterscheidet Strukturfedern, Scherfedern und Biegefedern (vgl. Abb. 2.5). Abb. 2.5: Unterschiedliche Federtypen: Strukturfedern (grün), Scherfedern (rot) und Biegefedern (blau) Die Bewegung des Modells erfolgt durch das Newtonsche Bewegungsgesetz (s. voriges Kapitel). Die Gleichung F = ma wird dabei unabhängig für jedes Partikel integriert. Eine natürlich-wirkende Elastizität entsteht durch Austausch der Federkräfte, die KAPITEL 2. GRUNDLAGEN 16 dem Hook’schen Gesetz folgen. Ein großer Vorteil von Masse-Feder-Modellen gegenüber anderen Systemen ist die einfache Implementierung. Durch die Diskretisierung auf wenige Massepunkte nimmt die Zahl der Berechungen, im Vergleich zu den Kontinuum-Mechanik-Modellen, ab. Durch die Diskretisierung werden allerdings auch die Ergebnisse unpräziser. Bei Masse-Feder-Systemen besteht die Möglichkeit durch Ändern der Federparameter, wie der Dämpfungs- oder Federkonstante, die Dynamik zu beeinflussen. Dabei muß man allerdings aufpassen, dass die Federsteifigkeit nicht zu hoch gesetzt wird, denn sonst wird das System instabil. Diese Instabilität ist die Folge von der sogenannten Steifheit von Differentialgleichungen (s. S. 17). 2.3 Numerische Integration Um eine Animation zu erhalten, muss das Modell zeitlich voran gebracht werden. Der zentrale Aspekt der physikalisch - basierten Simulation ist das Lösen der Bewegungsgleichung in Form einer Differentialgleichung. Eine Differentialgleichung ist eine Gleichung, die die Funktion und deren Ableitung in Bezug zueinander setzt. Es werden gewöhnliche und partielle Differentialgleichungen (DGL) unterschieden. Bei einer gewöhnlichen DGL hängt die Funktion von nur einer unabhängigen Variablen ab, im Gegensatz zu den partiellen DGLs. Bei physikalischen Simulationen ist dies immer die Zeit t. Die Art der Differentialgleichung, die gelöst werden muss, hängt von der Wahl der Bewegungsgleichung ab. Da gibt es zum einen die Newtonsche Bewegungsgleichung (s. S. 11) und die Lagrangsche Bewegungsgleichung (s. S. 13). Im Rahmen dieser Arbeit bezieht sich das Lösen der Bewegungsgleichung auf die Integration einer gewöhnlichen Differentialgleichung - der Bewegungsgleichung nach Newton (2. Axiom). F = ma = mr̈(t) = f (t, ṙ) (2.14) Diese Gleichung muss entlang einer Zeitentwicklung numerisch gelöst werden. Um eine Differentialgleichung 2. Ordnung mit ẍ = f (t, ẋ) anwenden zu können, muss sie durch Einführen von Hilfsvariablen auf ein System 1. Ordnung reduziert werden. Bei der Bewegungsgleichung geschieht dies durch Einführen der Geschwindigkeit. Man erhält: à ! à ! ∆x vn (2.15) =h ∆v M −1 f (xn , vn ) 2.3. NUMERISCHE INTEGRATION 17 Für die Lösung bzw. für die Stabilität des Systems ist die Wahl der Anfangswerte sehr wichtig. Bei Gleichungen erster Ordnung muss nur eine Anfangsbedingung definiert werden. Das daraus resultierende Problem wird Anfangswertproblem genannt: ẋ = f (t, x(t)) mit x(t0 ) = x0 Das bedeutet: starte an der Stelle t0 zu dem Wert x0 unter der Bedingung x(t0 ) = x0 . Bezogen auf die Bewegungsgleichung ist die Bedeutung: starte an der Stelle t0 und folge den Geschwindigkeitsvektoren (vgl. Abb. 2.6). Abb. 2.6: Anfangswertproblem Die Bewegungsgleichung kann mit verschiedenen Methoden integriert werden. Es werden explizite und implizite Integrationsverfahren unterschieden. Die explizite Integration birgt Schwierigkeiten hinsichtlich Stabilität bei sogenannten steifen Differentialgleichungen. Bei Masse-Feder-Systemen drückt die Steifheit das Verhältnis von der Starrheit der Partikelinteraktion bzw. der Härte der Feder zum gewählten Zeitschritt aus. Ein System wird dann als steif bezeichnet, wenn bei gegebener Federhärte bzw. Federkonstante der Zeitschritt inakzeptabel klein gewählt werden muss, um eine stabile Lösung zu erhalten. Mathematisch lässt sich dieser Zusammenhang wie folgt ausdrücken: Für einen gegebenen Zeitschritt ∆t und eine gegebene Masse µ existiert eine kritische Steifigkeit Kc , über der die numerische Lösung nicht mehr konvergiert. Das System wird folglich instabil, wenn ∆t größer ist als die natürliche Periode T0 des Systems (für mehr Informationen s. [15]). r T0 ≈ π µ K T 02 =⇒ Kc ≈ µ 2 π (2.16) (2.17) KAPITEL 2. GRUNDLAGEN 18 Es werden zunächst einige explizite Verfahren vorgestellt. 2.3.1 Explizites Euler–Verfahren Der Lösungspunkt wird durch den Anfangspunkt (x0 , y0 ) mittels der Tangente approximiert, deren Steigung durch ẏ(x0 ) = f (x0 , y0 ) gegeben ist. An der Stelle x1 := x0 + h mit der Schrittweite h, erhält man den Näherungswert y1 = y0 + h ∗ f (x0 , y0 ). Führt man dieses Verfahren analog fort, so erhält man an den äquidistanten Stützstellen die Näherungen durch die Rechenvorschrift yk+1 = yk + hf (xk , yk ) + O(h2 ) (2.18) mit k = 0,1,2,... Der Fehlerterm O(hn + 1) zur Ordnung n drückt den Verfahrensfehler aus. Das explizite Euler-Verfahren hat den Fehlerterm O(h2 ), ist also eine Methode erster Ordnung. Die Stabilität und Genauigkeit des Verfahrens hängt stark von der Schrittweite ab. Nur wenn die Schrittweite ausreichend klein ist, ist das Verfahren ausreichend stabil und genau. Abb. 2.7: Explizites Euler-Verfahren: Zu Beginn des Intervalls am Punkt 1) wird die Ableitung extrapoliert, um den nächsten Funktionswert(Punkt 2) zu finden (aus: [13]) Zur Verbesserung des expliziten Euler-Verfahrens wird der Schrittfehler mit Hilfe der Taylor-Reihe betrachtet x(t0 ) = x0 + hẋ(t0 ) + h3 ˙ hn δ n x h2 + ẍ(t0 ) + ẍ(t 0) + . . . + 2! 3! n! δtn (2.19) Dabei erkennt man, dass die Gleichung des Euler-Verfahrens die ersten beiden Terme x(t0 ) = x0 + hẋ(t0 ) sind. 2.3. NUMERISCHE INTEGRATION 19 Das bedeutet, dass das explizite Euler-Verfahren nur exakt wäre, wenn diese Terme mit der ganzen Taylor-Reihe übereinstimmen würden. Die Differenz zwischen dem EulerVerfahren und der Taylor-Reihe ist der Fehlerterm, welcher den Verfahrensfehler mit der Kumulation der Restableitungen angibt. Andere Verfahren, wie beispielsweise das Runge–Kutta–Verfahren, versuchen nach ihrer Ordnung die verbleibenden Fehlerterme zu eliminieren. So besitzen das RungeKutta-Verfahren 2. Ordnung einen Fehlerterm von O(h3 ) und das Runge-Kutta-Verfahren 4.Ordnung einen Fehlerterm von O(h5 ). 2.3.2 Runge–Kutta–Verfahren Das Runge–Kutta–Verfahren 2. Ordnung entspricht der Taylor-Reihe x(t0 ) = x0 + hẋ(t0 ) + h2 + ẍ(t0 ) + O(h3 ). 2! (2.20) Das Verfahren besteht konkret aus drei Schritten: 1. Berechnen des Euler-Schritts k1 = hf (xn , yn ) 2. werte f am Mittelpunkt aus k2 = hf (xn + h2 , yn + k1 ) 2 3. nächster Schritt mit Hilfe des Mittelpunktwerts yk+1 = yn + k2 + O(h3 ) Abb. 2.8: Runge-Kutta-Verfahren 2. Ordnung: Aus der Ableitung des Punktes zu Beginn des Intervalls (1) wird ein Punkt bei der Hälfte des Intervalls bestimmt (2). Die Ableitung an diesem Punkt führt zum nächsten Funktionswert (3), usw. mit den Punkten (4) und (5). (Aus [13]) Das Runge–Kutta–Verfahren 4. Ordnung entspricht der Taylor-Reihe KAPITEL 2. GRUNDLAGEN 20 x(t0 ) = x0 + hẋ(t0 ) + h2 h3 ˙ h4 ¨ + ẍ(t0 ) + + ẍ(t0 ) + + ẍ(t0 ) + O(h5 ) 2! 3! 4! (2.21) Das Lösen erfolgt mit: k1 = hf (x0 , t0 ) k1 h k2 = hf (x0 + , tn + ) 2 2 k2 h k3 = hf (x0 + , tn + ) 2 2 k4 = hf (x0 + k3 , t0 + h) 1 1 1 1 x(t0 + h) = x0 + k1 + k2 + k3 + k4 + O(h5 ) 6 3 3 6 (2.22) (2.23) (2.24) (2.25) (2.26) Abb. 2.9: Runge-Kutta-Verfahren 4. Ordnung: Um von einem Funktionswert zum nächsten zu kommen werden vier Ableitungen verwendet. Eine am Startpunkt des Intervalls (1), zwei bei der Hälfte (2) und (3) und eine am vorläufig neuen Funktionswert (4) .(Aus [13]) Es sei allerdings angemerkt, dass höhere Ordnung nicht automatisch höhere Genauigkeit bedeutet. Das Verfahren 4. Ordnung ist dem Verfahren 2. Ordnung nur dann überlegen, wenn bei doppelter Schrittweite die gleiche Genauigkeit erzielt wird. Eine Verbesserung erzielt man zum Beispiel durch die adaptive Schrittweitenkontrolle. D.h. entsprechend der Umgebung wird die Schrittweite angepaßt, bei rauher Umgebung mit kleinen Schrittweiten und bei glatten mit großen Schrittweiten. (Genaueres in [13]). 2.3.3 Verlet–Verfahren Das Verlet-Verfahren entspricht den Taylor-Reihen h3 ˙ h2 x(t + h) = x(t) + hẋ(t) + a(t) + ẍ(t) + O(h4 ) 2 6 (2.27) 2.3. NUMERISCHE INTEGRATION x(t − h) = x(t) − hẋ(t) + 21 h2 h3 ˙ a(t) − ẍ(t) + O(h4 ) 2 6 (2.28) (2.29) Die erste Reihe geht in der Zeit vorwärts und die zweite geht rückwärts. Wenn man die beiden Reihen zusammen nimmt und nach x(t + h) auflöst, erhält man: x(t + h) = 2x(t) − x(t − h) + h2 a(t) + O(h4 ) (2.30) Die Geschwindigkeit läßt sich einfach daraus ableiten zu: v(t + h) = x(t + h) − x(t − h) + O(h2 ) 2h (2.31) Es gibt noch eine Verlet-Variante, die explizit die Geschwindigkeit abschätzt. Die Gleichungen für x(t + h) und v(t + h) lauten: h2 a(t) + O(h3 ) 2 a(t) + a(t + h) v(t + h) = v(t) + h + O(h3 ) 2 x(t + h) = x(t) + hv(t) + (2.32) (2.33) a(t + h) läßt sich aus x(t + h) berechnen. Die implizite Integration ist numerisch stabil und unabhängig von der Schrittweite. Im Gegensatz zu den expliziten Verfahren bilden bei den impliziten Verfahren nicht die aktuelle Ableitung die Basis der Integration, sondern die approximierte Ableitung des Folgezustands. Die impliziten Verfahren erfordern die Lösung eines linearen Gleichungssystems. 2.3.4 Implizites Euler–Verfahren Dieses Verfahren ist wesentlich stabiler als das explizite Euler-Verfahren, dafür muß für jeden Schritt eine iterative Lösung eines linearen Gleichungssystems gewonnen werden. 0 yn+1 = yn + hyn+1 (2.34) Der erste Schritt ist die Formulierung eines LGS, mit dessen Lösung eine Zustandsänderung bestimmt wird à ∆x ∆v ! à =h vn + ∆v M −1 f (xn + ∆x, vn + ∆v) ! (2.35) KAPITEL 2. GRUNDLAGEN 22 1 0 0 1 , wobei M die Masse-Matrix ist mit M = m 0 1 0 . 0 0 1 Die Funktion f ist nicht-linear, daher wird sie durch eine Taylor-Reihe erster Ordnung approximiert. f (xn + ∆x, vn + ∆v) = fn + à ∆x ∆v ! à =h δf δf ∆x + ∆v δx δv vn + ∆v −1 M fn + δf ∆x + δx (2.36) ! (2.37) δf ∆v δv bei vn+1 = vn + ∆v und xn+1 = xn + hvn+1 lautet die unterste Reihe mit ∆x = h(vn + ∆v): à ! à ! δf δf δf δf ∆v = h M −1 fn + ∆x + ∆v = h M −1 fn + h(v0 + ∆vn ) + ∆v δx δv δx δv (2.38) LGS A∆v = b mit: " δf δx 2.4 und δf δv 2 δf # " δf δf M −h −h ∆v = h fn + h vn δx δv δx # (2.39) sind dabei die Jacobi-Matrizen für die Position und die Geschwindigkeit. Kollisionserkennung und -antwort Neben der Integration ist die Kollisionsbehandlung der zeitaufwendigste Teil einer Simulation. Die Kollisionsbehandlung geschieht innerhalb eines Simulationsschritts und besteht aus der Kollisionserkennung, die zuerst erfolgt, und der Kollisionsantwort. Bei der Kollisionserkennung wird zwischen Kollision mit einem anderen Objekt und der Selbstkollision unterschieden. Es gibt verschiedene Verfahren für die Kollisionserkennung. Für konvexe Objekte gibt es die Methode der separierenden Ebene. Beim closest feature tracking wird immer der Minimalabstand zwischen zwei Objekten verfolgt. Oft wird ein Toleranzbereich ε definiert, innerhalb dessen die Kollision bestimmt wird. Wird der minimale Abstand zwischen dem Objekt und dem Kollisionsobjekt unterschritten, wird eine Kollision angenommen. Bei einfachen Objekten wird der Abstand zwischen einzelnen Punkten des Objekts bestimmt. Bei komplexeren Objekten wäre das zu aufwendig. Daher werden in diesem Fall Bounding Volumes (BV) benutzt. Es gibt verschiedene BV-Typen. Abbildung 2.10 zeigt eine kleine Auswahl. Es ist zu beachten, dass komplexere Bounding Volumes zwar 2.4. KOLLISIONSERKENNUNG UND -ANTWORT 23 enger am Objekt anliegen und somit beim Kollisionstest genauer sind, auf der anderen Seite die Berechnungszeit hierfür steigt. D.h. dass bei der einfachsten Geometrie - der Kugel - der Kollisionstest am schnellsten geht. Die Approximation eines Objekts durch eine Bounding Volume Box hängt von der Form des Objekts ab. Da in den meisten Fällen das Objekt bei einer Kugel am wenigsten eng umhüllt wird, gibt es eine Variante, das Objekt mit mehreren kleinen Kugeln zu umhüllen. Bei diesen Swept Sphere Volumes (SSV) kann man, wie die in Abbildung 2.11 dargestellt, eine einfache Kugel benutzen oder für längliche Objekte Line Sphere Volumes oder für eher rechteckige Objekte Rectangle Sphere Volumes. Abb. 2.10: Diverse Bounding Volume-Typen. 1) Sphere 2) Axis aligned Bounding Box (AABB) 3) Discrete oriented Polytop (k-DOP), hier: 8-DOP 4) Oriented Bounding Box (OBB) Abb. 2.11: Swept Sphere Volumes: Sphere, Line Sphere Volume und Rectangle Sphere Volume Um die Rechenzeit zusätzlich zu minimieren, werden diese Volumes hierarchisch angeordnet. Allerdings muss der Aufbau der Hierarchie gut überlegt sein, denn im ungünstigen Fall kann die Traversierung sehr teuer werden. Zur Beschleunigung gibt es verschiedene Formen der räumlichen Unterteilung wie Uniform Grid, Quadtree, kdTree und bsp-Tree. Das Problem dabei ist, dass sich durch die Deformation die Hierarchie des Baumes bzw. die Ordnung im Grid verändert. Nach jedem Simulationsschritt 24 KAPITEL 2. GRUNDLAGEN muss die Hierarchie aktualisiert werden. Verschiedene Elemente eines Objekts können von einer Bounding Box umschlossen sein. Ein solches Element könnte ein Partikel oder ein Segment sein(Abb. 2.12). Diese BVs können nun wieder in einem BV zusammengefasst werden. Abb. 2.12: Links: Linie aus drei Segmenten in Bounding Volumes. Rechts: Als Bounding Volume Hierarchie Die Bounding Volume Hierarchie wird nach Auftreten der Kollision traversiert. D.h tritt bei einem BV eine Kollision auf, werden die Kinder der BV auf Kollision untersucht. Kollidieren die Kindknoten ebenfalls mit einem Objekt, werden deren Kinder wieder auf Kollision getestet usw. Bei der Kollisionsantwort ist neben dem Abstand des Partikels zur Oberfläche, der Kollisionsrichtung und der Oberflächennormale die Beschaffenheit des Materials, ob es sich also um einen starren oder dynamischen Körper handelt, eine wichtige Information. Bei starren Körpern wird die Geschwindigkeit einfach auf Null gesetzt und bei dynamischen Objekten wird eine neue Kraft erzeugt oder ein Impuls, um das Objekt vom Ort des Aufpralls wieder wegzubewegen. Eine Kollisionslösung in der Art kann durch Penalty-Kräfte umgesetzt werden. Penalty-Kräfte sind zusätzliche symmetrische Kräfte. Die Aufprallkraft wird durch temporäre Federn repräsentiert, die beim Aufprall zusammengedrückt werden. Um die Kollisionsantwort zu simulieren, wird diese Aufprallkraft an das Objekt weitergegeben. Kapitel 3 Adaptive Strukturen 3.1 Einführung in adaptive Strukturen Die Simulation von Kleidung und Haaren oder allgemein die Simulation von deformierbaren Objekten ist sehr zeitaufwendig. Besonders teuer sind dabei die Dynamiksimulation und die Kollisionsbehandlung. Eine Verbesserung in diesen Bereichen hat für die Beschleunigung des Systems große Bedeutung. In dieser Arbeit liegt der Schwerpunkt bei der Beschleunigung der Dynamiksimulation. Dabei geht es weniger um die numerische Integration an sich, als viel mehr um die Verringerung der Massepunkte. Das Problem ist, dass bei Verringerung der Massepunkte, also Vergröberung des Modells, zwar die Performanz steigt, die visuelle Qualität aber abnimmt. Die Lösung dieses Problems liegt bei der Verwendung von so genannten Level of Details (LOD). Bei LODs werden bei der Simulation mehrere Detaillierungsstufen je nach Situation benutzt. Somit werden für Regionen ohne Deformation Berechnungen vermieden. Das Modell wird adaptiv verfeinert, um Details nur in gewissen Regionen zu erzeugen, in denen sie die visuelle Qualität fördern. Probleme bzw. Dinge, die bei der Verwendung von LODs zu beachten sind, sind zum Beispiel die Menge an Detailstufen zwischen denen hin und her gewechselt werden kann. Sind es zu wenige Stufen, kann der Unterschied zu groß sein, so dass die Adaption der einzelnen Level sehr schwer wird. Mehr Detailstufen bedeutet mehr Modellierungsaufwand. Es ist zwischen verschiedenen LOD-Arten zu unterscheiden. Es gibt diskrete LODs, kontinuierliche LODs und ansichtenabhängige (view-dependent) LODs [4]. Bei den diskreten LODs werden verschiedene Varianten des Objekts vorberechnet und zur Laufzeit das entsprechende ausgewählt. Eine weitere Art sind die kontinuierlichen LODs. 25 KAPITEL 3. ADAPTIVE STRUKTUREN 26 Hierbei wird anstatt verschiedener vorberechneter Modelle ein komplexes Modell, welches bereits mehrere Detailstufen enthält, verwendet. Zur Laufzeit wird das gewünschte Level aus dem Modell extrahiert. Der Vorteil an diesem Modell kann eine bessere Auflösung sein. Die view-dependent LODs sind eine Erweiterung der kontinuierlichen LODs. Das passende Level wird entsprechend dem Blickpunkt des Betrachters ausgewählt. Bei LODs gibt es verschiedene Kriterien, nach denen entschieden wird, wann das Level gewechselt wird. • Distanzkriterium: Dieses ist das einfachste und am weiten verbreitetste Kriterium. Dabei wird zu jedem Modell die Entfernung angegeben, bei der das Modell verwendet werden soll. • Größe des projizierten Objekts auf dem Bildschirm: Diese Methode ist aufwendiger, da alle Weltkoordinaten des Objekts in Bildschirmkoordinaten umgerechnet werden müssen. • Priorität: Wichtige Objekte werden detaillierter dargestellt. • Wahrnehmungsspezifische Eigenschaften: Das kann die Dauer sein, die ein Objekt im Blickfeld des Betrachters, oder wie weit ein Objekt am Rande des Blickfelds des Betrachters liegt. • Frame-Rate: Es wird die Detailstufe gewählt, die bei vorgegebener Frame-Rate dargestellt werden kann. Bei view-dependent LODs können verschiedene Teile des Netzes in unterschiedlicher Auflösung vorliegen. Eine hierarchische Repräsentation in Form eines Baumes (Bin-, Quad-, Octree usw.) bietet sich daher an. Im Zusammenhang mit dem Wechsel des Detaillevels, nicht nur bei view-dependent LODs, kann es zu Artefakten kommen, so genannten popping-effects. In den beiden folgenden Abschnitten soll ein Überblick verschafft werden, wie die Technik des Level of Detail bei der Haar- und Stoffsimulation angewendet werden kann. 3.2 Level of Detail für Kleidung LODs können bei deformierbaren Materialien, sowohl bei Masse-Feder-Systeme als auch bei Kontinuum-Modellen, zum Einsatz kommen. Kontinuum-Modelle bieten den Vorteil, dass die Beibehaltung von Parametern, wie Steifheit oder Dichte, beim Wechsel in ein anderes Level weniger Schwierigkeiten bereitet als bei Masse-Feder-Systemen. Andererseits lassen sich bei Masse-Feder-Systemen die einzelnen Level einfach über die 3.2. LEVEL OF DETAIL FÜR KLEIDUNG 27 Anzahl der Massepunkte festlegen. An Regionen mit großer Deformation werden dann entsprechend mehr Massepunkte erzeugt bzw. verwendet, um eine feinere Auflösung in diesem Bereich darzustellen. So sieht man beispielsweise in Abbildung 3.1, dass am Ort der Krafteinwirkung ein feineres Mesh verwendet wird als am restliches Körper. Abb. 3.1: Level of Detail bei deformierbaren Materialien Eine der ersten Arbeiten, bei der mehrere Detailstufen bei Masse-Feder-Systemen angewendet wurden, war die von Hutchinson [2]. Die Verfeinerung wird hier erst zur Laufzeit erzeugt. Um das Mesh zu unterteilen, werden zusätzliche Massepunkte hinzugefügt. Dabei wird eine quadratische Netzzelle in vier kleinere Quadrate unterteilt. Dies geschieht sobald die einwirkende Kraft das Material so stark verformt, dass die Federn stärker als ein vorgegebener Winkel gebeugt werden. Eine Unterteilung zur Laufzeit bedeutet einen zusätzlichen Rechenaufwand bei der Simulation. Außerdem hat man das Problem, dass die durch die Unterteilung entstehenden irregulären Strukturen die optische Qualität mindern und die Gesamtmasse des Materials während der Simulation konstant sein muss, um auf verschiedenen Detailstufen die gleichen Ergebnisse zu erhalten. Qualitätsverluste können durch Relaxation oder Remeshing des initialen Netzes zwar behoben werden, durch den hohen Rechenaufwand wäre die Methode für Echtzeitanwendungen dann allerdings unbrauchbar. Eine ähnliche Methode wird auch in der Arbeit von Volkov [28] beschrieben. Hier wird kein quadratisches Netz unterteilt, sondern ein trianguliertes Netz. Die einzelnen Level werden auch nicht getrennt voneinander dargestellt , sondern zur voherigen Auflösung addiert. In Abbildung 3.2 wird exemplarisch das Netz nach zwei Verfeinerungen dargestellt. LOD 0 ist das Originalnetz. LOD 1 ist die erste Unterteilung und LOD 2 die zweite. Die verfeinerten Netze werden zum Originalnetz hinzugefügt. Bei der Unterteilung werden die Dreiecke in drei neue Dreiecke unterteilt. Um Qualitätsverluste, z.B. Artefakte, des Netzes zu vermeiden, werden bei der Verfeinerung 28 KAPITEL 3. ADAPTIVE STRUKTUREN Abb. 3.2: Verschiedene LODs und resultierendes Mesh regelmäßige Dreiecke erzeugt. Dies geschieht, indem bei zwei verfeinerten benachbarten Dreiecken die Kanten gedreht werden (vgl. Abbildung 3.3). Die beiden entstandenen regelmäßigen Dreiecke werden zu dem nexthöheren Level addiert. Abb. 3.3: Erzeugung regelmäßiger Dreiecke Um das Problem der konstanten Massen zu lösen, wird bei der Verfeinerung die Masse eines Punktes des Levels i gedrittelt. Somit wird ein plausibles Ergebnis erzielt. In Abbildung 3.4 sieht man an drei Beispielen wie die Verfeinerung des Netzes in Regionen mit großer Deformation aussehen könnte. Eine andere Möglichkeit besteht darin mit mehreren vorberechneten Ebenen zu arbeiten. Bei diesem Verfahren kann die Qualität des Netzes nach mehreren Unterteilungen nicht verloren gehen. In [9] wird eine Methode vorgestellt, bei der die Simulation mit mehreren Auflösungen arbeitet und das initiale Netz nicht rekursiv unterteilt wird. Netze mit unterschiedlicher Auflösung sind zu bestimmten Zeiten der Simulation in unterschiedlichen Regionen aktiv. An den Schnittstellen dieser Regionen kommt es zu Überlappungen der Netze (s. Abbildung 3.5). Der Informationsaustausch an diesen Schnittstellen erfolgt über gemeinsame Knoten. Wird also eine Region stark deformiert, wird dort eine höhere Auflösung benutzt. Im Beispiel aus Abbildung 3.5 gibt der korrespondierende Knoten P1 die Verschiebungs- 3.2. LEVEL OF DETAIL FÜR KLEIDUNG Abb. 3.4: Beispiele aus [28] Abb. 3.5: Verbindung von zwei Leveln mit ghost-nodes 29 30 KAPITEL 3. ADAPTIVE STRUKTUREN werte bzw. Offsets an seine Kinder weiter. P1 wird dann zum ghost-node. Die Verschiebungswerte errechnen sich aus einer linearen Interpolation in Form von Baryzentrischen Koordinaten. Abbildung 3.6 zeigt ein Beispiel, wie der Informationsaustausch zwischen den Ebenen funktioniert. Der Knoten C1 des gröberen Netzes bekommt die Information des Kindtetrahedron mit F1 , F2 , F3 . Dieser Knoten wäre nun kein ghost-node mehr sondern wieder aktiv. Bei einer Verfeinerung des Netzes gäbe das Elterntetrahedron mit C1 , C2 , C3 den Offsetwert an den Kindknoten F1 . Abb. 3.6: Informationsaustauch zwischen zwei Leveln 3.3 Level of Detail für Haare Der Haarsimulation liegen andere Simulationsmodelle zu grunde als der Stoffsimulation, wodurch sich die Technik des Level of Detail unterscheidet. Für Haare gibt es verschiedene Simulationsmodelle. In [23] werden folgende Modelle unterschieden: Partikelsysteme, explizite Modelle, Clustermodelle und Modelle basierend auf volumetrischen Texturen. Bei expliziten oder Einzelhaarmodellen wird jedes einzelne Haar modelliert. Das Resultat ist sehr realitätsnah, bei ca. 100 000 Haaren beim Menschen allerdings auch sehr zeitaufwendig. Das Clustermodell ist nicht viel unrealistischer. Denn wie in der Natur, wo mehrere Haare durch Kohäsions- und Adhäsionskräfte zusammengehalten werden, werden auch bei diesem Modell Haarbündel durch Zylinder oder Streifen abstrahiert (s. Abb. 3.7). Durch diese Vergröberung wird Rechenzeit eingespart. Im folgenden werden einige Arbeiten basierend auf den Clustermodellen vorgestellt. Das erste Modell von Kim et al. [27], das vorgestellt wird, verwendet einen hierarchischen Ansatz. Das Haarbündel wird aus einer Skelettkurve mit dazugehöriger Kontur 3.3. LEVEL OF DETAIL FÜR HAARE 31 Abb. 3.7: Clustermodelle: Streifenmodell (links) und Zylindermodell (rechts) konstruiert. Mit einer Skalier- und Lockenfunktion wird die Strähne in Form gebracht. Eine Hierarchie wird aufgebaut, indem die Strähne unterteilt wird. Bei der Unterteilung werden Skelette und Konturen für die Kindknoten erzeugt. Die Kindsträhnen werden mit der Formel Nρ skaliert, wobei N die Anzahl der Kinder und ρ den Grad der Überlappung zwischen den Kindern angibt. Die Positionierung auf der Kopfhaut erfolgt durch Zufallsverteilung. Die einzelnen Kindsträhnen können wieder zu gröberen Strähnen zusammengefasst werden. In dieser Hierarchie kann auf- und abgestiegen werden, um somit das Detaillevel zu bestimmen. In einer weiteren Arbeit von Kim et al. [7], dem Adaptive-Wisp-Tree-Verfahren (AWT), werden die Haarbündel als einfache Zylinder dargestellt. Diese Strähnen werden in weitere Strähnen unterteilt und in einem Baum angeordnet. Die Kinderknoten können so leicht den Elternsträhnen zugeordnet werden. Der Radius des Zylinders wird im Falle einer Unterteilung so gewählt, dass im folgenden Schritt die Kinderknoten innerhalb des Zylinders liegen. Zu Beginn der Simulation ist die gröbste Repräsentation aktiv, also der Wurzelknoten des Baumes. Die Verfeinerung der Strähne erfolgt nach zwei Kriterien. Ist zum einen die Beschleunigung, die auf die Strähne wirkt, größer als ein bestimmter Schwellwert und ist zum anderen der Kindknoten bereits gesplittet, so wird die Strähne unterteilt. Durch das zweite Kriterium wird erreicht, dass die Strähne von der Spitze zur Wurzel hin aufgesplittet wird. In Abbildung 3.8 ist der Verfeinerungsprozeß schematisch aufgezeigt. Beim ersten Schritt (ganz links) ist noch die gröbste Auflösung aktiv. Wird nun die Strähne stark beschleunigt, tritt das zweite Kriterium in Kraft. Da noch keine Kindknoten gesplittet wurden, fängt die Verfeinerung in der Haarspitze an. Beim vierten Schritt wird nun der zweite Knoten gesplittet, da die Kindknoten bereits gesplittet wurden. Die Positionen der Kinder werden durch gespeicherte Offsetwerte übertragen, ebenso wie die Geschwindigkeit. Eine Haarsträhne kann, nachdem sie verfeinert wurde, wieder vergröbert werden, indem die Kindersträhnen zusammengefasst werden. Die Zusam- 32 KAPITEL 3. ADAPTIVE STRUKTUREN Abb. 3.8: Verfeinerung einer Strähne menfassung erfolgt ebenso nach mehreren Kriterien. Erstens müssen die Kinderknoten innerhalb des Radius des Elternknotens sein. Zweitens dürfen ihre relativen Geschwindigkeiten nicht über einem bestimmten Schwellwert liegen um gleichmäßige Übergänge zu erhalten. Und drittens darf auch die Beschleunigung nicht über einem bestimmten Schwellwert liegen. Sind diese Kriterien erfüllt, wird die Position und die Geschwindigkeit gemittelt und an den Elternknoten gegeben. In Abbildung 3.9 ist das Verfahren nochmal in einer Übersicht dargestellt. Wie bereits erwähnt, gibt es mehrere Möglichkeiten Level of Detail anzuwenden. In der eben vorgestellten Arbeit bezieht sich die Detaillierung auf die Kontrolle der Animation. Dabei können komplexere Haarbewegung ermöglicht werden, indem die Kontrollstruktur dynamisch adaptiert d.h. aufgelöst werden. Bei dem folgenden Verfahren wird zu den Kontrollstrukturen auch die Geometrie dynamisch adaptiert. Ward et al. [17][16] verwenden dazu drei unterschiedliche Haarrepräsentationen: Haarstreifen, Haarzylinder und Einzelhaare (s. Abb. 3.10). Dabei sind Haarstreifen die gröbste und Einzelhaare die feinste Auflösung. Jeder Repräsentation liegt ein einheitliches Basisskelett zu grunde. Über dieses Skelett, welches als Masse-Feder-System implementiert wird, wird die Dynamik gesteuert. Die Anzahl der Massen und Federn des Skeletts entspricht der Anzahl der Segmente des Haarelements. Die Adaption der Detailstufen, sowohl der Kontrollstrukturen als auch der Geometrien, erfolgt über eine Hierarchie. Der initiale Haarstreifen bildet das oberstes Level. Unter Zuhilfenahme einer Quadtree-Datenstruktur wird dieses Basishaar unterteilt und die Hierarchie vorberechnet. Der Haarstreifen (Strip) wird geviertelt. Diese Unterteilung geschieht rekursiv für jeden Kindstreifen bis die Breite unter einem Schwellwert liegt. Ist dies der Fall, wird die nächstfeinere Auflösung gewählt - der Haarzylinder (Cluster). 3.3. LEVEL OF DETAIL FÜR HAARE Abb. 3.9: Adaptive Wisp Tree (AWT) Verfahren 33 34 KAPITEL 3. ADAPTIVE STRUKTUREN Abb. 3.10: Drei unterschiedliche Haarrepräsentationen: Haarstreifen, Haarzylinder und Einzelhaare Dieser Cluster wird wiederum geviertelt. Die Kindcluster werden auch wieder rekursiv unterteilt bis der Radius kleiner als ein vorgegebener Schwellwert ist. Als feinstes Level werden Einzelhaare (Strands) dargestellt. Dabei werden N Einzelhaare zufällig in jedem Cluster verteilt. Die Cluster werden in Quadranten aufgeteilt. Alle Einzelhaare die in einem Quadranten liegen bilden eine Einzelhaar-Gruppe. Diese Gruppe folgt der Dynamik eines gemeinsamen Skeletts. Jede Einzelhaar-Gruppe wird wieder als Kind in den Quadtree gehängt und in vier Quadranten unterteilt. Die Hierarchie wird weiterverfolgt und die Einzelhaar-Gruppen werden solange aufgeteilt, bis die Blätter des Quadtrees nur noch ein einzelnes Haar besitzen. Abbildung 3.11 zeigt schematisch die entstandene Hierarchie. Die Strip-Hierarchie ist dabei die Hierarchie der Kontrollstrukturen der Haarstreifen, die Cluster-Hierarchie die der Haarzylinder und die Strand-Hierarchie ist der Quadtree der Einzelhaarbündel. Alle drei Kontrollstrukturhierarchien bilden die Hierarchie für die Adaption der Geometrie. In dem Baum wird sich entsprechend dem erforderlichen Level of Detail auf und ab bewegt. Ein Wechsel der Hierarchiestufe und somit die Art der Repräsentation hängt von folgenden Kriterien ab. Erstens wird getestet, ob das Haar überhaupt sichtbar ist. Zweitens wird gemessen, wie weit das Haar vom Betrachter entfernt bzw. wie viel Platz das Haar auf dem Bildschirm einnimmt. Und beim dritten Kriterium wird gemessen, wie stark das Haar in Bewegung ist, also wie groß die externe Kraft ist, die auf das Haar einwirkt. Wenn nun die Hierarchieebene gewechselt wird, müssen zur Laufzeit die dynamischen Zustände der Knoten im Baum ausgetauscht werden. Wenn in der Hierarchie nach oben 3.3. LEVEL OF DETAIL FÜR HAARE 35 Abb. 3.11: Schematische Darstellung der Hierarchie der Kontrollstrukturen und unterschiedlichen Geometrien gegangen wird, werden die Zustände der Kinder an den Vaterknoten gegeben, indem die Positionen der Kinder gemittelt werden. Wenn in der Hierarchie eine Stufe hinunter gegangen wird, muss der Knoten sein Zustand an die Kinder verteilen. Um die Positionen der Kinder zu modifizieren, werden Offset-Vektoren verwendet, die beim Aufbau des Quadtree errechnet wurden. 36 KAPITEL 3. ADAPTIVE STRUKTUREN Kapitel 4 Konzept und Design Nach der theoretischen Auseinandersetzung mit der Technik der adaptiven Simulation, wird in diesem Kapitel ein Konzept für deren praktische Umsetzung vorgestellt. Da die Umsetzung von Stoff- und Haarsimulation den Rahmen dieser Diplomarbeit sprengen würde, beschränkt sich der praktische Teil dieser Arbeit auf die Realisierung von adaptiver Haarsimulation. Das umgesetzte Verfahren orientiert sich stark an dem Verfahren von Ward et al. [17][16], welches im vorherigen Kapitel vorgestellt wurde. Der Vorteil an diesem Verfahren ist, neben der Echtzeitfähigkeit, auch die Verwendung des Level of Detail, nicht nur für die Kontrollstrukturen, sondern auch für die Geometrie. Es ermöglicht also bei einer großen Detaillierungsstufe eine Einzelhaarsimulation in Echtzeit, was zu einer qualitativ besseren Darstellung führt. Die Simulation von Haaren kann allgemein in drei Aufgaben aufgeteilt werden. Die Modellierung, die Behandlung der Dynamik und das Rendering. Das Konzept für die Umsetzung der verbleibenden Aufgaben wird in den folgenden Abschnitten vorgestellt. 4.1 Modellierung Die Modellierung der Haare ist durch die Auswahl des Verfahrens von Ward vorgegeben: Ein Clustermodell mit Streifen, dem ein Masse-Feder-System zu grunde liegt. Um die Streifen zu modellieren, wurde das Cinema4D-PlugIn HairDepartment 1 verwendet. 1 www.bgs-group.de/seiten/deframe.html 37 38 KAPITEL 4. KONZEPT UND DESIGN Abb. 4.1: Cinema4D-PlugIn HairDepartment 4.2. DYNAMIKSIMULATION 4.2 39 Dynamiksimulation Die Simulation wurde in das VR- und AR-System Avalon2 integriert. Avalon nutzt die Idee von VRML/X3D und erweitert damit das traditionelle Konzept eines Szenegraphen für einen Knoten. Die Idee ist nun, das Haarmodell als Avalon-Knoten zu implementieren und so die Vorteile von Avalon zu nutzen. Die Frisur wird als VRML-Modell eingelesen. Da die eingegebenen Streifen der Frisur innerhalb der Simulation wieder unterteilt werden müssen, ist es angebracht für jeden Streifen ein Objekt eines Avalon-Knotens anzulegen. In dem folgenden Beispiel wird in der VRML-Datei der Avalon-Knoten Skeleton - da er das Skelett für das Frisurmodell bildet - namens hairs1 eingefügt. ... DEF Haare Transform{ children[ DEF hairs1 Skeleton{ gravitaton 0 -9.81 0 coord Coordinate { point [ 2 4 0, 0 4 0, 1 2 0, 3 2 0, 0 -3 0, 2 -3 0, 2.5 -5 0, 0.5 -5 0 ]} mass 10 maxFactor 20 springconstant 500.0 springdampingconstant 2.0 timestep 0.005 level -1 ] } ... DEF ts TimeSensor { cycleInterval 2 2 www.zgdv.de/avalon 40 KAPITEL 4. KONZEPT UND DESIGN loop TRUE } ... ROUTE ts.time TO hairs1.time Aus den Avalon-Knoten werden die initialen Top-Level-Haare, die Wurzelknoten der hierarchischen Struktur, als Streifen angelegt und unterteilt. Neben Streifen gibt es noch die Haartypen Zylinder und Einzelhaargruppe. In dem UML-Diagramme 4.2 ist die Klassenstruktur der einzelnen Haartypen (Streifen, Zylinder und Einzelhaargruppen) dargestellt. Diese werden in den Klassen Strip, Cluster und Strand gespeichert, welche wiederum von der Klasse BaseHair abgeleitet werden. Jedes Top-Level-Haar enthält ein Masse-Feder-System, das mit den Informationen aus dem Avalon-Knoten initialisiert wird. Auf Klassenebene enthält die Klasse BaseHair das Masse-Feder-System in Form der Klasse MyMassSpringSystem welche wiederum die Klassen Mass und MySpring enthält (s. UML-Diagramm 4.3). Aus dem TopLevel-Haar wird während der Initialisierung des Avalon-Haar-Knotens ein Quadtree aufgebaut. Dabei wird der Streifen entsprechend den definierten Schwellwerten unterteilt (s. S. 57). Die unterteilten Haarknoten werden in der Quadtree-Datenstruktur gespeichert. Jeder Quadtreeknoten enthält ein Basishaar und Zeiger auf vier weitere Quadtreeknoten — die Kinder. (s. UML-Diagramm 4.4) Bei der Traversierung des Baumes müssen die Parameter, wie Position und Geschwindigkeit, von der alten Ebene zur neuen Ebene ausgetauscht werden. Die Funktionen subdivide() und merge() in der Klasse Quadtree splitten bzw. fassen die Informationen der Eltern- oder Kindknoten zusammen und reichen sie weiter. Beim Aufteilen der Werte wird die Position des Elternknotens um den Offsetvektor, der beim Erstellen des Baumes gespeichert wurde, verschoben und an den Kindknoten gegeben. Beim Aufsteigen im Baum, werden die Positionen gemittelt und als Elternposition gespeichert. Wie bereits erwähnt, sind die Kriterien für die Verfeinerung der Haarrepräsentation zum einen die Sichtbarkeit des Haares, dann der Abstand zwischen Betrachter und Haarobjekt und die Größe der einwirkenden Kraft. Bei der Implementierung werden nur der Abstand und die Krafteinwirkung berücksichtigt. Diese beiden Kriterien werden zu einem Faktor verrechnet, welcher das neue Level angibt. Ist das neue Level kleiner als das vorherige Level, geht es im Quadtree die entsprechende Differenz in Schritten nach oben und umgekehrt. Der Faktor errechnet sich aus der Durchschnittsgeschwindigkeit aller Knoten des aktuellen Levels mulipliziert mit der Distanz des Blickpunkts des Betrachters zur Bounding Box des Haarknotens. Die Durchschnittsgeschwindigkeit wird berechnet, indem die Integrationsmethode nach jedem Aufruf die berechnete Geschwindigkeit zurückliefert, welche in dem Skeleton- 4.2. DYNAMIKSIMULATION 41 Abb. 4.2: UML-Diagramm: (a) BaseHair mit abgeleiteten Haartypen Strip, CLuster und Strand 42 KAPITEL 4. KONZEPT UND DESIGN Abb. 4.3: UML-Diagramm: (b) BaseHair mit MyMassSpringSystem und den IntegratorKlassen 4.2. DYNAMIKSIMULATION 43 Abb. 4.4: UML-Diagramm: (c)Quadtree-Klasse die das BaseHair enthält; Masse- und Feder-Klasse, die zu MyMassSpringSystem gehören 44 KAPITEL 4. KONZEPT UND DESIGN Knoten aufsummiert wird. Bei den Levelübergängen kann es zu so genannten popping-effects kommen, z.B. ruckartige Übergänge und stockende Bewegungen. Diese Effekte können vermindert werden, indem getestet wird, ob die Kinderrepräsentationen innerhalb eines bestimmen Radius des Elternknotens liegen. Um die Masseverteilung im Baum konstant zu halten, müssen beim Splitten des Masse-Feder-Systems die Massen geviertelt werden. Das ist nötig, um eine flüssige und richtige Simulation zu erhalten. Außerdem können unterschiedliche Massen zu einer Instabilität des Systems führen. Eine weitere Entscheidung, die bei der Implementierung getroffen werden muß, ist die Wahl der Integrationsmethode. In Abschnitt 2.3 wurden bereits einige Verfahren zur numerischen Integration vorgestellt. Es gibt mehrere Kriterien, die für die Auswahl ausschlaggebend sind. Zum einen ist es sicherlich wichtig zu beachten, in welchem Kontext die Simulation erfolgt. D.h. was wird sonst noch alles berechnet und wie groß ist der Anteil der Simulation. Ebenfalls wichtig ist die Größe des Problems, also die Anzahl der Partikel, die integriert werden müssen. Bei der Integrationsmethode selbst entscheidet die Komplexität der Methode über die Rechenzeit. Eine Methode, bei der noch lineare Gleichungssysteme gelöst werden müssen, wie z.B. bei der impliziten Euler-Integration, ist teurer als eine einfache EulerIntegration. Dieses Argument muß man abwägen gegen die gewünschte Genauigkeit, also wie oft die Methode ausgeführt werden muß bzw. ausgeführt werden kann. Um so kleiner der Zeitschritt um so genauer die Integration. Der Zeitschritt repräsentiert den Grad der Diskretisierung der Funktion. Allerdings ist dieser Grad limitiert. Nach unten hin ist eine Grenze, da die Simulation bei zu kleinen Schrittweiten nicht mehr in Echtzeit läuft. Und nach oben hin liegt die Grenze bei der numerischen Stabilität. Wird also der Zeitschritt zu groß, wird das System numerisch instabil. Um sich von dieser Schrittweitenabhängigkeit zu lösen, werden oft implizite Verfahren gewählt, die in der Berechnung teurer sind. Um eine Variabilität hinsichtlich der Integrationsmethode zu gewährleisten, wird ein allgemeiner Integrator definiert, über den das gewünschte Verfahren spezifiziert werden kann. Wie in dem UML-Diagramm 4.3 ersichtlich, werden von der allgemeinen Integrator-Klasse Integrator die Klassen der Verfahren abgeleitet. Implementiert werden das explizite Euler-Verfahren in expEulerIntegrator , das Verlet-Verfahren in VerletIntegrator sowie das implizite Euler-Verfahren in impEulerIntegrator . Alle diese Verfahren sind in Abschnitt 2.3 beschrieben. Zur Lösung des linearen Gleichungssystems beim impliziten Euler-Verfahren wurde die Methode der konjugierten Gradienten (s. B.3.3) angewendet. 4.3. RENDERING 4.3 45 Rendering Zum Rendern wurde die szenegraphbasierte API OpenSG 3 zu Hilfe genommen. Dabei werden die zu rendernden Geometrien als Blattknoten in den Szenegraphen gehängt. Um dieses Szenegraphen-Prinzip auf die hierarchische Haarrepräsentation anwenden zu können, muß jedem Quadtreeknoten seine darzustellende Geometrie, in Form eines OpenSG-Knotens, zugeordnet sein. Wird im Quadtree die Ebene gewechselt, muß im OpenSG-Szenegraphen die entsprechende Geometrie gerendert werden. Der Quadtree und der OpenSG-Szenegraph müssen parallel traversiert werden. Aus diesem Grund enthält jeder Quadtreeknoten, wie in Abbildung 4.5 dargestellt, drei OpenSG-Knoten: Einen GroupCore-Knoten, einen GeometryCore-Knoten und einen Switch-Knoten, der aus beiden auswählt. Zur Erläuterung: In OpenSG gibt es verschiedene Knotentypen, die unterschiedliche Funktionalitäten ermöglichen: Gruppieren, Transformieren, Selektieren, Geometrien erzeugen usw. Der Teil eines Knotens, der diese Information beinhaltet, wird NodeCore bezeichnet. Je nach Funktion heißt der NodeCore entweder GroupCore, TransformCore, SwitchCore, GeometryCore usw. Der GroupCore-Knoten des Quadtreeknotens enthält die SwitchKnoten der Kinder des Quadtreeknotens. Wird im Quadtree eine Stufe nach unten gegangen, wird der Switch-Knoten auf 0 gesetzt. Steht der Switch-Knoten auf 1, wird der GeometryCore ausgewählt und die Geometrie gerendert. Beim Erzeugen der Geometrien werden unterschiedliche Typen verwendet. Diese sind abhängig vom Typ des BaseHair im Quadtree. Da OpenSG auf OpenGL basiert, sind die Typenbezeichner für die Geometrieprimitive identisch. So wird für einen Haarstreifen GL_QUAD_STRIP, für ein Zylinder mehrere GL_QUAD_STRIPs und für die Einzelhaarrepräsentation mehrere GL_LINE_STRIPs, verwendet. Der Zylinder wird entsprechend dem Algorithmus B.4 konstruiert. Um unnötige Rechenzeit zu vermeiden, wird geprüft, ob die Geometrie eines Knotens bereits erstellt wurde. Falls ja, wird die bereits erstellte Geometrie modifiziert und wiederverwendet. 3 www.opensg.org 46 KAPITEL 4. KONZEPT UND DESIGN Abb. 4.5: Ein Quadtree mit dem integrierten OpenSG-Szenegraphen Kapitel 5 Realisierung In diesem Kapitel wird die Umsetzung und das Resultat des im vorigen Kapitel erarbeiteten Konzepts vorgestellt. Zuerst werden einige Details der Programmierung erläutert. Anschließend werden nach Abwägung verschiedener Voraussetzungen die entstandenen Ergebnisse präsentiert. 5.1 Implementierung In diesem Abschnitt sollen einige wichtige Punkte der Implementierung näher vorgestellt werden. In der Initialisierungsfunktion des Avalon-Knotens Skeleton wird das Masse-FederSystem des Top-Level-Haares angelegt und daraus der Quadtree erzeugt. Für das Rendern der Geometrien ist es wichtig, dass der OpenSG-Szenegraph an das Avalon-System angebunden wird. Manche Avalon-Knoten können über einen Core auf OpenSG-Knoten verweisen. Um einen kompletten OpenSG-Szenegraphen anzubinden, wird dieser Core als SwitchCore definiert. Die Kinder des SwitchCore sind zum einen der GeometrieKnoten des Wurzelknotens des Quadtree und zum anderen ein Gruppen-Knoten mit den Switch-Knoten der Kinder des Wurzelknotens (s. Abbildung 4.5). Über den Core des Avalon-Knotens kann auf diese Weise der OpenSG-Graph gerendert werden. Die Traversierung des Quadtree, die Integration der Massepunkte und das Erzeugen der Geometrien erfolgen aus der Skeleton-Methode simulate() heraus. Um einen programmiertechnischen Überblick zu erhalten, wird an dieser Stelle die Methode als Pseudocode dargestellt. berechne factor ()factor = velocity * distance setze oldLevel = aktuelles Level solange d ≤ DEPTH wenn factor < (d * INTERVALL) 47 KAPITEL 5. REALISIERUNG 48 newLevel = d-1 break d++ wenn Quadtree sichtbar temporäreListe1 = Knoten des aktuellen Levels brechne steps wenn oldLevel < newLevel solange i < steps solange j < temporäreListe1 wenn Knoten in temporäreListe1 unterteilbar füge Kinder des Knotens in temporäreListe2 sonst füge Knoten in temporäreListe2 temporäreListe1 = temporäreListe2 wenn oldLevel > newLevel wenn i < steps solange j < temporäreListe1 wenn Knoten in temporäreListe1 6= Root-Knoten gehe zu Vaterknoten wenn Positionen der Kinder nicht zu weit auseinander füge Kinder des Vaterknotens zusammen sonst break füge Vaterknoten in temporäreListe2 sonst füge Knoten in temporäreListe2 j = nächster Knoten in temporäreListe1 mit anderem Vater temporäreListe1 = temporäreListe2 solange n < temporäreListe integriere Massen im Knoten erzeuge Geometrie Um das neue Hierarchielevel zu bestimmen, wird am Anfang der Methode ein Faktor errechnet, der das Produkt aus dem Abstand des Betrachters und der Durchschnitts- 5.1. IMPLEMENTIERUNG 49 geschwindigkeit der Haarknoten des aktuellen Levels (velocity) ist. Um die Distanz des Betrachters zur Bounding Box des Haares zu errechnen, wird die Methode getViewingDistance() aufgerufen. In der Methode werden vier Distanzstufen unterschieden. Entsprechend dem Intervall, in welches der errechnete Mindestabstand fällt, wird ein Multiplikator für die Faktorberechnung zurückgeliefert (distance). Um das neue Level zu erechnen, wird ein definierter Wertebereich durch die Tiefe des Quadtrees (DEPTH) geteilt, wodurch man ein Werteintervall (INTERVALL) erhält. Die Anzahl, wie oft der Faktor in diesen Wertebereich paßt, entspricht dem neuen Level. Die Anzahl der Schritte (steps), die im Quadtree auf- oder abgestiegen wird, ergibt sich aus der Differenz des alten zum neuen Levels. Wird in der Hierarchie nach oben oder nach unten gegangen, werden die Knoten des neuen Levels in einer temporären Liste zwischengespeichert. Durch das Wiederverwenden und die Dynamik der Listen kann die variable Anzahl der Knoten pro Ebene gehandhabt werden. Wird der Quadtree über mehrere Ebenen traversiert, wird jeweils ausgehend von den Knoten in der Liste in die nächste Ebene gewechselt. Die Knoten des neuen Levels werden wiederum in einer Liste gespeichert. Wenn beim Unterteilen der Knoten und Zusammenfassen der Kindknoten auf die Kinder zugegriffen werden muß, ist zu beachten, dass ein Knoten weniger als vier Kinder haben kann. Das tritt in den unteren Ebenen der Einzelhaarhierarchie auf, wenn durch die Zufallsverteilung der Einzelhaare die Quadranten in den Einzelhaargruppen nicht gleichmäßig besetzt wurden. Um beim Aufsteigen Popping-Effekte zu verhindern, werden nur die Informationen der Kindknoten zusammengefaßt, die nicht zu weit vom Vaterknoten entfernt sind. Wie im letzten Kapitel bereits erwähnt, wurden drei verschiedene Integrationsverfahren implementiert. Die drei Zeilen des expliziten Euler-Verfahrens sind als Pseudocode sind im Anhang B.1 aufgelistet. Bei der Implementierung des Verlet-Verfahrens ist zu bedenken, dass die Berechnung des Faktors für den Wechsel des Detaillevels über die Geschwindigkeit berechnet wird. Daher muß statt des einfachen Verlet-Verfahrens das Velocity-Verlet-Verfahren verwendet werden, bei dem die Geschwindigkeit explizit berechnet wird (vgl. 2.3.3, B.2). Die Umsetzung des impliziten Euler-Verfahrens ist am anspruchsvollsten. Zum einen sind in der Gleichung 2.39 zwei Jacobi-Matrizen die erstellt und multipliziert werden müssen, und zum anderen muß ein lineares Gleichungssystem gelöst werden. Bei einem Masse-Feder-System wird die interne Dynamik durch Federn repräsentiert. Die Federverbindungen drücken sich in den Jacobi-Matrizen aus. Die³ Jacobi-Matrizen, ´ δf j und δf , bestehen aus Untermatrizen mit Ableitungen der Form δf = δf , und δx δv δx δxi ij entsprechend für δf . Sind beim Masse-Feder-System die Partikel i und j über eine Feδv ³ ´ δf ungleich null. Die der miteinander verbunden, ist die entsprechende Ableitung δx ij KAPITEL 5. REALISIERUNG 50 Jacobi-Matrizen für Geschwindigkeit und Position lauten (vgl. [19]): xij xT xij xT δfi L = F K T ij + F K(1 − )(Ident. − T ij ) δxj xij xij |xij | xij xij (5.1) δfi = D ∗ Ident. (5.2) δvj F K ist die Federkonstante, L die Ruhelänge der Feder und D die Dämfungskonstante. Aus diesem Grund werden die Jacobi-Matrizen in der Masseklasse Mass gespeichert. Die Berechnung der Matrizen erfolgt nach dem Algorithmus B.3.1. Um das lineare Gleichungssystem (s. Gleichung 2.39) zu lösen, wird die Methode der konjugierten Gradienten angewandt (s. B.3.3). Bei diesem Verfahren wird die Lösung des LGS approximiert, indem eine zu Beginn getroffene Anfangsannahme iterativ korrigiert wird. Um zu dem Gleichungssystem der Form A∆v = b zu gelangen, muß zuerst b und dann A berechnet werden. Bei der Berechnung des Vektors b ist die Multiplikation der Jacobi-Matrix der Position mit v nicht trivial. Um dieses Problem zu lösen wurde die Hilfsfunktion B.3.2 angewendet. Die Berechnung der Matrix A besteht aus drei Schritten: der Multiplikation der JacobiMatrix der Position mit −h2 , der Multiplikation der Jacobi-Matrix der Geschwindigkeit mit −h und der Multiplikation mit der Massematrix M . Um die Produkte mit den Jacobi-Matrizen zu erhalten, wird ebenfalls der Algorithmus B.3.2 zu Hilfe genommen. 5.2 Tests und Ergebnisse Zu Beginn dieses Abschnitts werden zuerst einige grundlegende Fragen geklärt, die für die Durchführung der Simulation wichtig sind. Als erstes wird untersucht, welches Integrationsverfahren am geeignetsten ist. Danach wird die Frage geklärt, wie die Zylinderrepräsentation beim Cluster-Haartyp genau aussehen soll. Wie bereits erwähnt, ist die Komplexität der Methode ein Kriterium für die Auswahl des Integrationsverfahrens. Um diese bei den drei Integrationsverfahren, explizites und implizites Euler-Verfahren sowie das Verlet-Verfahren, zu testen, werden ihre Berechnungszeiten verglichen. Getestet werden die Verfahren an drei verschiedenen Streifen mit einem darunterliegenden Masse-Feder-System. Der erste Streifen enthält 10 Massepunkte, der zweite 100 und der dritte 1000. Die Ergebnisse sind in Abbildung 5.1 zu sehen. Das Verlet- und das explizite Euler-Verfahren unterscheiden sich nur gering in der Geschwindigkeit. Das implizite Euler-Verfahren ist dagegen deutlich langsamer, was für eine EchtzeitAnwendung von Nachteil sein kann. 5.2. TESTS UND ERGEBNISSE 51 Abb. 5.1: Das explizite und implizite Euler-Verfahren sowie das Verlet-Verfahren im Vergleich Das zweite entscheidende Kriterium ist die Stabilität eines Verfahrens. Abbildung 5.2 zeigt die Schwelle der Schrittweite zur Instabilität beim exliziten EulerVerfahren. Sie liegt bei 0.035 zu 0.036 Sekunden. Beim Verlet-Verfahren (vgl. Abb. 5.3) liegt die Schwelle bereits bei 0.0045 Sekunden. Zwischen 0.0045 und 0.018 Sekunden verläuft die Simulation sehr unkontrolliert, was man bei der mittleren Abbildung bei 0.006 Sekunden sehen kann. Ab 0.018 Sekunden ist das Verfahren instabil. Abb. 5.2: Vergleich des expliziten Euler-Verfahrens mit einer Schrittweite von 0.035 sec. und 0.036 sec. Festzustellen ist, dass das explizite Euler-Verfahren mit größeren Schrittweiten stabiler ist, als das Verlet-Verfahren. Für eine Echtzeit-Anwendung ist das von Vorteil. 52 KAPITEL 5. REALISIERUNG Abb. 5.3: Vergleich des Verlet-Verfahrens mit einer Schrittweite von 0.0045 sec., 0.006 sec. und 0.018 sec. Es bleibt anzumerken, dass die gemessenen Schwellen von dem Federkoeffizient abhängen. In Abbildung 5.4 wurde der Federkoeffizient auf 100 gesetzt, statt auf 500 wie bei den obigen Tests. Bei niedrigerem Federkoeffizient liegt die Stabilitätsschwelle höher, im Beispiel bei 0.07 Sekunden. Abb. 5.4: Unterschiedliche Stabilität des expliziten Euler-Verfahrens bei einer Schrittweite von 0.07 sec. mit einem Federkoeffizient von 100 (statt 500 wie oben) Allerdings erreicht das explizite Euler-Verfahren, bei allen getesteten Federkoeffizienten, bei einem größeren Zeitschritt numerische Instabilität, als das Verlet-Verfahren. Die Ergebnisse des Geschwindigkeitstest und des Stabilitätstests begründen die Entscheidung für das explizite Euler-Verfahren als Integrationsverfahren für die Simulation. Eine weitere Entscheidung, die getroffen werden muss, ist die Anzahl der Seitenflächen des Zylinders um die Cluster-Repräsentation darzustellen. Mit steigender Anzahl der Seitenflächen nimmt zwar die visuelle Qualität zu, der Rechenaufwand allerdings auch. Um einen Kompromiss zu finden, wurde die benötigte Rechenzeit mit der Qualität der Darstellung verglichen. Getestet wurden Zylinder mit 3 bis 10 Seiten (s. Abb. 5.5). Die Berechnungszeit setzt sich aus der Zeit für das Rendering und der Zeit für die Konstruktion (B.4) zusammen. Eine befriedigende Darstellung erhält man erst ab 5 Seiten. Da der Rechenaufwand für einen Zylinder mit mehr als 8 Seiten stark ansteigt (vgl Abb. 5.6), wurde eine Repräsentation mit weniger Seiten gewählt. Da der Zylinder 5.2. TESTS UND ERGEBNISSE 53 Abb. 5.5: Verschiedene Zylinderseiten, von 3 bis 10 Seiten aus optischen Gründen mehr als 5 Seiten, aus zeitlichen Gründen jedoch 8 Seiten oder weniger haben soll, wurde eine Repräsentation mit 6 Seiten gewählt. Nachdem entschieden wurde, welche Integration verwendet wird, und wie der Zylinder dargestellt wird, kann nun das Simulationsverfahren untersucht werden. Gegenstand der Untersuchung sind folgende Punkte: 1. Modellierung der Frisur (Streifenbreite) im Hinblick auf die Struktur des Quadtrees (Tiefe) 2. Wahl der Schwellwerte für den Wechsel der Repräsentation beim Aufbau des Baumes 3. Der Faktor für den Wechsel der Hierarchiestufe während der Simulation 4. Anzahl der Haarsegmente, bzw. Massen und Federn des darunterliegenden MasseFeder-Systems, im Hinblick auf die Geschwindigkeit und die Qualität der Bewegung 5. Anzahl der Streifen des Modells im Hinblick auf die Geschwindigkeit der Simulation und die Qualität der Darstellung Als Modelle für die Versuche wurden zwölf Frisur-Modelle erstellt (s. Tabelle 5.1). Fünf Frisuren sind mit einer einheitlichen Breite modelliert, unterscheiden sich aber in der Anzahl der Streifen. Fünf weitere Frisuren haben die gleiche Anzahl an Haarstreifen, unterscheiden sich aber in der Breite der modellierten Streifen. Bei drei Modellen sind die Haarstreifen durch unterschiedlich viele Segmente aufgebaut. Der Quadtree wird nun, wie im letzten Kapitel bereits erklärt, aufgebaut, indem die Geometrie immer wieder geviertelt wird. Die Haarrepräsentation wird gewechselt, KAPITEL 5. REALISIERUNG 54 Abb. 5.6: Vergleich der Zylinderrepräsentation mit unterschiedlicher Anzahl Seitenflächen Modell Frisur A Frisur B Frisur C Frisur D Frisur E Frisur F Frisur G Frisur H Frisur I Frisur K Frisur L Frisur M Anzahl der Haarstreifen 109 78 53 127 161 109 109 109 109 78 78 78 Breite eines Haarstreifens 0.71 0.71 0.71 0.71 0.71 0.28 0.49 0.92 1.06 0.71 0.71 0.71 Tabelle 5.1: Getestete Frisurmodelle Segmente 8 8 8 8 8 8 8 8 8 4 6 8 5.2. TESTS UND ERGEBNISSE 55 wenn ein definierter Schwellwert unterschritten wird. Bei Haarstreifen werden bei der Unterteilung Haarzylinder gewählt, falls die Breite des Haarstreifens kleiner als ein definierter Wert ist. Ebenso werden die Kinder eines Haarzylinders zu Einzelhaargruppen, falls der Radius unter einer vorgegebenen Schwelle liegt. Die Unterteilung geschieht maximal so lange, bis die Blätter des Baumes aus jeweils einem Einzelhaar bestehen. Die Tiefe des Baumes hängt folglich von den gesetzten Schwellwerten und der Anzahl der Einzelhaare, die ein Zylinder enthält ab. Über die Schwellwerte kann man festlegen, ob bereits sehr früh eine feinere Auflösung benutzt werden soll. Anders ausgedrückt: bei welchem Abstand und welchen Kräften wird welcher Haartyp erzeugen. Beim Aufbau des Quadtrees hängt die Tiefe des Baums von der Breite des Streifens ab. Ein breiter Streifen wird öfters unterteilt als ein schmaler. Die Tiefe des Baumes hängt auch davon ab, wie viele Einzelhaare pro Einzelhaargruppe definiert sind. In Tabelle 5.2 wurden die Frisuren A-I mit 4 Einzelhaaren pro Einzelhaargruppe definiert, und Fisur I∗ mit 6 Einzelhaaren. Der Quadtree von Frisur I∗ erreicht ein viel tieferes Level als Frisur I, da die Einzelhaargruppen so lange unterteilt werden, bis in jedem Knoten nur noch ein Einzelhaar ist. Da das für 6 Haare pro Gruppe länger dauert als für 4, ist der resultierende Baum tiefer. Level Fisur G 0 1 Strip 1 4 Strands 2 16 Strands 3 4 5 6 Frisur A 1 Strip 4 Cluster 16 Strands 64 Strands Frisur I 1 Strip 4 Cluster 16 Cluster 64 Strands 256 Strands Frisur I* 1 Strip 4 Cluster 16 Cluster 64 Strands 206 - 221 Strands 374 - 384 Strands 384 Strands Tabelle 5.2: Unterschiedliche Tiefe des Quadtree in Abhängigkeit der Breite des TopLevel-Streifens Die Tiefe des Baums ist in vielerlei Hinsicht von Bedeutung. Zum einen wirkt sie sich auf die Benutzung des Speicherplatzes aus, denn desto tiefer der Baum, desto mehr Speicherplatz wird verbraucht, da die Anzahl der Knoten pro Ebene näherungsweise exponentiell wächst. Zum anderen machen sich viele Knoten in einer Ebene in der Performanz bemerkbar. Abbildung 5.7 zeigt, wie die Anzahl der Haarknoten einer Frisur mit zunehmendem Level ansteigt. In dem Beispiel wurde von einem Frisurmodell mit 90 top-level Streifen ausgegangen. Bereits im zweiten Level sind mehr als 1400 Haarknoten erreicht. Im dritten Level sind es schon über 5700 und im vierten 21150 Knoten. 56 KAPITEL 5. REALISIERUNG Da eine Echtzeit–Simulation für über 21000 Knoten sehr schwierig wird, wird das dritte Level als unterste Ebene gewählt. Abb. 5.7: Anzahl der Haarknoten insgesamt pro Level bei einem Frisurmodell mit 90 initialen Streifen Für die Struktur des Baumes sind auch die Schwellwerte für den Wechsel der Repräsentation wichtig. Sie geben an, bei welcher Streifenbreite oder bei welchem Zylinderradius der Haartyp gewechselt werden soll. Wie die Verteilung der einzelnen Repräsentationen im Baum sein kann, wird in Abbildung 5.8 gezeigt. Im linken Beispiel sind der Clusterschwellwert und der Strandschwellwert relativ niedrig, der Anteil an Strips ist folglich relativ hoch. Im mittleren Beispiel wurde der Schwellwert für die Clusterrepräsentation, der maximal mögliche Radius für einen Zylinder, nach oben gesetzt. Der Anteil an Haarzylinder steigt dadurch. Wird der Schwellwert für die Clusterund für die Strandrepräsentation nach oben gesetzt, werden bereits ab einem früheren Level Einzelhaargruppen dargestellt. Die Aufteilung der Repräsentationen wirkt sich auf die Rechenzeit aus, denn die einzelnen Haartypen sind unterschiedlich teuer. An Frisurmodell A (s. Abb. A.2) wurde getestet, wie stark die Rechenzeiten für die Simulation mit den einzelnen Typen variie- 5.2. TESTS UND ERGEBNISSE 57 Abb. 5.8: Struktur des Baums bei unterschiedlichen Schwellwerten ren. Die Zeiten sind in Tabelle 5.3 dargestellt. Die Streifen sind demnach am schnellsten, vor den Zylindern und vor den Einzelhaargruppen. Es ist folglich geschickt, die Schwellwerte so zu wählen, dass weder der Anteil der Zylinder noch der Anteil der Einzelhaargruppen dominiert, die visuelle Darstellung dennoch durch die LOD-Struktur des Quadtree profitiert. Eine Aufteilung, ähnlich der Abbildung links in 5.8, ist anzustreben. Level Zeit 0 (Strip) 72.4873 sec. 1 (Cluster) 183.898 sec. 2 (Strand) 439.995 sec. Tabelle 5.3: Simulation mit unterschiedlichen LOD(Simulationsschleife mit 10000 Wiederholungen) -1 (LOD) 125.057 sec. Haartypen und mit Durch die Verwendung der verschiedenen Haartypen wird die Qualität der Darstellung verbessert. Für die optische Erscheinung der Frisur ist ebenfalls die Anzahl der Haarstreifen eines Modells von Bedeutung. Das menschliche Haupt hat im Schnitt 100 000 Haare. Um eine ansprechende Darstellung zu erzeugen, ist es nicht nötig diese Anzahl zu simulieren. Zudem ist es eine Frage der Geschwindigkeit, welche Menge an Haaren in Echtzeit simuliert werden kann. Durch den Vergleich der Modelle A bis E, wurde getestet, wie sich die unterschiedliche Anzahl an Streifen auf die Geschwindigkeit auswirkt. In Abbildung 5.9 sind die Ergebnisse des Tests dargestellt. Die Dauer nimmt proportional zur Streifenzahl zu. Da das Modell A, mit 78 top-level Streifen, optisch bereits befriedigende Ergebnisse liefert, ist bei der Modellierung, bei entsprechender Breite der Streifen, eine Anzahl zwischen 80 und 100 Streifen zu empfehlen. Das zuletzt untersuchte Kriterium ist die Anzahl der Segmente, aus denen ein Haar aufgebaut ist. Bei einer Langhaarfrisur ist es angebracht mehr Segmente zu verwenden, als bei kürzeren Haaren. Über die Anzahl der Segmente wird entschieden, wie das 58 KAPITEL 5. REALISIERUNG Abb. 5.9: Frisurmodelle mit unterschiedlicher Streifenanzahl (Gemessene Zeiten in sec.: FrisurB 47.8389, FrisurC 71.69, FrisurA 108.067, FrisurD 132.14 ,FrisurE 174.614) 5.3. FAZIT 59 Segmente 4 Zeit 76.7731 sec. 6 94.7276 sec. 8 113.1567 sec. Tabelle 5.4: Vergleich mit unterschiedlicher Anzahl von Segmenten: Frisur K, Frisur L, Frisur M Masse-Feder-System aufgebaut ist, also wie viele Massen und Federn enthalten sind. Je mehr Massepunkte integriert werden müssen, desto mehr Zeit wird in Anspruch genommen (vgl. Tab. 5.4). 5.3 Fazit Die Tests und Ergebnisse im letzten Abschnitt, führen abschließend zu folgendem Fazit. Bei den implementierten Integrationsverfahren empfiehlt sich die Verwendung der expliziten Euler–Integration. Die maximale Schrittweite bei der Integration hängt von der Masse und der Federkonstanten ab. Aus diesen Parametern lässt sich auch der optimale Dämpfungskoeffizient errechnen, mit: FK D= √ 2 m ∗ FK (5.3) Dabei ist F K der Federkoeffizient und m die Masse. Für die Darstellung der Clusterrepräsentation ist ein 6-seitiger Zylinder ausreichend. Um eine Simulation in Echtzeit zu erhalten, ist die Streifenbreite beim Haarmodell so zu wählen, dass eine maximale Tiefe des Quadtrees von 3 Leveln erreicht wird. Bei den getesteten Beispielen wird dies bei einer Streifenreite von 0.7, und den Schwellwerten für Cluster bei 0.35 und für Strands bei 0.125, erzielt. Um eine unnötige Tiefe des Baumes zu vermeiden (vgl. Fisur I∗ in Tabelle 5.2), wird die Menge der Strands, die aus einem Cluster hervorgehen, auf vier gesetzt. Es ist ebenfalls ausreichend, bei der Modellierung zwischen 80 und 100 Streifen zu erzeugen, mit maximal vier Segmenten bei kürzeren Haaren (s. Modell Abb. A.1). Unter diesen Bedingungen, ähnlich wie bei dem Versuch in Tabelle 5.3, liefert das adaptive Verfahren sehr zufriedenstellende Ergebnisse. Wie aus Tabelle 5.3 ersichtlich, ist die Simulation mit der LOD-Technik zwar teurer als die Simulation mit einfachen Streifen, die Darstellung ist durch die Kombination von mehreren Haartypen jedoch erheblich verbessert. 60 KAPITEL 5. REALISIERUNG Kapitel 6 Zusammenfassung und Ausblick 6.1 Zusammenfassung Für eine glaubwürdige und realistisch wirkende Animation von virtuellen Charakteren ist die korrekte Simulation von Kleidung und Haaren von großer Bedeutung. Dabei stellt die Berechnung der Bewegungsabläufe in Echtzeit eine besondere Herausforderung dar. Eine Möglichkeit der Beschleunigung ist der Einsatz von adaptiven Strukturen. In dieser Diplomarbeit wurde deren Verwendung im Zusammenhang mit der Simulation von Kleidung und Haaren in Echtzeit untersucht. Dabei wurde ein Überblick über adaptive Strukturen gegeben und verschiedene Möglichkeiten des Level of Detail für Stoff und Haare vorgestellt. Am Beispiel von Haaren wurde gezeigt, wie eine adaptive Simulation in der Praxis aussehen kann und welche Vorteile sie bietet. Das Konzept orientiert sich stark an dem Verfahren von Ward et al. [17][16]. Als Kontrollstruktur für die Dynamiksimulation wurde ein Masse-Feder-System gewählt. Die Adaption erfolgt zum einen über unterschiedlich aufgelöste Kontrollstrukturen und zum anderen über unterschiedlich feine Geometrien. Durch die zweifache Anwendung der Technik des Level of Detail, wird bei gleichzeitiger Verfeinerung der Kontrollstrukturen, die Qualität der Darstellung, durch weniger abstrakte Geometrien, verbessert. Die unterschiedlichen Auflösungen werden vorberechnet und in einer hierarchischen Datenstruktur gespeichert. Für das Speichern der Hierarchie wurde eine Quadtree-Datenstruktur verwendet. Zur Laufzeit wird, abhängig von folgenden Kriterien, im Quadtree auf- und abgestiegen. Die Kriterien sind die einwirkende Kraft auf die Haare und der Abstand des Betrachters. Wird eine starke Kraft ausgeübt, z.B. in Form von Kopfbewegung, oder ist der Betrachter sehr nahe an den Haaren, z. B. durch Heranzoomen der Kamera, wird ein feineres Level of Detail verwendet, indem im Quadtree eine tiefere Ebene gewählt wird. Das Simulationssystem wurde in die VR-Umgebung Avalon integriert. Durch das 61 62 KAPITEL 6. ZUSAMMENFASSUNG UND AUSBLICK Avalon-Webinterface (s. Abb. 6.1) können die Parameter der Haare zur Laufzeit angesteuert und verändert werden. So können die Schrittweite der Integration, die Anzahl der Simulationsschleifen pro Frame, die Dämpfungs- und Federkonstante und die Masse des Masse-Feder-Systems geändert werden. Über das Interface kann die Technik des LOD deaktiviert, und stattdessen ein bestimmtes Level der Hierarchie ausgewählt werden. Die Resultate des Verfahrens sind abhängig von der Parametrierung (vgl. 5.3). Abb. 6.1: Frisurmodelle mit unterschiedlicher Streifenanzahl Für das Rendering wurde die OpenGL-basierte API OpenSG verwendet. Die Modelle, die getestet wurden, wurden mit dem Cinema4D-PlugIn HairDepartment erzeugt. 6.2. AUSBLICK 6.2 Ausblick 6.2.1 Optimierung und Ergänzung 63 Für die meisten Dynamiksimulationen ist die Behandlung der Kollision unverzichtbar. Es besteht die Möglichkeit, für die Kollisionserkennung frei erhältliche Bibliotheken1 aus dem Internet zu verwenden. Einen realistischen Eindruck erhalten die Haare durch den Einsatz von Texturen und Shadern. Dadurch werden die geometrischen Unterschiede der Haartypen verwischt, und die Popping-Effekte gemindert. Um eine gößere Vielfalt an Frisuren simulieren zu können, sollten verschiedene Haarstile berücksichtigt werden. So sollten neben glatten Haaren auch gelockte Haare umgesetzt werden können. Wie in der Natur beobachtet werden kann, können Haare unterschiedlich dick sein. Diese Tatsache sollte im System berücksichtigt werden, da sie sich sowohl auf das Aussehen wie auf das Dynamikverhalten auswirkt. 6.2.2 Weiterführende Überlegungen Bei dem implementierten Ansatz ist die Verwaltung sowie die Adaption des Modells auf Objekte mit eindimensionalen Kontrollstrukturen ausgerichtet. Um ein allgemeines adaptives System für Dynamik-Simulation zu entwerfen, welches auch 2D- oder 3D-Objekte, wie Stoff oder Körper, unterstützt, kann das Konzept der hierarchischen Datenverwaltung kombiniert mit adaptivem Rendering übernommen werden. Allerdings bietet ein Kontinuum-Mechanik-Simulationsmodell für eine adaptive Simulation von Kleidung Vorteile, da es eine bessere Näherung an die Wirklichkeit bietet und eine Abbildung der Viskoelastizität unterstützt. Für Textilien und biologisches Weichgewebe stellt die Viskoelastizität eine grundlegende Eigenschaft dar. Als Basis für ein Konzept bietet sich die Arbeit von Hauth an. Er stellt in [22] ein Verfahren basierend auf der Methode der Finiten Elemente vor, dessen Effizienz durch einen schnellen Lösungsalgorithmus zur impliziten numerischen Integration gesteigert wird. Debunnes et al. [9] stellt in seinen Arbeiten Adaptionsverfahren vor, die für KontinuumModelle geeignet sind. Bei der Simulation von Stoff gilt die Besonderheit der Gewebestruktur (gewebt, gestrickt, ...) zu beachten, denn die Gewebestruktur wirkt sich auf das dynamische Verhalten des Textils aus. Neben der Struktur verändern auch das Fasermaterial (Baumwolle, Synthetik, ...) sowie die Dicke und der Aufbau der Fasern die Bewegung. 1 http://www.cs.unc.edu/ geom/SSV 64 KAPITEL 6. ZUSAMMENFASSUNG UND AUSBLICK Anhang A Bilder Abb. A.1: Frisurmodell mit 109 Streifen mit jeweils 3-4 Segmenten 65 66 ANHANG A. BILDER Abb. A.2: FrisurA mit 109 Streifen mit jeweils 8 Segmenten 67 Abb. A.3: FrisurA unter Einwirkung starker äußerer Kräfte. Die Haare werden in der höchsten Auflösung, als Einzelhaare, repräsentiert. 68 ANHANG A. BILDER Abb. A.4: Die äußeren Kräfte lassen im Vergleich zu Abb. A.3 nach. Die Haare werden in der nächst niedrigeren Auflösung, als Zylinder, dargestellt. 69 Abb. A.5: Die Kräfte, die auf die Haare wirken, ist zum Teil so gering, dass die gröbste Darstellungsstufe, die Streifendarstellung, gewählt wird. 70 ANHANG A. BILDER Abb. A.6: Die Repräsentationen der Haare werden durch Heranzoomen verfeinert. 71 Abb. A.7: Durch Drehen des Kopfes nach links, geraten die Haare in Bewegung. Die wirkende Kraft ist so groß, dass die Haare als Zylinder repräsentiert werden. 72 ANHANG A. BILDER Anhang B Algorithmen B.1 Explizite Euler-Integration i=0 for i ¿ masses.size masses[i].acceleration = masses[i].force / masses[i].mass masses[i].velocity = masses[i].velocity + masses[i].acceleration * dt masses[i].position = masses[i].position + masses[i].velocity * dt i++ B.2 Velocity-Verlet-Integration pos = 0 accNext = 0 i=0 for i ¿ masses.size pos = masses[i].position masses[i].acceleration = masses[i].force / masses[i].mass masses[i].position = (pos + masses[i].velocity * dt) + masses[i].acceleration * (dt2 /2) accNext = (masses[i].position - pos) * (1 / dt2 ) masses[i].velocity = masses[i].velocity + (( masses[i].acceleration + accNext) / 2) * dt i++ 73 ANHANG B. ALGORITHMEN 74 B.3 Implizite Euler-Integration b=0 A=0 i=0 ∆v = 0 for i ¿ masses.size b = dt (masses[i].force + (dt * JacobiProduct1)) M = I. * (1/m) A = M - JacobiProduct2 - JacobiProduct3 ∆v = solveLSE(b,A) masses[i].velocity = masses[i].velocity + ∆v masses[i].position = masses[i].position + masses[i].velocity * dt i++ B.3.1 Jacobi-Matrizen berechnen liefert Jacobi-Matrizen für Position JacobiX und für Geschwindigkeit JacobiV i=0 displacement = 0 vp = 0 length = 0 for i ¿ springs.size displacement = springs[i].mass1 - springs[i].mass2 vp = displacement * displacement length = sqrt(displacement * displacement) if(length != 0) length = 1.0 / length vp = vp * (l*l) springs[i].JacobiX = (vp + (I. - vp) * (1 - springs[i].length * length)) * springs[i].springconstant springs[i].JacobiV = I. springs[i].JacobiV *= springs[i].dampingconstant i++ B.3. IMPLIZITE EULER-INTEGRATION B.3.2 Hilfsfunktion für Multiplikation mit Jacobi-Matrizen Liefert Multiplikationsmatrizen für Jacobi-Matrizen JacobiProductN i=0 tmp = 0 for i ¿ springs tmp = springs[i].JacobiX * (springs[i].mass1 - springs[i].mass2) springs[i].mass1.JacobiProduct -= tmp springs[i].mass2.JacobiProduct += tmp i++ B.3.3 Methode der konjugierten Gradienten ∆v=0 i=0 r=b-A∆v d=r epsNew = rT r eps0 = epsNew while(i ¿ iMax && epsNew À eps * eps0) q=Ad α = epsNew / (dT q) ∆r = ∆v + (α d) r = r - (α d) epsOld = epsNew epsNew = rT r β = epsNew / epsOld d = r + (β α) i++ 75 ANHANG B. ALGORITHMEN 76 B.4 Algorithmus zu Konstruktion des Zylinders r=0 s=0 i=0 vectors berechenen Radien zu allen Punkten des Zylinders for r ¿ Anzahl der Seitenflächen for s ¿ Anzahl der Masse-Feder-Segmente i++ position = position + vectors[Anzahl der Seitenflächen * s + r] s++ s=0 for s ¿ Anzahl der Masse-Feder-Segmente indexA = s + r * Anzahl der Masse-Feder-Segmente if r 6= (Anzahl der Seitenflächen - 1) indexB = s + (r+1) * Anzahl der Masse-Feder-Segmente else indexB = s s++ r++ Abbildungsverzeichnis 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 2.11 2.12 Weg-Zeit-Diagramm . . . . . . . . . . . . . . . . . Geschwindigkeits-Zeit-Diagramm . . . . . . . . . . Bahnkurve mit tangentialem Geschwindigkeitsvektor Cantilever-Beam-Modell . . . . . . . . . . . . . . . Unterschiedliche Federtypen . . . . . . . . . . . . . Anfangswertproblem . . . . . . . . . . . . . . . . . Explizites Euler-Verfahren . . . . . . . . . . . . . . Runge-Kutta-Verfahren 2. Ordnung . . . . . . . . . Runge-Kutta-Verfahren 4. Ordnung . . . . . . . . . Diverse Bounding Volume-Typen . . . . . . . . . . . Swept Sphere Volumes . . . . . . . . . . . . . . . . Bounding Volume Hierarchie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 10 11 14 15 17 18 19 20 23 23 24 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 Level of Detail bei deformierbaren Materialien Verschiedene LODs und resultierendes Mesh . Erzeugung regelmäßiger Dreiecke . . . . . . . Beispiele aus [28] . . . . . . . . . . . . . . . . Verbindung von zwei Leveln mit ghost-nodes . Informationsaustauch zwischen zwei Leveln . . Clustermodelle . . . . . . . . . . . . . . . . . Verfeinerung einer Strähne . . . . . . . . . . . Adaptive Wisp Tree (AWT) Verfahren . . . . . Drei unterschiedliche Haarrepräsentationen . . Schematische Darstellung der Hierarchie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 28 28 29 29 30 31 32 33 34 35 4.1 4.2 4.3 4.4 4.5 Cinema4D-PlugIn HairDepartment . . . . . . . . . . . . . UML-Diagramm (a) . . . . . . . . . . . . . . . . . . . . . UML-Diagramm (b) . . . . . . . . . . . . . . . . . . . . UML-Diagramm (c) . . . . . . . . . . . . . . . . . . . . . Ein Quadtree mit dem integrierten OpenSG-Szenegraphen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 41 42 43 46 77 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ABBILDUNGSVERZEICHNIS 78 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 Integrationsverfahren im Vergleich . . . . . . . . . Vergleich des expliziten Euler-Verfahrens . . . . . Vergleich des Verlet-Verfahrens . . . . . . . . . . . Unterschiedliche Stabilität . . . . . . . . . . . . . Verschiedene Zylinderseiten . . . . . . . . . . . . Unterschiedliche Zylinderrepräsentation . . . . . . Anzahl der Haarknoten einer Frisur . . . . . . . . Verschiedene Schwellwerte . . . . . . . . . . . . . Frisurmodelle mit unterschiedlicher Streifenanzahl . . . . . . . . . 51 51 52 52 53 54 56 57 58 6.1 webinterface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 A.1 A.2 A.3 A.4 A.5 A.6 A.7 final1 . . . . . . . . . . . . . . . . . . . . FrisurA . . . . . . . . . . . . . . . . . . . FrisurA mit Einzelhaaren . . . . . . . . . . FrisurA als Clusterrepräsentation . . . . . . FrisurA als teils Zylinder und teils Streifen . Verfeinerung durch Heranzoomen . . . . . Haarbewegung durch Drehen des Kopfes . . 65 66 67 68 69 70 71 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tabellenverzeichnis 2.1 Verschiedene Simulationsmodelle . . . . . . . . . . . . . . . . . . . . 13 5.1 5.2 5.3 5.4 Getestete Frisurmodelle . . . . . . . . . . . . . . . . . . . Unterschiedliche Tiefe des Quadtree . . . . . . . . . . . . Simulation mit unterschiedlichen Haartypen und mit LOD Vergleich mit unterschiedlicher Anzahl von Segmenten . . 54 55 57 59 79 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 TABELLENVERZEICHNIS Literaturverzeichnis [1] Witkin Andrew and Baraff David. Physically based modeling: Principles and practice. 1997. [2] Hutchinson Dave, Preston Martin, and Hewitt Terry. Adaptive refinement for mass/spring simulations. In Proceedings of the Eurographics workshop on Computer animation and simulation, pages 31–45. Springer-Verlag, 96. [3] Baraff David. Large steps in cloth simulation. In ACM SIGGRAPH ’98, 1998. [4] Luebke David, Reddy Martin, Jonathan D. Cohen, Varshney Amitabh, Watson Benjamin, and Huebner Robert. Level of Detail for 3D Graphics. Morgan Kaufmann Publishers, 2003. [5] Terzopoulos Demetri, Platt John, Barr Alan, and Fleischer Kurt. Elastically deformable models. In Computer Graphics, 1987. [6] Hering Ekbert, Martin Rolf, and Stohrer Martin. Physik für Ingenieure. Springer, Berlin, 2002. [7] Bertails F., Kim T-Y, Cani M.-P., and Neumann U. Adaptive wisp tree - a multiresolution control structure for simulating dynamic clustering in hair motion. In Symposium on Computer Animation’03, 2003. [8] Freund Frank. Animation von avataren bei physikalisch basierten kleidungssimulationen. Master’s thesis, FH Darmstadt, 2003. [9] Debunne Gilles, Desbrun Mathieu, Cani Marie-Paule, and Barr Alan. Adaptive simulation of soft bodies in real-time. In Computer Animation, 2000. [10] Debunne Gilles, Desbrun Mathieu, Cani Marie-Paule, and Barr Alan. Dynamic real-time deformations using space and time adaptive sampling. In ACM SIGGRAPH, 2001. [11] Eberly David H. Game Physics. Morgan Kaufmann Publishers, 2004. 81 82 LITERATURVERZEICHNIS [12] House Donald H. and Breen David E., editors. Cloth Modeling and Animation. A K Peters, Natick Massachusetts, 2000. [13] Press William H., Teukolsky Saul A., Vetterling William T., and Flannery Brian P. Numerical Recipes in C++, The Art of Scientific Computing. Cambridge University Press, second edition edition, 2002. [14] Anjyo Ken Ichi, Usami Yoshiaki, and Kurihara Tsuneya. A simple method for extracting the natural beauty of hair. In Computer Graphics, 1992. [15] Bronstein I.N. and Semendjajew K.A. Teubner - Taschenbuch der Mathematik. B.G. Teubner Verlagsgesellschaft, 1996. [16] Ward Kelly and Lin Ming C. Adaptive grouping and subdivision for simulating hair dynamics. Pacific Conference on Computer Graphics and Applications, 2003. [17] Ward Kelly, Lin Ming C., Lee Joohi, Fisher Susan, and Macri Dean. Modeling hair using level-of-detail representations. Proc. of Computer Animation and Social Agents, 2003. [18] Koh Chuan Koon and Huang Zhiyong. Modeling and animation of human hair in strips. In Eurographics Workshop on Animation and Simulation, 2000. [19] Choi Kwang-Jin and Ko Hyeong-Seok. Stable but responsive cloth. In ACM SIGGRAPH, 2002. [20] Bourg David M. Physics for Game Developers. O’Reilly, 2002. [21] Hauth Michael. Numerical techniques for soft object simulation. In Proceedings of the Eurographics, 2004. [22] Hauth Michael. Visual Simulation of Deformable Models. PhD thesis, EberhardKarls-Universität Tübingen, 2004. [23] Magnenant-Thalmann N. and Hadap S. State of the art in hair simulation. In Proceedings of International Workshop on Human Modeling and Animation, 2000. [24] Volino P. and Magnenant-Thalmann N. Virtual Clothing, Theory and Practice. Springer, 2000. [25] Volino Pascal and Magnenant-Thalmann Nadia. Comparing efficiency of integration methods for cloth simulation. In Computer Graphics International Proceedings, 2001. [26] Hadap Sunil and Magnenant-Thalmann Nadia. Modeling dynamic hair as continuum. In Computer Graphics Forum, 2001. LITERATURVERZEICHNIS 83 [27] Kim Tae-Young and Neumann Ulrich. Interactive multiresolution hair modeling and editing. In SIGGRAPH ’02: Proceedings of the 29th annual conference on computer graphics and interactive techniques, 2002. [28] Volkov Vasily and Ling Li. Adaptive local refinement and simplification of cloth mass. In ICITA 2002, 2002. [29] Provot Xavier. Deformation constraints in a mass-spring model to describe rigid cloth behavior. In Graphics Interface ’95, 1995. [30] Bando Yosuke, Chen Bing-Yu, and Nishita Tomoyuki. Animating hair with loosely connected particles. In Computer Graphics Forum, 2003.