diff options
| author | victorfisac <victorfisac@gmail.com> | 2016-01-20 19:28:47 +0100 |
|---|---|---|
| committer | victorfisac <victorfisac@gmail.com> | 2016-01-20 19:28:47 +0100 |
| commit | fcd30c5649f28d0d9c867712898fc5537f176c85 (patch) | |
| tree | 24f49e90743eac576607c54c7e03b938960d02e6 /src/models.c | |
| parent | 8ae0da1fa1a9d462f95ee7cf02b0fc336c4a77df (diff) | |
| download | raylib-fcd30c5649f28d0d9c867712898fc5537f176c85.tar.gz raylib-fcd30c5649f28d0d9c867712898fc5537f176c85.zip | |
Added ray-sphere collision detection
Diffstat (limited to 'src/models.c')
| -rw-r--r-- | src/models.c | 37 |
1 files changed, 36 insertions, 1 deletions
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; } |
