Jump to content
Unity Insider Forum

Ich möchte ein Objekt mit einem "Cloth" verbinden


Puro_Boi
 Share

Recommended Posts

Hallo Unity-Community,

ich bin noch relativ neu bei Unity, bekomme aber gerade gewissermaßen "Unterricht". Leider weiß mein "Lehrer" auch nicht ganz genau, wie ich mein Problem lösen kann. Also darum geht es: Ich habe mir vor kurzem ein Modell einer römischen Standarte heruntergeladen und wollte, dass sich der Stoff auch wie Stoff verhält und beim Bewegen nicht statisch bleibt. Das habe ich auch geschafft, und zwar mit dem "Cloth" component. Das Problem ist nur, dass an dem Banner noch Objekte dranhängen (siehe Bild), welche sich nicht mit dem Stoff mit bewegen. Ich habe daraufhin versucht, diese Objekte als childs von dem Banner zu machen (siehe Bild), was aber auch nicht funktioniert hat. Ich habe es auch noch mit fixed joints und position constraints versucht, was aber auch alles nicht geholfen hat. 

Auf der Suche nach einer Lösung habe ich nur Videos und Erklärungen gefunden, die zeigen, wie man ein "Cloth" an ein Objekt dran macht, aber eben nicht andersherum. Ich hoffe, dass jemand von euch dafür eine Lösung hat und hoffe auf hilfreiche Antworten!

Vielen Dank schonmal und liebe Grüße!

PS: Wenn jemand noch mehr Informationen braucht, frage gerne ^^

Screenshot (151).png

Screenshot (147).png

Screenshot (148).png

Screenshot (149).png

Screenshot (150).png

Link to comment
Share on other sites

Moin und willkommen!

Ich glaube, das geht schlicht nicht. Zumindest nicht einfach so. Ich vermute, dass bei der Anforderungsanalyse damals (ist schon ein Weilchen her, dass an dem System was gemacht wurde) heraus kam, dass das zu selten gebraucht wird.

Ich sehe aktuell höchstens die Möglichkeit, dass du ein Objekt immer wieder (vermutlich in FixedUpdate) an eine Position verschiebst, die du aus Cloth.vertices ziehst. Dort hast du die Positionen aller Vertices drin. Wie du die richtigen Indizes heraus findest, weiß ich gerade nicht mit Sicherheit. Vermutlich ginge aber ein initiales Iterieren durch die Vertices. Da schaust du für jeden Bommel, ob das aktuelle Vertex das nächstgelegene ist und wenn ja, merkst du dir das für den jeweiligen Bommel.

Ich würde dafür eine Bommel-Komponente machen:

public class Bommel : MonoBehaviour
{
  private Vector3 attachedVertexIndex = -1;
  private float attachedVertexDistance = Mathf.Infinity;
  
  public void OverrideClosestVertexIfCloser(Vector3 vertex, int index)
  {
    var distance = Vector3.Distance(vertex, transform.position);
    if (distance < attachedVertexDistance)
    {
      attachedVertexDistance = distance;
      attachedVertexIndex = index;
    }
  }
}

Die kommt auf jeden Bommel drauf.

Dann gibt's hier so einen Code, um durch alle Vertices durchzugehen:

for (var vertexIndex = 0; vertexIndex < vertices.Length; vertexIndex++)
{
  foreach (var bommel in attachedBommels)
  {
    bommel.OverrideClosestVertexIfCloser(vertices[vertexIndex], vertexIndex);
  }
}

Ich nehme stark an, dass das Vertex-Array allerdings im Local Space ist. Da muss man also nochmal Transform.TransformPoint oder so drauf schmeißen.

Da das performance-mäßig nicht so knorke ist, sollte man das vielleicht in ein Editor-Tool packen. Hast nen Knopf, drückst drauf, er macht das einmalig im Editor und merkt sich die Ergebnisse einfach. Dann muss der Rechner, auf dem das Spiel läuft, das nicht bei jedem Spielstark machen. Dafür müssen die beiden Felder in der Bommel-Klasse noch [SerializeField, HideInInspector] abkriegen.

Ist jetzt nicht mehr so wirklich Anfängerkram, aber soweit ich das sehen kann, gibt es dafür leider einfach keine anfängerfreundliche Lösung.

Link to comment
Share on other sites

