Szukaj…


Składnia

  • Quaternion.LookRotation (Vector3 do przodu [, Vector3 w górę]);
  • Quaternion.AngleAxis (zmiennoprzecinkowe, Vector3 axisOfRotation);
  • float angleBetween = Quaternion.Angle (obrót czwartorzędu 1, obrót czwartorzędu 2);

Wprowadzenie do Quaternion vs. Euler

Kąty Eulera to „kąty stopniowe”, takie jak 90, 180, 45, 30 stopni. Czwartorzędy różnią się od kątów Eulera tym, że reprezentują punkt na Sferze Jednostkowej (promień wynosi 1 jednostkę). Możesz myśleć o tej kuli jako o trójwymiarowej wersji koła Jednostki, której uczysz się w trygonometrii. Czwartorzędy różnią się od kątów Eulera tym, że wykorzystują wyimaginowane liczby do zdefiniowania obrotu 3D.

Choć może się to wydawać skomplikowane (i prawdopodobnie tak jest), Unity ma świetne wbudowane funkcje, które pozwalają przełączać się między kątami Eulera i kwartałami, a także funkcje modyfikowania czwartorzędów, nie wiedząc nic o matematyce za nimi.

Konwersja między Eulerem i kwaternionem

// Create a quaternion that represents 30 degrees about X, 10 degrees about Y
Quaternion rotation = Quaternion.Euler(30, 10, 0);

// Using a Vector
Vector3 EulerRotation = new Vector3(30, 10, 0);
Quaternion rotation = Quaternion.Euler(EulerRotation);

// Convert a transfroms Quaternion angles to Euler angles
Quaternion quaternionAngles = transform.rotation;
Vector3 eulerAngles = quaternionAngles.eulerAngles;

Dlaczego warto korzystać z czwartorzędu?

Czwartorzędy rozwiązują problem zwany blokowaniem gimbala. Dzieje się tak, gdy główna oś obrotu staje się współliniowa z trzeciorzędową osią obrotu. Oto wizualny przykład @ 2:09

Obrót wyglądu czwartorzędu

Quaternion.LookRotation(Vector3 forward [, Vector3 up]) utworzy obrót Quaternion, który spogląda do przodu „w dół” wektora do przodu i ma oś Y wyrównaną z wektorem „w górę”. Jeśli wektor nie zostanie określony, zostanie użyty Vector3.up.

Obróć ten obiekt gry, aby spojrzeć na docelowy obiekt gry

// Find a game object in the scene named Target
public Transform target = GameObject.Find("Target").GetComponent<Transform>();

// We subtract our position from the target position to create a
// Vector that points from our position to the target position
// If we reverse the order, our rotation would be 180 degrees off.
Vector3 lookVector = target.position - transform.position;
Quaternion rotation = Quaternion.LookRotation(lookVector);
transform.rotation = rotation;


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow