Jump to content
Unity Insider Forum

Wie realisiert man eigentlich formverändernde Objekte?


Kokujou

Recommended Posts

Hallo erstmal~

Kleidung, die im Wind weht, Wellen, alles was keine feste Form hat. Wie würde man solche Dinge realisieren? Skriptet man da die entsprechenden Meshs um? Das klingt ziemlich aufwändig und ineffizient.

Ein Beispiel: Sagen wir mal wir wollen eine Animation von einem Bäcker der Teig knetet. Wie würde man so etwas angehen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Da gibt's mehrere Möglichkeiten.

  1. Bones. Da es diese Technik schon sehr lange gibt, ist sie sehr ausgereift und problemlos anwendbar. Packe einen Bone in deinen Teig-Mesh und ändere dessen Transform mit einer Animation. Der Skinned Mesh Renderer macht den Rest.
  2. Cloth-Komponente. Diese Komponente ist für Brotteig vermutlich ungeeignet, weil sie gerne macht, was sie will. Aber für Umhänge, wehende Fahnen oder Gardinen (am besten Sachen, die das Gameplay nicht groß beeinflussen) ist sie ganz gut geeignet.
  3. CPU-basierte Mesh-Deformation. Da die CPU an so etwas mehr zu knabbern hat als die GPU, sollte man das nicht zu oft machen. Vom Scripting-Aufwand her ist das gar nicht mal so kompliziert, sobald man den Dreh raus hat. Der Vorteil: Volle Kontrolle, die jederzeit bei der CPU bleibt. Wenn Interaktion zwischen Objekten passiert, muss man keine Kommunikation zur GPU und zurück implementieren, damit das sich verformende sich richtig verhält.
  4. GPU-basierte Mesh-Deformation. Einstiegspunkt ist die Vertex-Funktion des Shaders. Damit kann man eine Menge anstellen; vor allem, wenn das verformte Objekt einfach sein Ding macht und dabei nicht von anderen Objekten beeinflusst wird. Beispiel wäre ein Ozean mit Wellen, solange die Wellen nicht von Schiffen beeinflusst werden oder Schiffe von den Wellen. Das geht zwar beides auch, macht die Sache aber schon etwas komplizierter.

Im gegebenen Beispiel würde ich auf jeden Fall zu einem Skelett aus ein bis zwei Bones im Teig raten. Das ist im Modelling-Programm erledigt und benötigt keinen Extra-Code für die Deformation.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ach echt? Ich wusste dass normale Animationen damit möglich sind aber dass das auch für sowas wie Flattern oder z.B. Schleimmonster oder eben Brotteig gilt, wusste ich noch nicht!

CPU-basiert klingt gut für Leute die ne Super CPU haben wie ich ^_^ könnte man ja vielleicht auch entsprechend in den Einstellungen verfügbar machen.

Deformation heißt auf Deutsch... Hardcoding? Also quasi dass man jeden einzelnen Vektor selbst beeinflusst und animiert und schlimmstenfalls auch auf Physik reagieren lässt?

Dann jetzt mal die logische Folgefrage: Wie sieht es mit Collidern aus? Denn ich sehe bei den Methoden jetzt schon die Kollisionsbugs, wenn man damit nicht richtig umgehen kann. Beim Hardcoding könnte man das warscheinlich eher machen, aber Meshcollider dürfen ja per se schonmal nicht zu komplex sein, und dann da noch ne Deformation reinbringen... ist das performant?

Bleiben wir mal bei dem Beispiel mit dem Brotteig. Stell dir vor du hättest als standardform eine Kugel, optional auf der BOdenseite etwas "angeplättet" dann kommen die Hände des Protagonisten, drücken drauf und dann soll sich der Teig den Händen anpassen, quasi wie in echt, kriegt man sowas hin oder muss man da tricksen?

Die Reaktion auf äußere Einflüsse ist ja auch in vielen Professionellen Spielen nicht unbedingt Usus. Meistens wird das so geregelt, dass man wenn man z.B. getroffen wird einfach entsprechend des Schadens den Modus der Rüstung ändert und die Rüstung dann in den "Ausgebeult" oder "blutbefleckt" status wechselt, statt tatsächlich auf die Kollision des Schwertes oder der Kugel zu reagieren.

Aber wenn ich mir das so logisch überlege ist eine direkte Reaktion auf Kollisionen wohl nur über Skripting möglich und frisst entsprechend viel Resourcen hm?

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 22 Minuten schrieb Kokujou:

