Cloth Simulation
Übersicht

![]() |
NoobodyBetreff: Cloth Simulation |
![]() Antworten mit Zitat ![]() |
---|---|---|
Von Xaymar angeregt habe ich in der letzten Stunde schnell eine kleine Demo zusammengeworfen, wie eine simple Cloth Simulation mithilfe einfachster Verletintegration aussehen könnte.
Was ist Cloth Simulation? Wenn man das Wörterbuch zur Hand nimmt, sollte man eigentlich schnell draufkommen. Im Prinzip geht es darum, Stoffe realistisch zu simulieren, damit man zum Beispiel der weiblichen Hauptfigur im Spiel möglichst echt die Hüllen fallen lassen kann .... oder so. Edit: Neue Version! Screenshots: ![]() Mit CLOTH_SIZE = 128 (laaaaaangsam): ![]() BlitzBasic: [AUSKLAPPEN] Const CLOTH_SIZE = 32 |
||
- Zuletzt bearbeitet von Noobody am Di, Jul 27, 2010 18:16, insgesamt einmal bearbeitet
![]() |
Blaulicht |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wunderschön *tränen in den augen*
Blaulicht |
||
Intel Core i7 860 OC 3,7GHz | 4 GB DDR3 1600MHZ RAM | ATI Radeon HD5850 (1024 MB DDR5 RAM) | Windows 7 Ultimate |
![]() |
Chrise |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wow! Brilliant! Und auch der Einfall, besseres Linepick zu nehmen anstatt Kollisionen , fantastisch!
Ich bin gespannt was du noch alles in B3D zaubern wirst in deiner BB-laufbahn ![]() lg Chrise |
||
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet. |
![]() |
darth |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
funktioniert ziemlich gut und auch mit ordentlicher Geschwindigkeit. Die Idee "LinePick" zu verwenden ist echt interessant. Führt halt dazu, dass man ständig die Kollisionsboxen/-kugeln mitschleppen muss. Zudem kann man so keine Kollision mit anderen Stoffen oder Eigenkollision bauen. Was auch cool wäre, wären Stoffe die auch von Körpern runterrutschen, im Moment kleben sie am Objekt fest wenn sie mal drauf sind. Weil ich heut Abend etwas Zeit hatte und keine Lust hatte etwas eigenes anzufangen habe ich mal kurz die Kollision umgeschrieben. Ich wollte von dem LinePick weg, damit die Objekte direkt getestet werden. Es hat sich herausgestellt, dass es funktioniert, aber l-a-n-g-s-a-m :/ ich musste die Kugel rausnehmen, das ging noch etwa mit 1FPS. Ich berechne in jedem Schritt die Normale jedes Dreiecks neu, das könnte man vielleicht einmal vorausberechnen und dann speichern, da BB aber nur konstante Arrays in Types unterstützt hab ich das weggelassen, würde für bewegte Objekte sowieso nicht funktionieren - ist allerdings halt ein etwas nerviger Rechenaufwand. Damit ich alle Meshes durchgehen kann, habe ich einen Type eingeführt, der das Mesh als Feld beinhaltet, Meshes die nicht in ein Objekt gepackt werden, kommen bei der Kollision nicht zur Geltung. Ich hatte anfangs das Problem, dass das Tuch "im Objekt" war, ich habe da etwas geschummelt und die Punkte in ein skaliertes System transformiert. Ein anderes Problem war, dass der Stoff am Objekt klebte, das habe ich auch mit einer kleinen Schummelei korrigiert, wenn die Geschwindigkeit in die selbe Richtung wie die Normale zeigt, wird die Kollision ignoriert, das bedingt allerdings, dass alle Normalen nach aussen zeigen. So im Endeffekt ist Noobodys Variante wohl besser einsetzbar, vor allem wenn man es nur für statische Objekte oder nur als grafische Verzierung in einer Demo verwenden möchte. Mein Ansatz ist einfach viel zu langsam, könnte aber theoretisch komplexere Objekte als einfache Würfel und Kugeln behandeln (in der Theorie :> habe ich ehrlich gesagt nie getestet..) Nun denn, hier der Code: BlitzBasic: [AUSKLAPPEN] Const CLOTH_SIZE = 32 Ich hoffe Noobody nimmt es mir nicht übel wenn ich in seinen Codes rumspiele ![]() MfG, Darth |
||
Diese Signatur ist leer. |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
darth hat Folgendes geschrieben: Führt halt dazu, dass man ständig die Kollisionsboxen/-kugeln mitschleppen muss.
LinePick kann auch direkt gegen Polygone testen. Wenn man Eigenkollision will, kann man ausserdem einfach dem Cloth-Mesh einen EntityPickMode 2 verpassen ![]() Dass das Tuch nicht runterrutscht, sondern kleben bleibt, stört mich auch ein wenig, da es rein *theoretisch* von selber runterrutschen müsste. Ich werds mir heute nochmal anschauen. |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
Chrise |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Darth!
Auch ein sehr schönes Ergebnis! Aber ein entscheidender UNterschied ist mir doch aufgefallen: Dreht mal bei beiden Beispielen den Würfel. ich finde da erzielt die Version von Noobody noch etwas bessere Ergebnisse ![]() Ich bin gespannt ![]() |
||
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet. |
![]() |
darth |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
erstmal: /me slaps Noobody :> Hehe, dass Linepick auch direkt Polygone picken kann wusste ich gar nicht ![]() (Es dauerte nicht 6 Stunden sondern etwa 2 *hust*) Wenn du das mit dem runterrutschen noch hinkriegst dann ist das ziemlich toll, hopp arbeite! Ich muss mal kurz Würfel drehen gehn um zu sehen was Chrise meint. Ach, ich sehs. Wenn ich meinen Würfel um 90 Grad um die X-Achse drehe, dann schiebt sich das Tuch ein Stück in den Würfel rein und klebt an der Seite. Das war eigentlich zu erwarten :/ Meine Abstossung war etwas gepfuscht. Ich habs bei Noobodys urpsrünglichem Code nicht ausprobiert, aber ich vermute da funktionierts besser (weil Linepick sauberer arbeiten wird..) Ich habe kurz den EntityPickMode 2 auf den Wèrfel gesetzt, und ..öh.. es geht kaputt? BlitzBasic: [AUSKLAPPEN] Local Cube = CreateCube() Das Stoffstück fällt zuerst halb durch den Würfel durch :/ Mache ich etwas falsch? Und dann hat man den Effekt den ich bei mir beschrieben habe, dass das Stoffstück "im Objekt" ist (also auf gleicher Höhe, für t=0). MfG, Darth |
||
Diese Signatur ist leer. |
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
"habe ich in der letzten Stunde schnell eine kleine Demo zusammengeworfen"
haha, kurz mal schnell ![]() genial, danke |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
darth hat Folgendes geschrieben: Das Stoffstück fällt zuerst halb durch den Würfel durch :/ Mache ich etwas falsch?
Nicht du, sondern scheinbar LinePick. Wenn ich den Würfel um 90.5 Grad drehe statt um exakt 90, geht es wieder. Tatsächlich scheint LinePick den Spezialfall nicht zu beachten, wenn ein Dreieck perfekt senkrecht zur Picklinie steht, da es sich dann weigert, den Pick zu erkennen. Prophylaktisch als Hinweis: Dass das Tuch auch bei 90.5° scheinbar zerstückelt auf dem Würfel draufliegt, ist kein wirklicher Bug. Mit Linepick werden die einzelnen Punkte perfekt auf die Oberfläche gesetzt, was dann beim Rendern von Tuch und Würfel zum altbekannten Z-Buffer-Fighting führt. Das zu fixen wird schwierig, da ich ja nicht beeinflussen kann, wie gross das Mesh von Linepick aufgefasst wird. Im Beispiel habe ich aus dem Grund die Kollisionsbox/kugel ein wenig grösser gesetzt als das eigentliche Mesh, damit das nicht passiert; bei einem Polygon-Pick aber ist das leider nicht möglich (ausser natürlich ein unsichtbares, leicht grösser skaliertes Mesh, dass für den Pick verwendet wird). |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
*schamloser Doppelpost* Ich hab das Tuch nun zum Rutschen gebracht und die neue Version oben reineditiert.
Das 'Kleben' lag daran, dass ich die einzelnen Punkte direkt an den Schnittpunkt von EntityPick hingesetzt habe. Von dort kommen sie natürlich nicht wieder weg, daher werden sie jetzt einfach in Normalenrichtung aus dem Kollisionsobjekt herausgeschoben, was ja dank Verletintegration einfach die Geschwindigkeit in Normalenrichtung minimiert (was man in einer normalen Kollisionsverarbeitung auch tun sollte *hust*). |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
nice! ![]() Wenn ich jedoch damit rumspiele sieht es irgendwann so aus ![]() wäre es möglich Kollision mit sich selber zu realisieren, sodass es sich nicht zerknüllt (also ineinander) Dann könnt man so ein schönes Zimmerchen machen, wo man das Tuch mit der Maus bewegt und rumwirft ^_^ mfg |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
ozzi789 hat Folgendes geschrieben: Wenn ich jedoch damit rumspiele sieht es irgendwann so aus
Stellt sich nur die Frage, wie du denn damit herumgespielt hast? Die Demo bietet ja keine Interaktionsmöglichkeit. Und wenn du den Code abgeändert hast, wäre es vielleicht von Vorteil, wenn du den veränderten Code auch posten würdest, damit ich nicht schon wieder meine Kristallkugel hervorkramen muss ![]() ozzi789 hat Folgendes geschrieben: wäre es möglich Kollision mit sich selber zu realisieren, sodass es sich nicht zerknüllt (also ineinander)
Möglich schon, aber nur sehr langsam - du kannst ja mal ein EntityPickMode Cloth\Mesh, 2 reinhauen, um die Langsamkeit zu bewundern. Das liegt daran, dass für ein funktionierendes Cloth nach jedem versetzten Knotenpunkt der zugehörige Vertex im Modell versetzt werden muss. Das ist darum schlecht, da B3D dann den Tree, den es für die Pick-Überprüfung benutzt, jedesmal neu bauen muss, wenn das Cloth einen Polygon-Pickmode gesetzt hat. Im Beispiel sind das schon 1024 mal pro Frame, weswegen das Programm dann furchtbar ausgebremst wird. |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe es einfach immer wieder aufgezogen, und runter gleiten lassen.
Also an GRAVITY_Y# rumgespielt. Dachte ich mir, danke ![]() |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group