Ich war auch schon dran einiges dazu zu schreiben. Da Sascha nun das Meiste erklärt hat, will ich nur noch auf das Cloth-Modul zurück kommen.
Ich habe es zwar noch nicht in Unity genutzt, aber bei den 3D Softwaren wie Cinema4D oder Blender funktioniert das eigentlich ganz genauso (nur viel besser berechnet, weil es nicht in Echtzeit geschehen muss).
Bei Cloth werden von einem Objekt nur die Vertices, also die Mesh-Punkte, berechnet. In welcher weise dürfen sie sich zueinander bewegen, dürfen die Abstände vergrößert und verringert werden, wie weit dürfen sie sich verwinden und welche Masse hat der einzelne Punkt. Dann gibt es noch Ankerpunkte und diverse Parameter, die die Dicke des Stoffes, oder die Kollision mit anderen Objekten beeinflusst usw..  Ja, und je mehr Punkte man hat umso schöner aber auch rechenintensiver wird es.
Es ist aber eben nur dieser eine Körper, der der Regel vom Cloth Modul folgt. Kind-Objekte werden nicht mit berechnet, weil es keine Beziehung vom Kind-Objekt zum Vertices des Cloth-Objektes gibt. Technisch wäre das sicherlich möglich gewesen, aber solche Mesh-Deformationen kosten so schon viel Leistung. Ich kenne kein Spiel, wo die Cloth Engine so sauber arbeitet, dass der Stoff nie andere Objekte durchdringt. Alles ist auf performance ausgelegt. Nicht auf physikalische Genauigkeit.
Somit kann man das Ganze nur faken, indem man es so macht, wie Sascha es erklärt hat, oder aber die Bommeln an der Standarte nicht plastisch baut sondern sie als Teil des Tuches erstellt.

Man kann aber auch alles extern animieren und die Animation dann in Unity einladen und abspielen. Das wäre aber ein mächtiger Aufwand und die Animationen wären auch immer nur für eine Situation erstellt. Bei dynamischen Änderungen in Unity bräuchtest du viele unterschiedliche Animationen. Diese wären dann aber trotzdem nie zu 100% passend.

Also versuch mal Saschas weg. :)

 

Link to comment
Share on other sites

Hallo nochmal,

erstmal dickes Danke für die ausführlichen Antworten und dass Ihr euch die Zeit dafür genommen habt. Leider verstehe ich nicht mal die Hälfte der Begriffe, die bis jetzt verwendet wurden und ich habe auch noch nie etwas mit Codes gemacht 😅 

Wäre es deshalb nicht möglich das Tuch und die Bommel in einem externen Programm als ein ganzes Objekt zusammenzufügen, sodass es nicht mehr einzelne Teile sind? Dann sollte doch das Cloth auf alles gleichzeitig wirken, oder nicht? (Leider dann eben auch auf den Teil der Bommel, der eigentlich ein Objekt ist und sich nicht als Cloth verhalten soll)

Nochmals danke und schönen Tag noch!

 

Link to comment
Share on other sites

vor 1 Stunde schrieb Puro_Boi:

Wäre es deshalb nicht möglich das Tuch und die Bommel in einem externen Programm als ein ganzes Objekt zusammenzufügen, sodass es nicht mehr einzelne Teile sind? Dann sollte doch das Cloth auf alles gleichzeitig wirken, oder nicht? (Leider dann eben auch auf den Teil der Bommel, der eigentlich ein Objekt ist und sich nicht als Cloth verhalten soll)

Ja, das ginge auch. Sehen vermutlich nicht super überzeugend aus, aber wenn es gut genug aussieht, dann ist es eben gut genug :)
Und wenn du dir bei der Variante ordentlich Coding-Stress sparst, dann ist wäre das auch ne gute Sache.

Link to comment
Share on other sites

vor 53 Minuten schrieb Sascha:

Ja, das ginge auch. Sehen vermutlich nicht super überzeugend aus, aber wenn es gut genug aussieht, dann ist es eben gut genug :)
Und wenn du dir bei der Variante ordentlich Coding-Stress sparst, dann ist wäre das auch ne gute Sache.

Habe es gerade ausprobiert, funktioniert aber nicht, weil die Bommel ins Leere fallen aus welchem Grund auch immer. Ich glaube, dass ich die einfach weglasse 🤷‍♂️

 

Link to comment
Share on other sites

Hast du darauf geachtet, dass die "Bommel" auch wirklich mit dem Mesh verbunden sind? Noch nie Cloth-Simulationen verwendet, aber wenn ich raten müsse, würde ich versuchen darauf zu achten, dass es sich um das selbe Mesh handelt. ggf. auch dafür sorgen, dass die verticies verbunden sind.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

×
×
  • Create New...