RoboidControl for Arduino
Loading...
Searching...
No Matches
Quaternion.h
Go to the documentation of this file.
1// This Source Code Form is subject to the terms of the Mozilla Public
2// License, v. 2.0.If a copy of the MPL was not distributed with this
3// file, You can obtain one at https ://mozilla.org/MPL/2.0/.
4
5#ifndef QUATERNION_H
6#define QUATERNION_H
7
8#include "Vector3.h"
9
10extern "C" {
15typedef struct Quat {
19 float x;
23 float y;
27 float z;
31 float w;
33}
34
38struct Quaternion : Quat {
39 public:
43 Quaternion();
51 Quaternion(float _x, float _y, float _z, float _w);
58
62 const static Quaternion identity;
63
69 void Normalize();
77 static Quaternion Normalize(const Quaternion& q);
78
85 static Vector3 ToAngles(const Quaternion& q);
86
92 Vector3 operator*(const Vector3& vector) const;
100 Quaternion operator*(const Quaternion& rotation) const;
101
111 bool operator==(const Quaternion& quaternion);
112
118 static Quaternion Inverse(Quaternion quaternion);
119
126 static Quaternion LookRotation(const Vector3& forward,
127 const Vector3& upwards);
137 static Quaternion LookRotation(const Vector3& forward);
138
145 static Quaternion FromToRotation(Vector3 fromDirection, Vector3 toDirection);
146
154 static Quaternion RotateTowards(const Quaternion& from,
155 const Quaternion& to,
156 float maxDegreesDelta);
157
164 static Quaternion AngleAxis(float angle, const Vector3& axis);
170 void ToAngleAxis(float* angle, Vector3* axis);
171
179 static float Angle(Quaternion orientation1, Quaternion orientation2);
188 static Quaternion Slerp(const Quaternion& rotation1,
189 const Quaternion& rotation2,
190 float factor);
200 static Quaternion SlerpUnclamped(const Quaternion& rotation1,
201 const Quaternion& rotation2,
202 float factor);
203
212 static Quaternion Euler(float x, float y, float z);
219 static Quaternion Euler(Vector3 eulerAngles);
220
229 static Quaternion EulerXYZ(float x, float y, float z);
236 static Quaternion EulerXYZ(Vector3 eulerAngles);
237
244 static float GetAngleAround(Vector3 axis, Quaternion rotation);
251 static Quaternion GetRotationAround(Vector3 axis, Quaternion rotation);
260 static void GetSwingTwist(Vector3 axis,
261 Quaternion rotation,
262 Quaternion* swing,
263 Quaternion* twist);
264
271 static float Dot(Quaternion rotation1, Quaternion rotation2);
272
273 private:
274 float GetLength() const;
275 float GetLengthSquared() const;
276 static float GetLengthSquared(const Quaternion& q);
277
278 void ToAxisAngleRad(const Quaternion& q, Vector3* const axis, float* angle);
279 static Quaternion FromEulerRad(Vector3 euler);
280 static Quaternion FromEulerRadXYZ(Vector3 euler);
281
282 Vector3 xyz() const;
283};
284
285#endif
Definition Angle.h:8
A quaternion.
Definition Quaternion.h:15
float x
The x component.
Definition Quaternion.h:19
float z
The z component.
Definition Quaternion.h:27
float y
The y component.
Definition Quaternion.h:23
float w
The w component.
Definition Quaternion.h:31
A quaternion.
Definition Quaternion.h:38
static Quaternion Inverse(Quaternion quaternion)
The inverse of quaterion.
Definition Quaternion.cpp:134
static Quaternion GetRotationAround(Vector3 axis, Quaternion rotation)
Returns the rotation limited around the given axis.
Definition Quaternion.cpp:393
static Quaternion AngleAxis(float angle, const Vector3 &axis)
Convert an angle/axis representation to a quaternion.
Definition Quaternion.cpp:215
static Quaternion EulerXYZ(float x, float y, float z)
Create a rotation from euler angles.
Definition Quaternion.cpp:349
static void GetSwingTwist(Vector3 axis, Quaternion rotation, Quaternion *swing, Quaternion *twist)
Swing-twist decomposition of a rotation.
Definition Quaternion.cpp:402
static Vector3 ToAngles(const Quaternion &q)
Convert to euler angles.
Definition Quaternion.cpp:79
static Quaternion FromToRotation(Vector3 fromDirection, Vector3 toDirection)
Calculat the rotation from on vector to another.
Definition Quaternion.cpp:195
void Normalize()
Convert to unit quaternion.
Definition Quaternion.cpp:60
~Quaternion()
Definition Quaternion.cpp:41
void ToAngleAxis(float *angle, Vector3 *axis)
Convert this quaternion to angle/axis representation.
Definition Quaternion.cpp:237
static float GetAngleAround(Vector3 axis, Quaternion rotation)
Returns the angle of around the give axis for a rotation.
Definition Quaternion.cpp:380
static const Quaternion identity
An identity quaternion.
Definition Quaternion.h:62
static Quaternion SlerpUnclamped(const Quaternion &rotation1, const Quaternion &rotation2, float factor)
Unclamped sherical lerp between two rotations.
Definition Quaternion.cpp:256
static Quaternion LookRotation(const Vector3 &forward, const Vector3 &upwards)
A rotation which looks in the given direction.
Definition Quaternion.cpp:143
Quaternion()
Create a new identity quaternion.
Definition Quaternion.cpp:20
Vector3 operator*(const Vector3 &vector) const
Rotate a vector using this quaterion.
Definition Quaternion.cpp:107
static Quaternion Slerp(const Quaternion &rotation1, const Quaternion &rotation2, float factor)
Sherical lerp between two rotations.
Definition Quaternion.cpp:307
bool operator==(const Quaternion &quaternion)
Check the equality of two quaternions.
Definition Quaternion.cpp:130
static float Dot(Quaternion rotation1, Quaternion rotation2)
Calculate the dot product of two quaternions.
Definition Quaternion.cpp:75
static Quaternion Euler(float x, float y, float z)
Create a rotation from euler angles.
Definition Quaternion.cpp:317
static Quaternion RotateTowards(const Quaternion &from, const Quaternion &to, float maxDegreesDelta)
Rotate form one orientation to anther with a maximum amount of degrees.
Definition Quaternion.cpp:204
A 3-dimensional vector.
Definition Vector3.h:35