====== 3D-Physics ====== ===== Rigidbody ===== Rigidbodies erlauben es Körpern, physikalisch verändert zu werden und gibt der Engine bei jedem Frame, anders als bei normalen GameObjects, immer seine Position mit. Sie besitzen: * Masse * Gravitation (ja/nein) * kinematische Eigenschaft (ja/nein) * Drag (~Reibung, bestimmt, wie ein Körper zurückgezogen wird) * Angular Drag (~Winkelreibung, bremst Rotation) * Interpolation/Extrapolation (Glättet die Bewegungen, wenn sonst Probleme auftreten sollen. | Sollte standardmäßig disabled sein.) * Verschiedene Optionen für eine Collision Detection Des Weiteren kann man einstellen, auf welchen Achsen sich der Rigidbody nicht bewegen und rotieren darf.\\ ===== Colliders ===== Colliders setzen einen //Rigidbody// voraus, standardmäßig ist bei simplen GameObjects immer ein Collider beigefügt.\\ Einfach gesagt erlaubt ein Collider einem Rigidbody, mit anderen GameObjects zu interagieren.\\ Im Script kann man Kollisionen auf 3 Arten detecten: OnCollisionEnter(Collision collision) { //Aufgerufen bei erster Berührung } OnCollisionStay(Collision collision) { //Aufgerufen, wenn sich die Körper noch immer berühren } OnCollisionExit(Collision collision) { //Bei der letzten Berührung aufgerufen } Es gibt mehrere Arten von Collidern: ==== Primitive Collider ==== Sind Formen, wie beispielsweise Kugeln, Kapseln, Würfel, Zylinder, etc.\\ Der Vorteil von diesen ist der minimale Aufwand für die CPU/GPU. ==== Mesh Collider ==== Entspricht genau den Dimensionen des GameObjects. Dadurch können Kollisionen so genau wie möglich detected werden.\\ Das Problem hierbei ist jedoch, dass dies einen großen Aufwand für RAM, CPU und GPU darstellt. ==== Compound Collider ==== Ist eine Mischung zwischen den ersten beiden Arten. Entspricht in etwa dem vorgegebenen Mesh des GameObjects.\\ Verwenden sollte man diesen, wenn das GameObject zwar komplizierte Strukturen besitzt, man aber minimalen Overhead haben möchte.\\ Die Detektion ist jedoch nicht so genau, als wie beim //Mesh Collider.// ==== Trigger ==== Ein Collider kann auch im Inspect-Menü in einen Trigger umgewandelt werden.\\ Dies bewirkt, dass zwar keine physikalische Kollision vorkommt, aber doch eine Collision von der Engine detected wird.\\ Voraussetzung ist hier auch wieder ein //Rigidbody.//\\ Wie bei Kollisionen gibt es auch hier wieder 3 Arten, Trigger im Script zu nutzen. Man ersetzt einfach das //Collision// (z.B. bei //OnCollisionEnter//) durch //Trigger//.\\ Dies benutzt man, wenn man zwar Interaktionen durchführen möchte, aber keine Kollision verursachen möchte. (z.B.: Hover-Zone, Script darunter.) public float hoverForce=15f; void OnTriggerStay(Collider other) { other.Rigidbody.AddForce(Vector3.up * hoverForce, ForceMode.Acceleration); } //Bei einer Kollision mit einem unsichtbaren Würfel, der als Trigger gestzt ist, schwebt z.B. die Kugel dann in diesem Bereich. //Falls other nicht als Rigidbody erkannt werden sollte, kann man den Rigidbody als public-Variable defnieren und im Editor hinzufügen. //Dann wäre hinzuzufügen: //public Rigidbody object; //Und statt other.Rigidbody schreibt man: //object.AddForce(Vector3.up * hoverForce, ForceMode.Acceleration); ===== Physic Materials ===== Im Gegensatz zu normalen Materials ändern Physic Materials nicht das Aussehen, sondern physikalische Eigenschaften von Körpern.\\ Dabei kann man verschiedene Eigenschaften ändern: * Friction (Reibung) * Dynamic Friction (dynamische Reibung) * Bouncyness (bestimmt, wie das Object von einem anderen abprallt) * Friction Combine (bestimmt, wie stark die Reibung einfließt) * Bounce Combine (bestimmt, wie stark die Bouncyness einfließt) ===== Physic Joints ===== //Video: [[https://www.youtube.com/watch?v=f4xikqJdkwM|Physic Joints]]// //Physic Joints// benutzt man, um Federn etc. zu simulieren.\\ Auch hier gibt es wieder 3 Arten: ==== Fixed Joint ==== Bleibt an einer Stelle festgehalten, kann, wenn die Parameter für BreakForce nicht auf infinity gesetzt sind, aber abgebrochen werden.\\ Dies kann man beispielsweise gut als Kopfstück einer Ketter benutzen. ==== Spring Joint ==== Kann frei herumbouncen. Für diesen Component gibt es mehrere Settings:\\ * Connected Body: Kann den Joint an einem anderen Joint oder Rigidbody fixieren. * Spring: Gibt die Stärke der "Feder" an * Damper: Dämpfung bei Bewegung * Min und Max Distance: Restriktiert die Bewegung des Joints * Break Force und Break Torque: Kann man einstellen, um eine notwendige Kraft zum Abbrechen des Joints einzustellen Dies kann man gut benutzen, um die einzelnen Stücke einer Kette zu simulieren. ==== Hinge Joint ==== Kann beispielsweise gut zur Simulation einer Tür verwendet werden.\\ Die Settings für diesen Komponenten sind:\\ * Connected Body: [Siehe Spring Joint] * Anchor: Gibt an, wo der Hinge Joint fixiert werden soll. * Axis: Gibt an, auf welcher Achse bei hinzufügen von Kraft die Rotation stattfinden soll * Limits: [Siehe Spring Joint] * Break Force/Torque: [Siehe Spring Joint] * Spring: [Siehe Spring Joint] * Motor: Kann einen "Motor" hinzufügen, der immer wieder Kraft auf das Object einwirkt * Limits: Mit diesen kann man maximale Rotation und maximalen Bounce einstellen ===== Raycasting ===== //Video: [[https://www.youtube.com/watch?v=EINgIoTG8D4|Raycasting]]// //Raycasting// ist eine Methode, um zu überprüfen, ob ein Objekt auf seinem Weg auf ein anderes stößt.\\ Dabei sieht die Syntax so aus: Physics.Raycast(Vector3 ursprung, Vector3 richtung, RaycastHit info, float distanz, int LayerMask); Am Anfang sieht dies etwas verwirrend aus, ist es aber eigentlich nicht: * Der erste Vector3 beschreibt den Usprungspunkt des Objekts. * Der zweite Vector3 zeigt in die Richtung, in die das Objekt sich bewegen wird. * RaycastHit info loggt alle getroffenen Objekte mit * float distanz gibt eine Maximaldistanz an * LayerMask gibt an, auf welchem //Layer// man Objekt platzieren kann, damit sie ignoriert werden Die zwei Vector3 - Variablen kann man im Variablentyp //Ray// zusammenfassen, wenn diese bereits vorher intialisiert werden sollen.\\ Nutzen kann man dies beispielsweise für Detection, ob Schüsse treffen, oder, um einen Fallschirm kurz vor dem Boden öffnen zu lassen. ---- --- //[[johannes.schoerghuber@am-gym.at|Johannes Schörghuber]] 2016/01/29 07:37//