diff --git a/src/raymath.c b/src/raymath.c index df098c6a3..762474abf 100644 --- a/src/raymath.c +++ b/src/raymath.c @@ -131,6 +131,39 @@ void VectorScale(Vector3 *v, float scale) v->z *= scale; } +// Rotate vector by axis and angle from the global center +void VectorRotate(Vector3 *v, Vector3 axis, float angle) +{ + VectorNormalize(&axis); + + float a = angle * (PI / 180.0f); + float sina = sin(a); + float cosa = cos(a); + float cosb = 1.0f - cosa; + + float xrot = v->x * (axis.x * axis.x * cosb + cosa) + + v->y * (axis.x * axis.y * cosb - axis.z * sina) + + v->z * (axis.x * axis.z * cosb + axis.y * sina); + + float yrot = v->x * (axis.y * axis.x * cosb + axis.z * sina) + + v->y * (axis.y * axis.y * cosb + cosa) + + v->z * (axis.y * axis.z * cosb - axis.x * sina); + + float zrot = v->x * (axis.z * axis.x * cosb - axis.y * sina) + + v->y * (axis.z * axis.y * cosb + axis.x * sina) + + v->z * (axis.z * axis.z * cosb + cosa); + + *v = (Vector3){ xrot, yrot, zrot }; +} + +// Rotate vector by axis and angle around the pivot point +void VectorRotateAround(Vector3 *v, Vector3 pivot, Vector3 axis, float angle) +{ + *v = VectorSubtract(*v, pivot); + VectorRotate(v, axis, angle); + *v = VectorAdd(*v, pivot); +} + // Negate provided vector (invert direction) void VectorNegate(Vector3 *v) { diff --git a/src/raymath.h b/src/raymath.h index c8c1a26c3..a22a71d51 100644 --- a/src/raymath.h +++ b/src/raymath.h @@ -86,6 +86,8 @@ Vector3 VectorPerpendicular(Vector3 v); // Calculate one vector float VectorDotProduct(Vector3 v1, Vector3 v2); // Calculate two vectors dot product float VectorLength(const Vector3 v); // Calculate vector lenght void VectorScale(Vector3 *v, float scale); // Scale provided vector +void VectorRotate(Vector3 *v, Vector3 axis, float angle); // Rotate vector by axis and angle from the global center +void VectorRotateAround(Vector3 *v, Vector3 pivot, Vector3 axis, float angle); // Rotate vector by axis and angle around the pivot point void VectorNegate(Vector3 *v); // Negate provided vector (invert direction) void VectorNormalize(Vector3 *v); // Normalize provided vector float VectorDistance(Vector3 v1, Vector3 v2); // Calculate distance between two points