From fcd30c5649f28d0d9c867712898fc5537f176c85 Mon Sep 17 00:00:00 2001 From: victorfisac Date: Wed, 20 Jan 2016 19:28:47 +0100 Subject: Added ray-sphere collision detection --- src/models.c | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) (limited to 'src/models.c') diff --git a/src/models.c b/src/models.c index 3d228a30..80d9a13a 100644 --- a/src/models.c +++ b/src/models.c @@ -1341,7 +1341,42 @@ bool CheckCollisionRaySphere(Ray ray, Vector3 spherePosition, float sphereRadius { bool collision = false; - // TODO: implement collision... + Vector3 raySpherePos = VectorSubtract(spherePosition, ray.position); + float distance = VectorLength(raySpherePos); + float vector = VectorDotProduct(raySpherePos, ray.direction); + float d = sphereRadius*sphereRadius - (distance*distance - vector*vector); + + if(d >= 0.0f) collision = true; + + return collision; +} + +// Detect collision between ray and sphere with extended parameters and collision point detection +bool CheckCollisionRaySphereEx(Ray ray, Vector3 spherePosition, float sphereRadius, Vector3 *collisionPoint) +{ + bool collision = false; + + Vector3 raySpherePos = VectorSubtract(spherePosition, ray.position); + float distance = VectorLength(raySpherePos); + float vector = VectorDotProduct(raySpherePos, ray.direction); + float d = sphereRadius*sphereRadius - (distance*distance - vector*vector); + + if(d >= 0.0f) collision = true; + + // Calculate collision point + Vector3 offset = ray.direction; + float collisionDistance = 0; + + // Check if ray origin is inside the sphere to calculate the correct collision point + if(distance < sphereRadius) collisionDistance = vector + sqrt(d); + else collisionDistance = vector - sqrt(d); + + VectorScale(&offset, collisionDistance); + Vector3 cPoint = VectorAdd(ray.position, offset); + + collisionPoint->x = cPoint.x; + collisionPoint->y = cPoint.y; + collisionPoint->z = cPoint.z; return collision; } -- cgit v1.2.3