A forgómozgás fizikája megfeleltethető a lineárissal. Ezt a A mechanika alapjai leckében tárgyaltuk. Ez a párhuzam a Unity fizikában is megfigyelhető.
A legnagyobb különbség, hogy a Rigidbody és Rigidbody2D nem vektorban tárolja a forgási szögsebességét, hanem 3D-ben egy Quaternion
-ban és 2D-ben egy float
számban, hisz ezutóbbi esetben csak egy forgástengely van, a Z.
Mind 2 és 3 dimenzióban a forgási sebesség fokban értendő.
Módosíthatjuk a Rigidbody rotation
tulajdonságát manuálisan is hasonlóan a velocity
-hez.
3D esetén a legcélszerűbb a Quaternion-t Euler szögekbe alakítani. Általában így könnyebb vele dolgozni.
// --------------------------------------- 3D ---------------------------------------
Vector3 value = new Vector3(0, 90, 270); // Fokban
Rigidbody rigidbody = GetComponent<Rigidbody>();
Vector3 euler = rigidbody.rotation.eulerAngles
// ... Műveletek ...
euler += value; // Szögsebesség változás
euler += value * Time.fixedDeltaTime; // Szöggyorsulás
euler += value / rigidbody.mass; // Perdület változás
euler += value / rigidbody.mass * Time.fixedDeltaTime; // Forgatónyomaték
rigidbody.rotation = Quaternion.Euler(euler);
// --------------------------------------- 2D ---------------------------------------
float value = 90; // Fokban
Rigidbody2D rb = GetComponent<Rigidbody2D>();
// ... Műveletek ...
rb.rotation += value; // Szögsebesség változás
rb.rotation += value * Time.fixedDeltaTime; // Szöggyorsulás
rb.rotation += value / rigidbody.mass; // Perdület változás
rb.rotation += value / rigidbody.mass * Time.fixedDeltaTime; // Forgatónyomaték
Emellett használható az AddTorque
függvény is az AddForce
-hoz hasonlóan.
3D esetén az AddTorque
Euler szögeket vár Vector3
-ban vagy 3 darab float
-ban.
2D-ben csak egy darab float
szöget.
Minden esetben az AddForce
-hoz hasonlóan adhatunk egy ForceMode
típusú opcionális paramétert, ami hasonlóan működik, mint a lineáris esetben. Sajnos ehhez fejből kell tudni a forgómozgás fizikai mennyiségeinek lineáris fizikában használt megfelelőit:
Függ a tömegtől | Független a tömegtől | |
Pillanat szerű
| Szögsebesség változás
ForceMode.VelocityCahnge | Perdület változás
ForceMode.Impulse |
Folyamatos | Szöggyorsulás
ForceMode.Acceleration | Forgatónyomaték
ForceMode.Force |
Vector3 value = new Vector3(0,90,270); // Fokban
Rigidbody rigidbody = GetComponent<Rigidbody>();
rigidbody.AddTorque(value, ForceMode.VelocityCahnge); // Szögsebesség változás
rigidbody.AddTorque(value, ForceMode.Acceleration); // Szöggyorsulás
rigidbody.AddTorque(value, ForceMode.Impulse); // Perdület változás
rigidbody.AddTorque(value, ForceMode.Force); // Forgatónyomaték