unity3d
quaternions
Zoeken…
Syntaxis
- Quaternion.LookRotation (Vector3 vooruit [, Vector3 omhoog]);
- Quaternion.AngleAxis (zwevende hoeken, Vector3 axisOfRotation);
- float angleBetween = Quaternion.Angle (Quaternion rotatie1, Quaternion rotatie2);
Inleiding tot Quaternion versus Euler
Euler-hoeken zijn "gradenhoeken" zoals 90, 180, 45, 30 graden. Quaternions verschillen van Euler-hoeken in die zin dat ze een punt op een eenheidsbol vertegenwoordigen (de straal is 1 eenheid). Je kunt deze bol beschouwen als een 3D-versie van de eenheidscirkel die je leert in trigonometrie. Quaternions verschillen van Euler-hoeken doordat ze denkbeeldige getallen gebruiken om een 3D-rotatie te definiëren.
Hoewel dit misschien ingewikkeld klinkt (en dat is het ook), heeft Unity geweldige ingebouwde functies waarmee je kunt schakelen tussen Euler-hoeken en quaterions, evenals functies om quaternions te wijzigen, zonder iets te weten over de wiskunde erachter.
Converteren tussen Euler en Quaternion
// 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;
Waarom een quaternion gebruiken?
Quaternions lossen een probleem op dat bekend staat als gimbal-vergrendeling. Dit gebeurt wanneer de primaire rotatieas collinear wordt met de tertiaire rotatieas. Hier is een visueel voorbeeld @ 2:09
Quaternion Look Rotation
Quaternion.LookRotation(Vector3 forward [, Vector3 up])
maakt een Quaternion-rotatie die vooruit kijkt naar beneden 'naar beneden' de voorwaartse vector en de Y-as heeft uitgelijnd met de 'omhoog' vector. Als de up-vector niet is opgegeven, wordt Vector3.up gebruikt.
Draai dit spelobject om naar een doelobject te kijken
// 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;