RoboidControl-cpp/Quaternion.h
2022-01-07 16:53:38 +01:00

95 lines
2.6 KiB
C++

#ifndef QUATERNION_H
#define QUATERNION_H
#pragma once
struct Vector3;
extern "C" {
typedef struct Quat {
float x;
float y;
float z;
float w;
} Quat;
void CopyQuat(const Quat& q1, Quat& q2);
}
/// <summary>
/// A quaternion
/// </summary>
struct Quaternion : Quat {
public:
/// <summary>
/// Create a new identity quaternion
/// </summary>
Quaternion();
/// <summary>
/// create a new quaternion with the given values
/// </summary>
/// <param name="_x">x axis value</param>
/// <param name="_y">y axis value</param>
/// <param name="_z">z axis value</param>
/// <param name="_w">w axis value</param>
Quaternion(float _x, float _y, float _z, float _w);
/// <summary>
/// Create a quaternion from C-style Quat
/// </summary>
/// <param name="q"></param>
Quaternion(Quat q);
~Quaternion();
/// <summary>
/// An identity quaternion
/// </summary>
const static Quaternion identity;
void Normalize();
static Quaternion Normalize(const Quaternion& q);
static void Normalize(const Quaternion& q, Quaternion& result);
static Vector3 ToAngles(const Quaternion& q1);
Vector3 operator *(const Vector3& p) const;
Quaternion operator *(const Quaternion& r2) const;
bool operator ==(const Quaternion& q);
static Quaternion Inverse(Quaternion r);
static Quaternion LookRotation(const Vector3& forward, const Vector3& upwards);
static Quaternion LookRotation(const Vector3& forward);
static Quaternion FromToRotation(Vector3 fromDirection, Vector3 toDirection);
static Quaternion RotateTowards(const Quaternion& from, const Quaternion& to, float maxDegreesDelta);
static Quaternion AngleAxis(float angle, const Vector3& axis);
void ToAngleAxis(float* angle, Vector3* axis);
static void ToAxisAngleRad(const Quaternion& q, Vector3* const axis, float* angle);
static float Angle(Quaternion a, Quaternion b);
static Quaternion Slerp(const Quaternion& a, const Quaternion& b, float t);
static Quaternion SlerpUnclamped(const Quaternion& a, const Quaternion& b, float t);
static Quaternion Euler(float x, float y, float z);
static Quaternion Euler(Vector3 euler);
static Quaternion FromEulerRad(Vector3 euler);
static float GetAngleAround(Vector3 axis, Quaternion rotation);
static Quaternion GetRotationAround(Vector3 axis, Quaternion rotation);
static void GetSwingTwist(Vector3 axis, Quaternion rotation, Quaternion* swing, Quaternion* twist);
protected:
float GetLength() const;
float GetLengthSquared() const;
static float GetLengthSquared(const Quaternion& q);
static float Dot(Quaternion a, Quaternion b);
public:
Vector3 xyz() const;
};
//#include "Vector3.h"
#endif