aboutsummaryrefslogtreecommitdiff
path: root/src/models.c
diff options
context:
space:
mode:
authorvictorfisac <victorfisac@gmail.com>2016-01-20 16:01:59 +0100
committervictorfisac <victorfisac@gmail.com>2016-01-20 16:01:59 +0100
commit423a45ac85c64c578e15a6672bff3ae17c2be44a (patch)
treedd1dc073a44e7ed51bafa3ba77cf90f2bb6d76f0 /src/models.c
parentdc385ba4ec546b797866c3bde6a2490ad8245696 (diff)
downloadraylib-423a45ac85c64c578e15a6672bff3ae17c2be44a.tar.gz
raylib-423a45ac85c64c578e15a6672bff3ae17c2be44a.zip
Added ray-sphere collision detection
- Added simple ray-sphere collision detection. - Added extra function with extended parameters to obtain collision point vector. - Fixed bounding box calculations init values (were causing compiling errors).
Diffstat (limited to 'src/models.c')
-rw-r--r--src/models.c41
1 files changed, 38 insertions, 3 deletions
diff --git a/src/models.c b/src/models.c
index 06044820..daa05b1a 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;
}
@@ -1373,8 +1408,8 @@ bool CheckCollisionRayBox(Ray ray, Vector3 minBBox, Vector3 maxBBox)
BoundingBox CalculateBoundingBox(Mesh mesh)
{
// Get min and max vertex to construct bounds (AABB)
- Vector3 minVertex = mesh.vertices[0];
- Vector3 maxVertex = mesh.vertices[0];
+ Vector3 minVertex = {mesh.vertices[0], mesh.vertices[1], mesh.vertices[2]};
+ Vector3 maxVertex = {mesh.vertices[0], mesh.vertices[1], mesh.vertices[2]};
for (int i = 1; i < mesh.vertexCount; i++)
{