Deformation heißt auf Deutsch... Hardcoding?

<Deutsches Wort> heißt auf Deutsch <Englisches Wort>? :D

Deformation heißt, die Form von etwas zu verändern, sonst nichts :)

vor 23 Minuten schrieb Kokujou:

Also quasi dass man jeden einzelnen Vektor selbst beeinflusst

Nicht unbedingt, aber wenn man will, schon. Klingt schlimmer als es ist. Ist halt ein Vector3-Array über das du mit einer Schleife rübergehst und Dinge in Abhängigkeit von wasauchimmer veränderst.

vor 24 Minuten schrieb Kokujou:

Dann jetzt mal die logische Folgefrage: Wie sieht es mit Collidern aus?

MeshCollider permanent zur Laufzeit verändern = Absolutes Nein.

Wenn dein Teig dynamisch mit Dingen kollidieren soll, würde ich die Experimente doch eher mit Cloth anfangen.

Physik mit derselben Genauigkeit wie Grafik laufen zu lassen ist einfach nicht drin. Man abstrahiert die physikalische Form mit einigen wenigen SphereCollidern oder was sich anbietet, und dann extrapoliert man da hübsche Grafik draus. Wie du selber schon richtig sagst:

vor 26 Minuten schrieb Kokujou:

Die Reaktion auf äußere Einflüsse ist ja auch in vielen Professionellen Spielen nicht unbedingt Usus.

 

vor 27 Minuten schrieb Kokujou:

Aber wenn ich mir das so logisch überlege ist eine direkte Reaktion auf Kollisionen wohl nur über Skripting möglich und frisst entsprechend viel Resourcen hm?

Naja, die GPU kann schon eine Menge übernehmen heutzutage. Aber PhysX findet nun einmal auf einer Ebene statt, auf die du nur über die CPU schauen kannst.

Wenn ich mir den Kontext richtig vorstelle, dann geht es darum, dass ein physikalisches Objekt geformt wird. Wird es nur einmalig geformt und dann gebacken (höhö)? Ich denke, da könnte man evtl mit Voxeln arbeiten und dann da einen MeshCollider oder Compound Collider backen, der dann für Physik im Spiel genutzt wird. Wenn sich das Ding die ganze Zeit dynamisch verformen soll, würde ich sagen... Möglich ist alles, aber da steht man dann schon nah an der Bleeding Edge und muss Innovationsarbeit selber leisten, denn BEst PRactices und Howtos gibt's ab so einem Punkt einfach nicht mehr.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Klingt schlimmer als es ist, das bezweifle ich ^^ Das Verändern an sich mag einfach sein, aber man muss auch erstmal berechnen wie es sich verändern würde, wenn...
Also muss man die Kraft und Härte des Einschlags mit der Härte des Materials verrechnen und dann die Tiefe des Kraters berechnen. Das ist es ja was ich mit hardcoding meinte ^^

Das mit dem Teig war übrigens nur ein Beispiel dass mirspontan in den Sinn kam. Mir kam dieser Anwendungsfall in den Sinn und da hat mich interessiert wo aktuell so die Grenzen liegen.

Vielleicht könnte man ja stattdessen, um mal wieder zum Beispiel mit dem Teig zurückzukommen, einen kleinen Sphere Collider, oder vielleicht auch lieber Boxcollider, irgendwas Effizientes, auf der Oberfläche Platzieren und statt der Form die Position dieser Collider entsprechend der Deformation ändern. Sodass man an verschiedenen Berührungspunkten den "Druck" messen kann der ausgeübt wird und entsprechend im Skript agieren kann. Aber das wird wohl die Grenzen von verfügbaren Tools überschreiten und am Ende läuft es wieder auf Hardcoding raus.

Dann noch eine letzte Frage: Wie sieht es mit Texturanpassung aus?

Verabschieden wir uns mal vom Teig, nehmen wir mal... einen Berg, den man abbauen will, oder ne Sprengung oder vielleicht einfacher gedacht, wieder die Rüstung die von etwas getroffen wird. Wie reagiert man jetzt mit Texturveränderung? Normalerweise haben Objekte ja eine feste Form der sich dann eine Textur anpasst, kann man die dann zur Laufzeit ansprechen und an der Einschlagstelle verändern? oder gibt's da eine bessere Methode. Besonders Landschaftsveränderungen sind ja für viele Spiele besonders im Bereich der Simulatoren extrem wichtig.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...