Jump to content
Unity Insider Forum

Unity's Joints: Einführung und Hinge Joint


Recommended Posts

Hallo :)

 

In diesem Tutorial möchte ich euch gerne Zeigen, was für tolle Funktionen die sogenannten "Joints" in Unity haben. Und Nein, wir setzen uns jetzt nicht auf nen Stein und bauen uns einen ;). Das Tutorial ist für alle gedacht, die sich noch nie mit Joints auseinander gesetzt haben.

 

 

Was sind Unity Joints?

 

Die Joints in Unity bieten physikalische Möglichkeiten, auf denen man bei vielen Spielen einfach nicht mehr verzichten kann. Spätestens, wenn man möchte, dass eine Tür sich öffnet, wenn der Charakter durch sie hindurch geht, ohne eine Animation und Script zu benutzen, oder wenn man eine Hängebrücke erstellen möchte, ohne ein aufwendiges Script zu schreiben, stößt man auf ein gewaltiges Problem. Genau für dieses Problem, gibt es die Joints in Unity. Bevor wir uns jedoch von den Joints in einer Modellierungssoftware etc. verwirren lassen, sollte ich euch noch sagen dass die Joints in Unity rein gar nichts mit den Joints in Cinema 4D, Blender etc. zu tuhen haben.

 

Joints tuhen also genau das was ich oben schon angedeutet habe. Mit ihnen kann man Objekte um eine Achse rotieren lassen, eine Federung erstellen oder ganz einfach mehrere Objekte zusammenhalten.

 

"Rotieren? Dafür brauche ich doch keine Joints, das ist mit einem kleinen Script wunderbar gelößt" würden jetzt wahrscheinlich viele sagen. Aber Joints ermöglichen uns, dass sie von anderen Objekten beeinflusst werden können. Also wenn ihr zum Beispiel einen Joint eine bestimmte Rotationsgeschwindigkeit gibt, und das Objekt, welches den Joint zugewiesen bekommen hat, an z.B. einen Würfel mit Rigidbody stößt, so versucht euer Joint den Würfel wegzudrücken. Hat der Würfel aber eine zu hohe Masse, so schafft euer Joint es nur langsam bis gar nicht, den Würfel zu verdrängen. Doch die Gravitation spielt auch eine wichtige Rolle. Wenn ihr zum beispiel eine Turmglocke erstellen wollt, geht dieses genau so über einen Joint. Den der Joint lässt sich wie schon gesagt von der Gravitation beeinflussen. Neigt ihr eure Turmglocke also etwas und startet euer Spiel, so fängt die Turmglocke an zu pendeln, da diese von der Schwerkraft angezogen wird.

Genau für solche Zwecke, gibt es den sogenannten "Hinge Joint".

 

Also los gehts, zum Praktischen Teil :)

 

Es gibt insgesamt 5 Arten von Joints. Den Oben schon angesprochenden Hinge Joint, den Fixed Joint, den Spring Joint, den Character Joint und den Configurable Joint.

 

Der Hinge Joint

 

Der Hinge Joint, tut genau das, was ich oben schon bereits erwähnt habe. Er lässt ein Objekt an einer bestimmten Achse lang rotieren. Diese Rotation wird von der Physik Engine übernommen, da unser Objekt, schließlich von anderen Objekten beeinflusst werden kann, und die Gravitation eine Rolle spielen Soll. Um einen Joint beispielsweise einem Pendel hinzuzufügen, Klicken wir im Componentmenü unter der Kategorie "Physics" auf Hinge Joint. Wichtig dabei ist, das wir unser Objekt, welches den Joint bekommen soll selektiert haben.

 

Nun wird unserem Pendel ein Hinde Joint und ein Rigidbody automatisch hinzugefügt.

 

unbenanntsqo71yabvc.jpg

 

Doch bevor wir nun einen realistische Pendelbewegung haben, müssen wir noch ein paar Einstellungen an unserem Joint vornehmen. Denn wenn wir unser Spiel jetzt starten würden, so würde unser Joint nicht unbedingt das tuhen, was wir erwarten.

 

