add Rotate function

This commit is contained in:
2024-01-27 18:34:14 +01:00
parent d57195cef2
commit 7cf93fa16f
2 changed files with 28 additions and 0 deletions

View File

@@ -131,5 +131,7 @@ Mat4f RotateZ(float angle);
Mat4f Rotate(const Vec3f& angles);
Mat4f Rotate(float angle, Vec3f axis);
} // namespace maths
} // namespace blitz

View File

@@ -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