Im letzten Teil des Unity Physics Tutorials hast du die Verwendung von Physik-Materialien kennengelernt. Damit ist es möglich, physikalische Effekte wie beispielsweise die Reibung oder den Abpralleffekt von Objekten zu simulieren. Um die Reibung so realitätsnah wie möglich darzustellen, kann, wie in der realen Welt, zwischen der Haft- und Gleitreibung unterschieden werden.
In Unity gibt es außerdem noch Joints und Constraints. Durch die Kombination von Unity Joints und Constraints lassen sich komplexe physikalische Verhaltensweisen erstellen. Das ermöglicht die Simulation von Gelenken, Hebeln, Schwingungen und anderen mechanischen Systemen. Und genau darauf wollen wir in diesem Teil des Unity Physics Tutorial eingehen.
Übersicht Unity Physics Tutorial
Joints und Constraints
In der Physiksimulation spielen Joints (Gelenke) und Constraints (Einschränkungen) eine wichtige Rolle. Die Verwendung von Joints und Constraints erlaubt es, komplexe physikalische Verhaltensweisen zu erstellen. So zum Beispiel das Simulieren von Gelenken in einem Roboterarm, das Anbringen eines Seils an einem Haken oder das Erstellen von Schwingungen mit einem Pendel. Aber lass uns zunächst einen Blick auf die Bedeutung von Joints in der Physik werfen.
In Unity spielen Physik-Materialien bei der Steuerung der Kollisionseigenschaften von GameObjects eine entscheidende Rolle. Sie ermöglichen es, das physikalische Verhalten zwischen Collidern und Rigidbodies zu kontrollieren. Hierfür können Parameter wie Reibung und Bounciness (Abprallfaktor) verwendet werden. Damit lassen sich in Unity realistische Interaktionen erzielen.
Hinweis: Mit dem ultimativen Unity Cheat Sheet erhältst du einen detaillierten Überblick über Tipps & Tricks mit dem Umgang von Unity. Sichere dir jetzt das Cheat Sheet, um deine Anwendungen noch einfacher und effektiver erstellen zu können!
Joints und ihre Bedeutung in der Physik
Unity Joints (Gelenke) sind eine fundamentale Komponente, die in Unity und anderen 3D Engines verwendet wird. In der realen Welt entsprechen Joints mechanischen Verbindungen, die es ermöglichen, dass sich Objekte relativ zueinander bewegen. Allerdings besitzen sie bestimmte Einschränkungen zueinander. So beispielsweise ein Federpendel, bei dem eine Masse an einer Feder angebracht ist. Sobald das Objekt nach unten ausgelenkt und losgelassen wird entsteht eine mechanische Schwingung. Das ist in der nachfolgenden Abbildung zu erkennen.
Mechanische Federverbindung (Federpendel)
Die Verwendung von Joints in Unity Physics erlaubt es, komplexe mechanische Strukturen und Bewegungen abzubilden, die den physikalischen Gesetzen folgen. Ohne Joints in Unity würden Objekte keinerlei realistische Interaktion besitzen. Mit Joints hingegen lassen sich Mechanismen wie ein Pendel, Schiebetüren, Roboterarme und vieles mehr realitätsnah darstellen.
Einige Beispiele für die Anwendung von Unity Joints sind:
- Hinge Joint: Ein Gelenk, das eine Rotation um eine einzige Achse ermöglicht, ähnlich dem Türscharnier.
- Character Joint: Ein Gelenk, das Bewegungen in alle Richtungen ermöglicht, ähnlich dem menschlichen Hüftgelenk.
- Spring Joint: Fügt eine elastische Federkraft zwischen zwei Rigidbodies hinzu, die eine schwingende Bewegung abbildet (ähnlich dem Federpendel).
Die Kombination verschiedener Joint-Typen in Unity kann realistische Bewegungen erzeugen und interaktive Umgebungen schaffen. Von einfachen Drehungen und Verschiebungen bis hin zu komplexen Mechanismen und schwingenden Bewegungen. Werfen wir aber einmal einen Blick auf die verschiedenen Joint-Komponenten in Unity.
Joint-Komponenten in Unity
Unity bietet verschiedene Joint-Komponenten, die du verwenden kannst, um Verbindungen zwischen Rigidbodies zu erstellen. Im Folgenden findest du einige der gängigsten 3D Joint-Komponenten. Für 2D Anwendungen gibt es die gleichen und ergänzend noch weitere Joints. Du erkennst diese an der Endung “2D” in der Benamung.
Character Joint
Der Character Joint ist ein spezieller Typ, der zur Erstellung von Charakterbewegungen und Gelenken verwendet wird. Mit dem Character Joint kannst du realistische Charakteranimationen erstellen, indem du Gelenke ähnlich dem menschlichen Skelett simulierst. Dieser Joint-Typ ermöglicht eine natürliche Bewegung von Charakteren.
Dazu zählen beispielsweise Gelenke wie Schultern, Ellbogen, Hüften und Knie. Dadurch können Charaktere realistisch laufen, springen, sich beugen und interagieren. Sie werden meist für Ragdoll Physics verwendet, worauf wir im weiteren Verlauf des Unity Physics Tutorial noch eingehen werden.
Character Joint Unity
Configurable Joint
Der Configurable Joint ist ein besonders vielseitiger Typ in Unity. Er bietet ein Vielzahl an verschiedenen Einstellungen und Freiheitsgraden, um komplexe mechanische Strukturen zu erstellen. Damit lässt sich die Bewegungs- und Rotationsfreiheit gegenüber verschiedenen Achsen definieren. Dadurch kannst du eine Simulation von Gelenken mit mehreren Freiheitsgraden wie beispielsweise Robotergelenken erstellen.
Configurable Joint Unity
Fixed Joint
Der Fixed Joint ist ein Typ, der zwei Rigidbodies miteinander verbindet und ihre Positionen und Rotationen fest fixiert. Im Gegensatz zu anderen Unity Joints erlaubt der Fixed Joint keine Bewegung oder Veränderung zwischen den Rigidbodies. Das ist besonders nützlich, um Objekte zusammenzuhalten, die während der Simulation nicht voneinander getrennt werden sollen.
Beispielsweise können so die Räder eines Autos mit dem Chassis verbunden werden, sodass sie sich während der Fahrt nicht unerwartet lösen. Eine Möglichkeit, die Verbindung während der Anwendung dennoch zu trennen, sind die Parameter Break Force und Break Torque. Dadurch kann der Fixed Joint zerstört werden.
Fixed Joint Unity
Hinge Joint
Der Hinge Joint ist einer der grundlegenden Typen in Unity. Er ermöglicht eine Rotation um eine einzige Achse, ähnlich einem Türscharnier. Mit diesem Joint lassen sich Türen, Klappen, Schwingtüren oder andere rotierende Mechanismen erstellen.
Die Drehachse des Hinge Joint kann über den Parameter Axis festgelegt werden, sodass sich das Objekt nur um eine bestimmte Achse dreht. Die Verbindung zwischen den Rigidbodies wird dadurch stabilisiert und die Bewegung erfolgt präzise um die definierte Achse.
Hinge Joint Unity
Spring Joint
Der Spring Joint fügt eine elastische Federkraft zwischen zwei Rigidbodies hinzu, die eine schwingende Bewegung ermöglicht. Durch die Einstellung der Federstärke (Spring) und Dämpfung (Damper) kann die Intensität und das Verhalten der Schwingung gesteuert werden. Dieser Typ wird häufig verwendet, um Objekte zu simulieren, die sich wie Federn verhalten.
So zum Beispiel Schwingtüren oder Trampoline. Er kann ebenso dazu beitragen, um natürliche Bewegungen von Objekten in der Umgebung zu simulieren. Dazu zählt unter anderem das sanfte Auf- und Abschwingen eines Baumes unter Windeinwirkung. Auch das Federpendel, das zu Beginn des Artikels erwähnt wurde, lässt sich so realisieren.
Spring Joint Unity
Beispiel Hinge Joint
Ein Beispiel für den Hinge Joint ist eine Tür wie in der folgenden Abbildung. Zunächst ist es wichtig der Tür und dem Gehäuse eine Rigidbody-Komponente zuzuweisen. Wie im ersten Teil erläutert, kannst du das im Inspektor des jeweiligen GameObjects über AddComponent → Rigidbody durchführen.
Anwendungsbeispiel Unity Hinge Joint
Im nächsten Schritt fügen wir im GameObject Tür eine Hinge Joint-Komponente über AddComponent → Hinge Joint hinzu. Mit dem Parameter Anchor und Axis legen wir die Position und die Achse fest, um welche die Tür rotieren soll. Die Position ist im lokalen Koordinatensystem der Tür festgelegt.
In diesem Beispiel siehst du dieses in der nachfolgenden Abbildung in der unteren rechten Ecke mit dem Nullpunkt 0/0/0. Da wir die Position auf das mittlere Türscharnier legen wollen, tragen wir bei Y die Koordinate 1 ein. Optional besteht hier auch die Möglichkeit das GameObject des Gehäuses als Connected Body zu verwenden. Dadurch erfolgt eine automatische Verknüpfung.
Zum anderen ist es wichtig bei Axis die Y Koordinate mit 1 zu wählen. Das bedeutet, dass das GameObject um die Y-Achse rotiert. Und zu guter Letzt kann noch ein Limit für das Schließen und Öffnen der Tür gewählt werden. Dazu kannst du Use Limits aktivieren und den minimalen und maximalen Öffnungswinkel in Grad eintragen. Nachdem diese Parameter eingetragen sind, sollte sich die Tür um die festgelegte Position und um die y-Achse drehen.
Parameter Hinge Joint
Abhängig von den jeweiligen Anforderungen lassen sich die jeweiligen Parameter anpassen, um das gewünschte Verhalten zwischen den Rigidbodies zu erzielen. Von einfachen Drehungen und Verschiebungen bis hin zu komplexen Mechanismen und schwingenden Bewegungen bieten sie eine Kontrolle über die Interaktionen zwischen Rigidbodies.
Constraints-Komponenten für komplexe Bewegungen
Constraints sind in Unity Physics ein Tool, um komplexe Bewegungen und Interaktionen zwischen Objekten zu steuern. Damit können bestimmte Einschränkungen und Regeln festgelegt werden, um die Position, Rotation und Skalierung von GameObjects zu beeinflussen. Somit lässt sich der Freiheitsgrad von Objekten einschränken.
In Unity stehen mehrere Constraints zur Verfügung, die jeweils unterschiedliche Aspekte der Bewegung kontrollieren.
Aim Constraint
Der Aim Constraint stellt sicher, dass ein GameObject immer in Richtung eines anderen GameObjects oder Ziels ausgerichtet bleibt. Das ist besonders nützlich, wenn eine Kamera auf ein bestimmtes Ziel blicken soll. Durch die Verwendung dieses Constraints kann eine präzise Ausrichtung von GameObjects sichergestellt werden, während sie sich relativ zu einem anderen Objekt bewegen.
Aim Constraint Unity
Look At Constraint
Ähnlich wie der Aim Constraint richtet sich auch der Look At Constraint nach einem Zielobjekt aus. Der Unterschied besteht darin, dass das GameObject nicht nur in Richtung des Ziels zeigt, sondern auch die Rotation entsprechend angepasst wird. So bleibt das Ziel immer im Fokus des GameObjects. Das ist nützlich, um eine Kamera auf ein bewegliches Objekt auszurichten, sodass die Kamera das Objekt immer im Blick behält.
Look At Constraint Unity
Parent Constraint
Mit dem Parent Constraint können GameObjects miteinander verknüpft werden, wobei das eine GameObject als Elternteil und das andere als Kind fungiert. Die Position und Rotation des Kindobjekts wird relativ zur Position und Rotation des Elternobjekts transformiert. Das ermöglicht es, komplexe Hierarchien von GameObjects zu erstellen. Das Kindobjekt bewegt und richtet sich immer entsprechend der Bewegungen des Elternobjekts aus.
Parent Constraint Unity
Position Constraint
Der Position Constraint stellt sicher, dass die Position eines GameObjects an einen bestimmten Punkt im Raum fixiert wird. Das kann eingesetzt werden, um beispielsweise eine Kamera an einem festen Punkt zu verankern oder ein Objekt an einer bestimmten Position zu halten. All das geschieht unabhängig von anderen Kräften oder Bewegungen.
Position Constraint Unity
Rotation Constraint
Der Rotation Constraint begrenzt die Rotation eines GameObjects, sodass es sich nur um bestimmte Achsen bewegen kann. Dieser Constraint-Typ ist hilfreich, um zum Beispiel die Drehung eines Charakters einzuschränken oder ein Objekt an eine vorgegebene Ausrichtung zu binden.
Rotation Constraint Unity
Scale Constraint
Der Scale Constraint kann dazu verwendet werden, um die Skalierung eines GameObjects einzuschränken. Dadurch lässt sich sicherstellen, dass ein Objekt immer eine bestimmte Größe beibehält und nicht unerwartet skaliert.
Scale Constraint Unity
Beispiel Look At Constraint
Angenommen die virtuelle Kamera der Szene soll immer auf ein bestimmtes GameObject gerichtet sein, dann kann hierfür die Look At Constraint Komponente verwendet werden. In unserer Szene eignet sich dafür beispielsweise der Karton, der nach dem Start der Anwendung von der Palette gleitet.
Anwendungsbeispiel Unity Look At Constraint
Zunächst ist es wichtig die virtuelle Kamera in der Szene auszuwählen. Anschließend kann diesem GameObject über Add Component → Look At Constraint die richtige Komponente zugewiesen werden. In der unteren Abbildung siehst du die Zuweisung dieser Komponente bei der Kamera.
Unter Sources kann nun das entsprechende Objekt gewählt werden. Über den Parameter Is Active wird der Constraint dann aktiviert. Es gibt noch weitere Einstellungsmöglichkeiten wie Weight. Diese Eigenschaft legt die Stärke des Constraints fest. Die gültigen Werte reichen von 0 (die Beschränkung hat keine Auswirkung) bis 1 (das GameObject dreht sich mit der gleichen Geschwindigkeit wie das Source Objekt).
Über die Constraint Settings kann außerdem ein Rotationsoffset eingestellt werden. Damit wird ein Versatz für eine bestimmte Ausrichtung (X, Y und Z) verwendet.
Parameter Look At Constraint
Die Kombination verschiedener Constraints eröffnet vielfältige Möglichkeiten zur Erstellung komplexer Bewegungen und Interaktionen zwischen GameObjects in Unity. Das erfordert aber in der Regel eine sorgfältige Feinabstimmung und Anpassung, um die gewünschten Effekte zu erzielen. Constraints können über den Inspektor oder auch über Skripte gesteuert werden. Im nächsten Teil des Unity Physics Tutorial werden wir auf Kräfte und Bewegungen eingehen.