Rechts im Inspector sehen wir am Hinge Joint den ersten Parameter namens Connected Body, dem ein Rigibody übergeben wird. Jeder Joint besitzt diesen Parameter, denn mit diesem Parameter können wir mehrere Joints miteinander verknüpfen. Diese Funktion ist sehr sehr hilfreich, wenn man sich zum beispiel eine Hängebrücke basteln möchte, die aus mehrere Holzplatten besteht (Mehr dazu weiter unten). Da wir aber bis jetzt nur einen Pendel haben, also auch nur einen Joint, lassen wir diesen Parameter leer. Der nächste Parameter trägt den Namen Anchor, der die Position des Pivots bestimmt. Also dem Mittelpunkt, um den sich das Objekt, in unserem Fall der Pendel, rotieren soll. Dieser ist am Anfang auf 0, 0, 0 gesetzt. Das heißt er befindet sich an dem Punkt, an dem sich auch der Weltpunkt, unseres Objekts beträgt. Da in meinem Fall, der Weltpunkt rechts hinten von meinem Pendel sitzt, muss ich den Anchor also so einstellen, dass er sich genau auf der Spitze meines Pendels befindet, da die Spitze des Pendels, den Mittelpunkt darstellen soll, um den der Pendel ja rotiert bzw. pendelt. Da jedoch in die x, y und z Koordinaten nicht die globale Position hinein soll, sondern ein Offset des Weltpunkt des Objektes, also bei uns der Pendel, müssen wir solange mit den Werten herumexperimentieren, dass sich der orangene kleine Pfeil, genau auf unserem Mittelpunkt befindet. Also der Orangene Pfeil, stellt praktisch den Mittelpunkt dar, um dem sich das Objekt bewegen soll. Den Anchor nun perfekt angepasst, sieht das ganze nun ungefähr so aus:

 

unbenanntbl37cmx5dy.jpg

 

Als nächsten Parameter sehen wir im Inspector die Axis, die ebenfalls einen Vector3 übergibt. Die Axis bestimmt den Winkel, bzw halt die Achse, um die rotiert werden soll. Standartmäßig hat die Achse die Parameter 1, 0, 0. Die Achse gibt eine Position an zu der der orangene Pfeil schauen soll. Würde ich die Achse zu 0,1,0 ändern so würde der Pfeil Senkrecht in die Höhe schauen, da vom Pfeil ausgesehen, die Position 1 über ihm ist. ich könnt genauso gut 1, 1, 0 schreiben. Dies würde bedeuten, dass der Pfeil schräg nach rechts oben schaut, da sich dort die relative Position zu ihm befindet. Um das ganze mal besser zu veranschaulichen:

 

Bei diesem Beispiel ist die Axe auf 1,0,0 eingestellt. Also schaut der Pfeil von seiner Position aus, zur Position 1,0,0 und schaut in diese Richtung:

 

unbenannts28fhwmxzy.png

 

Beim nächsten Beispiel ist die Axe auf 0,1,0 gestellt. Also muss der Pfeil nach oben schauen, da

sich die 1. y Position von im ganz oben befindet:

 

unbenannt2qpr4f59z2k.png

 

Und bei dem letzten beispiel steht die Axe auf 1,1,0. Da hier sowohl als auch ein X und Y Wert angegeben ist, schaut der Pfeil in die Richtung des Punktes 1,1,0 von ihm aus gesehen.

 

unbenannt381cmgt6heq.png

 

Doch was genau bewirkt nun die Schrägstellung des Pfeiles? Nun. wie der Name "Axe" schon sagt, geht es um die Rotationsachse. also unser Objekt alias Pendel, Rotiert also um den Pfeil herum.

Hier ein kurzes beispiel:

 

unbenannt1u8n04qf57.png

 

Unser Pendel wird also um den Pfeil praktisch herum drehen. Wie ein Mensch, der an einer Reckstange turnt, so müssen wir uns das auch mit dem Pendel vorstellen. Wenn der Pfeil also die Reckstange ist und der Pendel der Mensch, so müssen wir die Reckstange (also der Pfeil) so einstellen, dass unser Pendel seitlich daran schwingt. In meinem Fall muss ich die Achse auf 0,0,1 stellen. Das sieht dann so aus:

 

unbenannt8r3pewhs0v.jpg

 

Nun schauen wir uns mal die nächsten 2 Parameter an. Diese heißen Auto Configure Connected Anchor und Connected Anchor. Der Connected Anchor gibt uns ebenfalls einen Vector3 den wir bearbeiten können. Dieser jedoch unterscheidet sich zum Normalen Anchor Parameter nur darin, dass wir mit Connected Anchor die position des Pfeiles bzw. des Rotationsmittelpunktes mit den Koordinaten der Weltachse angeben können. Sprich wenn wir dort 10, 10 ,10 hineinschreiben würden, so würde sich der Pfeil Tatsächlich an dieser Position im Koordinatenkreuz befinden. Das ist aber nicht notwendig wenn wir den Anchor im 2. Parameter schon angegeben haben. Mit dem Parameter Auto Configure Connected Anchor können wir nun sagen, ob wir den normalen Anchor oben bentzen in dem wir das Häkchen setzen, oder ob wir den Connected Anchor Parameter benutzen und somit die Position des Mittelpunktes mithilfe des Koordinatenkreuzes zu bestimmen. Da der Haken standardmäßig gesetzt ist, und die Angabe des normalen Anchors vollkommen reicht, können wir die beiden Parameter so stehen lassen.

 

Nun kommen wir zu den nächsten 2 Parametern. Und zwar Use Spring und Spring. Wenn wir den Spring parameter mal aufklappen, so sehen wir 3 weitere Variablen die wir einstellen können. Doch erst einmal... Was macht Spring überhaupt? Wenn wir einen echten Pendel einer Uhr so beobachten, dann merken wir, dass er immer gleichmäßig hin und her Pendelt. Wenn wir uns mal aber mal einen Wolkenkratzer anschauen (ich weiß komischer vergleich :D), steht dieser immer starr und bewegt sich nicht. Moderne Wolkenkratzer sind so gebaut, dass sie bei einem Erdbeben zwar vibrieren, aber die vielen Stäbe die sich senkrecht durch den Wolkenkratzer ziehen. Sorgen dafür, dass sich der Wolkenkratzer nach dem Erdbeben wieder in seine Ursprungsposition zurückfährt. So etwas können wir mit unserem Spring einstellen. mit Use Spring können wir ein Häkchen setzen, wenn wir Spring in unserem Joint überhaupt benutzen möchtet. Falls ja, könnt ihr im Spring Parameter die Variablen Spring, Damper und Target position einstellen. Spring bestimmt die "Härte" wie schnell der Joint wieder in seine Ursprungsposition zurückspringen soll. Also wenn wir den Wert auf 100 Stellen würden, dann steht unser Pendel ganz starr und er kann nicht mehr richtig Pendeln. Wenn wir den Pendel anschubsen würden, so würde er zwar hin und her wackeln, aber danach wieder sofort in seine Ursprungsposition einkehren. mit dem Damper können wir den Wackel effekt abdämpfen. Jeder Höher der Damper ist, desto starrer wird der Joint und wackelt nicht hin und er wenn man ihn anschubst. Je nach dem wie hoch man den Damper eben einstellt.

Target Position stellt die Grad zahl dar, in die sich der Joint richten soll. Wenn wir Target Position also auf 90 stellen, so stellt sich unser Pendel im 90 Gradwinkel auf, also Waagerecht zum Boden, sobald der Spring wert hoch genug ist, da unser Pendel ja gegen die Schwerkraft antreten muss.

 

Die nächsten 2 Parameter sind Use Motor und Motor. Wie der Name schon sagt, wird dem Joint eine Art Motor hinzugefügt. Mit Use Motor können wir dann wieder einstellen, ob wir den Motor benutzen wollen oder nicht. Hierbei können wir Beschleunigung und Geschwindigkeit einstellen. So etwas eignet sich gut für Dinge die sich automatisch drehen und auf Physik reagieren sollen.

Mit der Variable Target Velocity legen wir also unsere Maximale Geschwindikeit fest, mit der sich unser Joint drehen soll. Doch um den Joint bzw den Pendel zu drehen, benötigen wir kraft. wie viel kraft wir aufbringen wollen, um die Maximale Geschwindigkeit, also Target Velocity zu erreichen, können wir mit der Force Variable einstellen. Diese bestimmt die Kraft des Pendels bzw des Joints. Also je höher Force ist, desto schneller und stärker erreicht unser Pendel seine Maximale Geschwindigkeit also Target Velocity. Wenn wir das jedoch mal ausprobieren werden wir feststellen, das unser Pendel sich zwar Dreht, und das auch in der Vorgegebenen Geschwindigkeit jedoch wenn wer Pendel oben angekommen ist und nun zur anderen Seite wieder herunterfährt so müsse er doch eigentlich schneller werden:

 

