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

76 lines
2.1 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:
Quaternion();
Quaternion(float _x, float _y, float _z, float _w);
Quaternion(Vector3 _xyz, float _w);
Quaternion(Quat q);
~Quaternion();
const static Quaternion identity;
float GetLength() const;
float GetLengthSquared() const;
static float GetLengthSquared(const Quaternion& q);
void Normalize();
static Quaternion Normalize(const Quaternion& q);
static void Normalize(const Quaternion& q, Quaternion& result);
static float Dot(Quaternion a, Quaternion b);
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);
public:
Vector3 xyz() const;
};
//#include "Vector3.h"
#endif