diff --git a/include/blitz/misc/Maths.h b/include/blitz/misc/Maths.h index 36dbf09..4e78b6d 100644 --- a/include/blitz/misc/Maths.h +++ b/include/blitz/misc/Maths.h @@ -131,5 +131,7 @@ Mat4f RotateZ(float angle); Mat4f Rotate(const Vec3f& angles); +Mat4f Rotate(float angle, Vec3f axis); + } // namespace maths } // namespace blitz diff --git a/src/blitz/misc/Maths.cpp b/src/blitz/misc/Maths.cpp index ddc4f34..7b4c9d1 100644 --- a/src/blitz/misc/Maths.cpp +++ b/src/blitz/misc/Maths.cpp @@ -133,5 +133,31 @@ Mat4f Rotate(const Vec3f& angle) { return maths::Dot(maths::Dot(RotateX(angle.x), RotateY(angle.y)), RotateZ(angle.z)); } +Mat4f Rotate(float angle, Vec3f axis) { + Mat4f mat{}; + axis = Normalize(axis); + + float cosine = std::cos(angle); + float sine = std::sin(angle); + + float oneminuscos = (1.0f - cosine); + + mat.at(0, 0) = cosine + axis.x * axis.x * oneminuscos; + mat.at(0, 1) = axis.x * axis.y * oneminuscos - axis.z * sine; + mat.at(0, 2) = axis.x * axis.z * oneminuscos + axis.y * sine; + + mat.at(1, 0) = axis.x * axis.y * oneminuscos + axis.z * sine; + mat.at(1, 1) = cosine + axis.y * axis.y * oneminuscos; + mat.at(1, 2) = axis.y * axis.z * oneminuscos - axis.x * sine; + + mat.at(2, 0) = axis.x * axis.z * oneminuscos - axis.y * sine; + mat.at(2, 1) = axis.y * axis.z * oneminuscos + axis.x * sine; + mat.at(2, 2) = cosine + axis.z * axis.z * oneminuscos; + + mat.at(3, 3) = 1.0f; + + return mat; +} + } // namespace maths } // namespace blitz