unbenanntlbh39msda0.jpg

 

Normalerweise müsste unser Pendel nun Links herunterfallen, da die Schwerkraft ihn nach unten Zieht. doch der Motor fährt nur langsam in der Target Velocity Geschwindigkeit wieder herunter.

Unser Pendel wird also angebremst. Diesen Effekt können wir ganz einfach ausstellen, in dem wir bei Free Spin einen Haken machen. Das Bewirkt, dass der Motor den Pendel nicht abbremst, falls dieser mal aufgrund von Schwerkraft oder anderen Objekten die auf ihm einwirken.

 

Nun kommen wir zu den Limits. Auch diese Können wir mit den Use Limits an oder Ausschalten.

Limits machen es uns möglich, den Pendel bzw den Joint in seiner Drehung einzuschränken. Die ersten beiden Variablen heißen Min und Max, Mit ihnen können wir einen bestimmten bereich angeben, in dem sich der Pendel bewegen darf. Stellen wir also beispielsweiße Min auf -20 und Max auf 20, so kann sich unser Pendel nur 20 Grad nach links und 20 Grad nach rechts bewegen. Dadurch ist der Pendel in seiner Bewegung eingeschränkt und kann diesen Bereich nicht verlassen.

Min Bounce und Max Bounce bewirkt eine Art Dämpfung bzw Federung. Mit diesen Beiden Variablen können wir die Dämpfung bzw Federung am Minimalen Punkt also in unserem Fall -20 und am Maximalen punkt also bei uns 20 Grad einstellen. Das ist zum beispiel nützlich, wenn man eine art Schranke erstellen möchte, da diese sich ja auch nur im 90 Grad winkel bewegen kann.

 

Doch was ist wenn unserem Pendel mal etwas zustößt? Ein Objekt könnte ja gegen unseren Pendel geraten. Hätte das nicht zu folge dass dieser dann abfällt? Ja das hätte es. Und das ist auch mit Joints realisierbar. Nämlich mit den Letzten beiden Parametern Break Force und Break Torque.Mit diesen Parametern können wir bestimmen was unser Joint aushalten soll. Break Force bestimmt dabei, wie wiederstands fest unser Pendel sein kann, wenn zum beispiel ein Anderes Objekt Frontal auf ihn auf trifft. Wenn das Objekt von der Seite kommt, dann würde eigentlich nicht viel passieren. Denn es würde den Pendel nur weiter anschubsen damit er noch stärker pendelt. Doch wenn etwas von Vorne oder von oben kommt, dann sieht das schon anders aus. Denn sobald etwas gegen ihn stößt muss unser Pendel abbrechen. Und dafür ist Break Force zuständig. Je Höher der Wert ist desto mehr hält unser Pendel aus. Wenn ihr in das Feld "Infinity" schreibt, dann ist unser Pendel unendlich Stabil und er würde nicht abbrechen. Break Torque bestimmt die Maximale umdrehung des Pendels. Also wie schnell darf der Pendel rotieren, bevor er abbricht. Auch hier gilt je höher desto stärker.

Wenn der Pendel dann mal abbricht, lößt er sich vom Joint und ist danach wie ein ganz normaler rigidbody und komplett ungebunden.

 

 

So ist doch etwas mehr geworden als ich dachte ^^ wenn ihr zu den anderen Joints auch ein Tutorial wollt. dann postet es gerne hier. Nicht dass ich alles umsonst schreibe^^

 

Ich hoffe es hat euch geholfen, ich persönlich finde, dass Joints eines der besten Features in Unity ist.

 

Mfg

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 3 weeks later...
  • 3 weeks later...

Genau das, wonach ich gesucht habe :) vielen Dank !

 

Allerdings bin ich auch ein kleines Problem gestoßen, und zwar habe ich bei Limits -50 und 50 eingestellt sowie auch free Spin. Allerdings schwingt das Pendel nur hoch und bleibt dann dort hängen. Hat sich vieleicht was geändert ? Nutze übrigens Unity 4

 

 

Edit: Hab das Problem gefunden, es lag am aktivierten Motor.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 6 years later...

Join the conversation

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

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

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

Lädt...
×
×
  • Neu erstellen...