Added ray-sphere collision detection
This commit is contained in:
parent
8ae0da1fa1
commit
fcd30c5649
2 changed files with 38 additions and 1 deletions
37
src/models.c
37
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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue