mirror of
https://github.com/PrimeDecomp/prime.git
synced 2025-07-30 07:35:35 +00:00
26 lines
960 B
C++
26 lines
960 B
C++
#include "Kyoto/Math/CQuaternion.hpp"
|
|
|
|
#include "Kyoto/Math/CRelAngle.hpp"
|
|
#include "Kyoto/Math/CUnitVector3f.hpp"
|
|
#include "Kyoto/Streams/CInputStream.hpp"
|
|
|
|
const CQuaternion CQuaternion::sNoRotation = CQuaternion(1.f, CVector3f(0.f, 0.f, 0.f));
|
|
static const CVector3f XAxis(1.f, 0.f, 0.f);
|
|
static const CVector3f YAxis(0.f, 1.f, 0.f);
|
|
static const CVector3f ZAxis(0.f, 0.f, 1.f);
|
|
|
|
CQuaternion::CQuaternion(CInputStream& in) : w(in.ReadFloat()), imaginary(in) {}
|
|
|
|
CQuaternion CQuaternion::AxisAngle(const CUnitVector3f& axis, const CRelAngle& angle) {
|
|
double w = cos(angle.AsRadians() / 2.f);
|
|
CVector3f vec = axis * sine(angle / 2.f);
|
|
return CQuaternion(w, vec);
|
|
}
|
|
|
|
CQuaternion CQuaternion::operator*(const CQuaternion& rhs) const {
|
|
float w = this->w * rhs.w - CVector3f::Dot(imaginary, rhs.imaginary);
|
|
CVector3f imag =
|
|
rhs.w * imaginary + this->w * rhs.imaginary + CVector3f::Cross(imaginary, rhs.imaginary);
|
|
return CQuaternion(w, imag);
|
|
}
|