[Der Animationsprogrammierer Henrik Enquist beschrieb, wie sein Team eine überzeugende Tweed-Jackensimulation des Protagonisten des Horror-Thrillers Alan Wake erstellte.]Die Hauptfigur unseres Action-Thrillers ist Alan Wake, ein Schriftsteller, der in einen Albtraum verwickelt ist, in dem er gezwungen ist, mit dunklen Mächten zu kämpfen und das Geheimnis des Verschwindens seiner Frau zu lösen. Er ist kein gut ausgebildeter Actionheld, sondern ein gewöhnlicher Mensch.
Um den Charakter zu betonen, wollte unser Art Director ihm eine alte Tweedjacke mit Flecken an den Ellbogen anziehen. Das Spiel findet im Gefolge der realen Welt statt, daher sind die Charaktere im Gegensatz zu einem Fantasy-Spiel oder einem Weltraum-Shooter in den verwendeten Werkzeugen begrenzt. Und das bedeutet, dass die Kleidung unserer Charaktere viel wichtiger wird.
Um die Illusion einer Thrilleratmosphäre zu vermitteln, sollte Alan Wakes Jacke so glaubwürdig wie möglich sein. Die Jacke sollte im Wind flattern und dem Charakter zusätzliche Bewegungen hinzufügen, wenn er sich durch den Wald bewegt. Als Programmierer begann ich sofort über die Verwendung von Gewebesimulation nachzudenken.
Stoffsimulation wurde in vielen Spielen vor uns verwendet, aber die dort oft verwendeten Techniken gaben ein Gefühl von Seide oder Gummi - Materialien, die für uns nicht geeignet sind. Erst in jüngster Zeit tauchten sehr gute Gewebesimulationssysteme von Drittunternehmen auf, aber zu der Zeit, als wir eine stabile Lösung benötigten, gab es solche Tools noch nicht oder sie entsprachen nicht unseren Anforderungen.
In diesem Artikel werde ich über die Probleme sprechen, mit denen wir konfrontiert waren, und über die Lösungen für die Erstellung unserer eigenen Gewebesimulation.
Jacke Rig
Die Jacke wurde zusammen mit dem Rest des Charakters wie ein normales Hautnetz modelliert. Die Knochen, die das Jackennetz steuern, sind eine separate Schicht auf einem normalen Skelett. Jackenärmel verwenden das übliche Muster für Schulter und Unterarm. Sowohl Schultern als auch Unterarme sind in einen Hauptknochen und einen Biegeknochen unterteilt. Der obere Teil der Jacke wird durch Betrachtungsbeschränkungen gesteuert, und der untere Teil wird durch die Verlet-Simulation gesteuert.
Abbildung 1. Rig-Jacke auf einem normalen Wildgerüst.Jackenoberteil
Die Knochen der Jacke haben eine Hierarchie, die von oben nach unten verläuft (die unteren sind Kinder der oberen). Wenn sich also die oberen Knochen bewegen, folgen ihnen die unteren Knochen. Wir waren versucht, die Tochter mit den unteren Knochen direkt an die Brust zu bringen, aber das würde zu einem Bewegungsverlust führen, insbesondere zu vertikalen Bewegungen, wenn der Charakter seine Schultern hebt.
Im oberen Teil der Jacke simulieren wir die Bewegung der Polster auf den Schultern, wobei wir die Knochen der Schultern mithilfe von Betrachtungsbeschränkungen in Richtung der Knochen der Schultern bewegen. Dank dessen folgen die Polster der Schulter, und wenn Sie Ihre Hand heben, hebt das Polster den Rest der Knochen an, wie bei einer echten Jacke.
Wie sieht die Einschränkung der Kostenbeschränkung aus?Blick auf den roten Kegel Die nächsten Knochen in der Kette sind die Schichten zwischen dem oberen Teil der Jacke und dem simulierten unteren Teil. Diese Knochen werden direkt durch Betrachtungsbeschränkungen nach unten getrieben, um die Rotation zu kompensieren, die die Schultern erzeugen. Wir haben auch Positionsbeschränkungen zwischen dem linken und dem rechten Knochen hinzugefügt, um die Dehnung auszugleichen, die auftritt, wenn sich die Schulterpolster bewegen.
Abbildung 2. Die Bewegung der Knochen beim Anheben eines Handcharakters.Dies könnte völlig ausreichen, um die Einschränkungen im Exporteur von Animationen zu implementieren und die Ergebnisse in den Animationsdaten zu backen, aber wir haben trotzdem versucht, die Knochen in der Spiel-Engine in Echtzeit zu steuern.
Dank dessen konnten wir einige Bytes in den Animationsdaten speichern und Animationen einfach zwischen den Charakteren übertragen, unabhängig davon, ob Jacken darauf sind. Außerdem würden die Schulterbewegungen, die durch die inverse Kinematik des Spiels (zum Beispiel zum Zeitpunkt des Zielens) beim Auflösen von Echtzeitbeschränkungen erzeugt werden, korrekt angewendet.
Die Unterseite der Jacke
Nachdem wir das Problem mit dem oberen Teil der Jacke gelöst hatten, simulierten wir den unteren Teil. Die meisten Spielsimulationen von Stoffen verwenden eine Eins-zu-Eins-Bindung zwischen den Eckpunkten in der Gewebesimulation und den Eckpunkten des gerenderten Netzes.
Wir wollten die Genauigkeit des Jackennetzes beibehalten, damit die vom Programmierer festgelegten Einschränkungen nicht beeinträchtigt werden. Wenn wir zum Beispiel das gleiche Netz für die Stoffsimulation wie für das Rendern verwenden würden, würde die Silhouette der Taschen und der Vorderseite der Jacke verloren gehen.
Normale Karten könnten verwendet werden, um der Jacke Volumen zu verleihen, aber wir waren der Meinung, dass dies nicht ausreichen würde. Wir wollten, dass unsere Künstler die Jacke so modellieren, wie sie es wollten, und sie dann normale Karten verwenden, um Falten oder andere Details hinzuzufügen, anstatt verlorene Geometrie zu kompensieren.
Wir kamen zu dieser Entscheidung: Erstellen Sie ein Netz aus Stoff mit niedriger Auflösung, um eine Jacke zu simulieren, und befestigen Sie es dann an den Knochen des Skeletts, mit dem das Hautnetz gesteuert wird.
Abbildung 3. Vergleich der Silhouetten unserer Jacke und unseres Stoffes mit denselben Eckpunkten mit einer Simulation.Physik Werle
Zuerst schauen wir uns die Physik von Verlet an und dann lernen wir, wie man ein Match für die Simulation von Knochen erstellt. Verlé Physics ist derzeit die Standardlösung zur Simulation von Stoffen in Spielen. Wenn Sie mit der Verlet-Technik nicht vertraut sind, empfehle ich zunächst, einen dieser Artikel über Gamasutra zu lesen:
Teufel im blau facettierten Kleid: Echtzeit-Stoffanimation oder
fortgeschrittene Charakterphysik .
Abbildung 4. Ein Raster mit 4x4-Scheitelpunkten und Einschränkungen für einen der Scheitelpunkte.Im Übrigen werde ich das Arbeitsprinzip kurz wiederholen. Abbildung 4 zeigt ein Stoffnetz und Federbeschränkungen für einen seiner Eckpunkte. Wie Sie der Abbildung entnehmen können, ist jeder Netzscheitelpunkt mit allen benachbarten Scheitelpunkten sowie mit deren Nachbarn verbunden.
Einschränkungen von unmittelbaren Nachbarn werden als Dehnungsbeschränkungen bezeichnet und sind blau gekennzeichnet. Lange Bedingungen, die rot angezeigt werden, werden als Scher- / Biegebeschränkungen bezeichnet.
Es ist wichtig, diese Einschränkungen in zwei Gruppen zu speichern, da wir sie später mit unterschiedlichen Parametern auflösen werden. Bitte beachten Sie, dass in unserer Jacke die obere Reihe der Stoffpunkte durch Enthäuten an den Charakter gebunden ist und nicht von der Simulation gesteuert wird.
Das Vorhandensein eines Maschennetzes ist keine Anforderung des Algorithmus selbst. Um jedoch eine Struktur mit einer solchen Topologie zu simulieren, ist es am einfachsten, damit zu arbeiten. Die Grundlage der Gewebesimulation besteht aus zwei Teilen. Der erste Teil ist die Verlet-Integration, bei der wir die Geschwindigkeit für jeden Scheitelpunkt berechnen und auf die Position anwenden.
Vector3 vVelocity = vertex.vCurrentPosition - vertex.vPreviousPosition; vertex.vPreviousPosition = vertex.vCurrentPosition; vertex.vCurrentPosition += vVelocity * ( 1.0f - fDampingFactor ) + vAcceleration * fDeltaTime * fDeltaTime;
In unserem Projekt wurde die
vAcceleration
durch die Summe von Gravitationskraft und Wind festgelegt. Die Dämpfung wurde verwendet, um das Aussehen der Jacke anzupassen und die Simulation zu stabilisieren. Ein hoher Dämpfungsfaktor
fDampingFactor
verleiht der Jacke das Gefühl, dass sehr leichter Stoff langsam und gleichmäßig herunterkommt, während ein niedriger Dämpfungsfaktor die Jacke schwerer macht und sie nach der Bewegung länger schwingen / schwingen lässt.
Der zweite Teil des Algorithmus ist die Auflösung von Federbeschränkungen (dieser Prozess wird als Relaxation bezeichnet). Für jede Einschränkung ziehen wir die Scheitelpunkte an oder stoßen sie voneinander ab, so dass sie ihre ursprüngliche Länge erfüllen. Hier ist ein lesbarer Codeausschnitt.
Vector3 vDelta = constraint.m_vertex1.m_vCurPos - constraint.m_vertex0.m_vCurPos; float fLength = vDelta.length(); vDelta.normalize(); Vector3 vOffset = vDelta * ( fLength - constraint.m_fRestLength ); constraint.m_vertex0.m_vCurrentPosition += vOffset / 2.0f; constraint.m_vertex1.m_vCurrentPosition -= vOffset / 2.0f;
Dehnungsbeschränkungen halten die Stoffoberseiten zusammen, und Neigungs- / Biegebeschränkungen helfen dabei, die Form des Stoffes beizubehalten. Wie Sie sehen können, bewegt sich der Stoff mit einer idealen Lösung für dieses System zu stark. Aus diesem Grund fügen wir vor dem Auflösen neuer Positionen einen Koeffizienten zu den Neigungs- / Biegebeschränkungen hinzu.
vOffset *= fStiffness; constraint.m_vertex0.m_vCurrentPosition += vOffset / 2.0f; constraint.m_vertex1.m_vCurrentPosition -= vOffset / 2.0f;
Bei einem Steifheitskoeffizienten von 1,0 ist der Stoff nicht flexibel, und bei 0,0 biegt sich der Stoff ohne Einschränkungen.
Zeitschritt behoben
Sie müssen bereits bemerkt haben, dass die Verlet-Integration darauf hindeutet, dass der vorherige Zeitschritt genau der gleiche war wie der aktuelle. Andernfalls ist die berechnete Geschwindigkeit falsch. Bei Verwendung der Verlet-Integration kann auf einen variablen Zeitschritt verzichtet werden, die Auflösung von Einschränkungen reagiert jedoch sehr empfindlich auf Änderungen im Zeitschritt.
Da der Löser das Problem durch iteratives Umgehen der Einschränkungen löst, können sie niemals ideal gelöst werden. Im Spiel manifestiert sich diese Ungenauigkeit als Dehnung. Je kürzer der Zeitschritt ist, desto weniger Dehnung sieht der Spieler.
Letztendlich ist dies ein Kompromiss zwischen Genauigkeit und der Prozessorzeit, die Sie für Kleidung aufwenden können. Wenn der Zeitschritt nicht konstant ist, variiert die Dehnung der Kleidung und wir führen unerwünschte Vibrationen in das System ein. Noch wichtiger ist, dass der Zeitschritt den Steifigkeitsindikator und andere Stoffparameter beeinflusst: Je kürzer der Zeitschritt ist, desto steifer wird der Stoff, selbst wenn der gleiche Steifheitskoeffizient verwendet wird.
In der Praxis bedeutet dies, dass Sie sich selbst für einen festen Zeitschritt entscheiden müssen, bevor Sie das Erscheinungsbild der Kleidung mithilfe von Stoffparametern anpassen können. Ich weiß, dass es Spiele gibt, in denen ein variabler Zeitschritt für die Physik verwendet wird, aber meine persönliche Erfahrung zeigt mir, dass das Leben viel einfacher wird, wenn der Zeitschritt sowohl für die Physik als auch für die Spielelogik festgelegt ist.
Haube
Bevor wir uns mit den Details der Gewebesimulation befassen, werfen wir einen kurzen Blick darauf, wie die Haube simuliert wird. Um die Oberseiten des Haubennetzes zu häuten, haben wir einen zusätzlichen Knochen verwendet. Wir haben ein Pendel von der Mitte des Knochens bis zur Position hinter der Haube erstellt. Das Ende des Pendels ist ein Teilchen, das von der Verlet-Physik gesteuert wird. Dann wird der Knochen unter Verwendung einer Betrachtungsbeschränkung auf das Pendel gerichtet.
Abbildung 5. Haube und Pendel.Knochenmatrizen erstellen
Die Kapuze gibt uns einen Hinweis darauf, was als nächstes mit der Unterseite der Jacke zu tun ist. Wir werden die Scheitelpunktpositionen im simulierten Netz verwenden, um Knochentransformationen zu berechnen.
Als erstes ordnen wir die Knochen so zu, dass das Scharnier jedes Knochens mit der Oberseite des simulierten Netzes übereinstimmt. Aus diesem Grund wird die Aufgabe des Teils der Matrix, der sich auf die Verschiebung bezieht, ein trivialer Prozess sein.
Dann müssen wir die 3x3-Rotationsmatrix berechnen. Jede Zeile (oder Spalte, abhängig von der Konfiguration der Matrix) wird durch die x-, y- und z-Achse des Knochens definiert.
Wir definieren die x-Achse des Knochens als die Richtung vom Basisscheitelpunkt zum nächsten darunter. Dann wird die y-Achse durch den Vektor vom Scheitelpunkt links zum Scheitelpunkt rechts definiert.
Abbildung 6. Am Stoffnetz befestigte Knochen.In Abbildung 6 ist die x-Achse rot und die y-Achse grün dargestellt. Dann wird die z-Achse als Vektorprodukt dieser Vektoren berechnet. Am Ende orthonormalisieren wir auch die Matrix, um die Verzerrung in den Verschiebungsdaten zu beseitigen.
Wie Sie sehen können, verwenden wir in vertikaler Richtung jede Reihe des Stoffnetzes (mit Ausnahme der letzten), um die Knochen anzupassen, aber in horizontaler Richtung wird nur jede zweite Spalte verwendet. Neben der Tatsache, dass es die oben beschriebenen künstlerischen Vorteile bietet, ist diese Methode auch recht schnell. Dank dessen können herkömmliche Skinning-Techniken auf der GPU-Seite verwendet werden, um das Netz zu rendern, da wir sonst den riesigen dynamischen Scheitelpunktpuffer aktualisieren müssten.
Ein Fabric-Mesh kann eine relativ niedrige Auflösung haben, wodurch die CPU weniger belastet wird. Die einzigen zusätzlichen Kosten für unsere Lösung bestehen darin, die Simulation mit niedriger Auflösung in ein hochauflösendes Netz umzuwandeln. In unserem Schema sind diese Kosten jedoch im Vergleich zum Rest der Simulation vernachlässigbar.
Kollisionen
Um das Problem des Trimmens von Gewebe mit Beinen und Körper zu lösen, verwenden wir die Erkennung von Kollisionen zwischen einem Ellipsoid und einem Partikel. Abbildung 7 zeigt die Ellipsoide, die zum Auflösen des Abschneidens einer Jacke durch ein Charaktermodell erforderlich sind.
Abbildung 7. Das Ellipsoidsystem für das Wake-Modell.Die Erkennung von Kollisionen von Ellipsoiden mit Partikeln ist sehr schnell. Kollisionen können gelöst werden, indem der Raum, in dem sich das Ellipsoid und das Teilchen befinden, so transformiert wird, dass sich das Ellipsoid in eine Kugel verwandelt. Anschließend können Sie einen schnellen Kollisionstest der Kugel und des Partikels durchführen.
In der Praxis geht dies mit der Erzeugung einer inversen Transformation einher, die auf den Werten der Länge, Breite und Höhe des Ellipsoids mit seiner Anwendung auf die Position des Partikels basiert. Das einzige Problem hierbei ist, dass die normale Kollision, die wir nach der Rückkonvertierung in das ursprüngliche Koordinatensystem erhalten, verzerrt ist.
Wir haben beschlossen, dass wir uns bei der Berechnung der Kollisionsrichtung mit einer leichten Ungenauigkeit abfinden können. In Fällen, in denen ein stark gedehntes Ellipsoid zu falschen Reaktionen führen kann, haben wir es in zwei homogenere unterteilt.
Der maximale Abstand zum Partikel
Ein weiteres Problem, das gelöst werden musste, war die Stabilität der Jacke. Das Gewebe während einer schnellen Bewegung kann zur Bildung von Knoten führen oder auf der anderen Seite des Kollisionsvolumens erscheinen und durch den Körper gelangen. Wir haben dieses Problem gelöst, indem wir für jeden Scheitelpunkt des simulierten Gewebes einen Sicherheitsabstand festgelegt haben.
Für jeden Scheitelpunkt wird die anfängliche Ruheposition durch Enthäuten am nächsten Knochen befestigt und wir verwenden sie als Referenzpunkt. Wenn die Simulation den Schwellenwert überschreitet, bewegen wir den Scheitelpunkt einfach näher an den Referenzpunkt. In unserem Design haben wir zugelassen, dass sich die Spitzen darunter um eine größere Strecke bewegen als die Spitzen näher an den Schultern.
Die maximale Entfernung, über die sich die Peaks bewegen können, beträgt ca. 40 cm. Wenn dieser Wert überschritten wird, treten seltene Fälle von Knoten und Kürzungen auf. Wir haben auch versucht, andere Techniken zu verwenden, zum Beispiel Kollisionsebenen, aber die Methode der maximalen Entfernung erwies sich als die beste. Es war schnell, einfach einzurichten und bot die größte Bewegungsfreiheit, bevor erkennbare Fehler im Stoff auftraten.
Mehr Tweed, weniger Gummi
Bisher konnten wir gute Wege finden, um unsere Ziele zu erreichen. Unser Künstler hat seine Jacke so modelliert, wie er wollte; Für die Animation der Jacke wurde kein Animator benötigt, da alles im Spiel simuliert wurde und der Prozessor sich darüber freute, dass wir genügend Ressourcen für andere Berechnungen im Spiel hatten. Aber eines hat uns gestört - der Stoff sah aus wie Gummi.
Stretching bekämpfen
Zuerst müssen wir die Strecke loswerden. Wie ich oben sagte, wird das Phänomen des Streckens durch Fehler verursacht, die aufgrund der iterativen Natur des Algorithmus auftreten. Dies ist ein beliebtes Forschungsthema und es können viele Methoden gefunden werden, um dieses Problem zu lösen.
Leider würden uns alle verfügbaren Lösungen dazu zwingen, viel knappere CPU-Ressourcen für Gewebeberechnungen zuzuweisen. Daher haben wir das Problem der Dehnung gelöst, indem wir der Gewebesimulation den letzten Schritt hinzugefügt haben, in dem die sogenannten „harten Einschränkungen“ angewendet werden.
Wir haben die Dehnungsbeschränkungen streng eingeschränkt (sie sind alle vertikal ausgerichtet). Diese Einschränkungen wurden von oben nach unten sortiert, so dass Einschränkungen in der Nähe der Schultern in Einschränkungen in der Nähe der Beine aufgelöst wurden.
Da wir die Einschränkungen von oben durchlaufen, wissen wir, dass der obere Scheitelpunkt im Paar bereits gelöst wurde und keine Dehnung verursacht. Daher müssen wir nur den unteren Scheitelpunkt in Richtung des oberen verschieben. Dank dessen können wir sicher sein, dass nach einer einzelnen Iteration die Länge von oben nach unten genau der Länge in Ruhe entspricht.
Vector3 vDelta = constraint.m_vertexTop.m_vCurPos - constraint.m_vertexDown.m_vCurPos; float fLength = vDelta.length(); vDelta.normalize(); Vector3 vOffset = vDelta * ( fLength - constraint.m_fRestLength ); constraint.m_vertexDown.m_vCurrentPosition += vOffset;
Abbildung 8. Enge Einschränkungen.Wie Sie sehen, berücksichtigen wir die horizontale Dehnung der Jacke nicht. Es ist unmöglich, strenge Beschränkungen für die horizontale Richtung anzuwenden, da in diesem Fall der Scheitelpunkt zweimal aufgelöst wird, dh wir verlieren die Ergebnisse der vertikalen Berechnungsstufe und die Länge des Gewebes wird nicht in Ruhe gehalten.
Wir haben jedoch festgestellt, dass bei einer Jacke die horizontale Dehnung für das menschliche Auge tatsächlich unsichtbar bleibt und die Jacke aufgrund der vertikalen Dehnung sehr schlecht aussieht. Diese Lösung erwies sich als recht gut.
Jackenkanten
Zweitens wollten wir, dass sich die Kanten der Jacke etwas mehr bewegen als der Rest. Wenn Sie beispielsweise in einer weit geöffneten Jacke laufen, werden Sie feststellen, dass der Luftwiderstand die Kanten der Jacke stärker beeinflusst als den Mittelteil. Dies liegt daran, dass Ihr Körper den Rest der Jacke vor dem Wind schützt.
Kanten können leicht anhand der Anzahl der damit verbundenen Einschränkungen gefunden werden. Jeder Scheitelpunkt mit weniger als vier Dehnungsbeschränkungen ist eine Kante. Daher können wir diese Eckpunkte markieren und mit anderen Parametern simulieren.
- Reduzierte Dämpfung.
- Der globale Wind hat einen größeren Einfluss.
- Bewegung im Weltraum hat einen größeren Einfluss (mehr zur Bewegung im Weltraum siehe unten).
- Der maximal zulässige Sicherheitsabstand ist höher.
Aus diesem Grund unterscheidet sich die Innenfrequenz der Kanten vom Rest der Jacke. Jetzt reagiert die gesamte Jacke nicht mehr auf Impulse wie ein großes Pendel, und nur die Kanten verleihen der Bewegung eine schöne Hilfsbewegung.
Abbildung 9. Die Kantenoberseiten.Bewegung im Weltraum und im lokalen Raum
Dann haben wir festgestellt, dass beim Bewegen eines Charakters die Bewegung im Weltraum einen ziemlich großen Einfluss auf die Simulation hat, während kleine lokale Körperdrehungen oder Schulterbewegungen unbemerkt bleiben.
In einer traditionellen Gewebesimulation werden die Positionen der Eckpunkte im Weltraum simuliert. Jemand mag sagen, dass die Simulation des Stoffes korrekt ist, aber es fühlt sich unnatürlich an. Aus diesem Grund haben wir eine Jacke für Charaktere im lokalen Raum simuliert und separat eine kleine Bewegung im Weltraum hinzugefügt. Wir haben festgestellt, dass die Ergebnisse, die wir benötigen, mit 100% lokaler Animation des Skeletts mit 10-30% Bewegung im Weltraum erzielt werden.
Reibung
Und schließlich wollten wir den Kontrast zwischen der Jacke in langsamen und schnellen Bewegungen übertreiben. Wir wollten, dass die Jacke beim Gehen relativ bewegungslos ist, und wenn Alan springt oder ausweicht, sollte die Bewegung lebhafter sein.
Wir dachten, wenn die Jacke den Körper berührt, sollte sie sich aufgrund der Reibung zwischen Jacke und Hemd weniger bewegen, und wenn sich die Jacke hebt, sollte sie sich mehr bewegen, weil nichts sie einschränkt. Wir haben dies simuliert, indem wir jedem Scheitelpunkt, der das Ellipsoid berührt, einen erhöhten Dämpfungswert zugewiesen haben. Dank dessen erscheinen die den Körper berührenden Oberteile etwas klebrig, wodurch in normalen Situationen und bei schnellen Bewegungen ein ausreichender Kontrast zwischen der Jacke entsteht.
Fazit und weitere Arbeit
Die erste Ausführungsform der Gewebesimulation war recht einfach zu implementieren: Wir haben nur in der Spielentwicklungsliteratur nach dem Wort „Stoff“ gesucht und die gefundenen Algorithmen angewendet. Die zweite Phase, in der wir versuchten, ein überzeugendes Gefühl für eine Tweedjacke zu erzielen, erforderte das Studium wissenschaftlicher Artikel, viele Versuche und sogar das Entfernen eines Teils des Codes.
Natürlich kann man immer etwas verbessern. Die Verwendung einer Simulation mit niedriger Auflösung und die Verknüpfung mit einem hochauflösenden Netz erschwert beispielsweise die Lösung des Problems aller Kürzungen. Wir hatten nicht genug Zeit für andere kleine Details: Dies sind beispielsweise Faltkarten an den Stellen der Falten der Jacke oder die Umsetzung der richtigen Interaktion zwischen Jacke und Tornado.
Letztendlich haben sich unsere Bemühungen gelohnt - unser Stoff unterscheidet sich stark von der Gewebesimulation in anderen Spielen. Sie sieht viel mehr aus wie ein Tweed als wie Seide oder Gummi. Darüber hinaus erwies sich unser System als sehr flexibel und ermöglichte es uns, andere Stoffe zu simulieren, beispielsweise die Daunenjacke von Barry Wheeler und den Schleier der alten Dame. Es scheint, dass Sie durch Anpassen der Parameter eine Simulation und andere Gewebetypen erzielen können.
Abbildung 10. Tweedjacke.