diff --git a/examples/models/models_mesh_picking.c b/examples/models/models_mesh_picking.c index 8103a5cf1..ff19e6ad3 100644 --- a/examples/models/models_mesh_picking.c +++ b/examples/models/models_mesh_picking.c @@ -42,6 +42,12 @@ int main(void) Vector3 towerPos = { 0.0f, 0.0f, 0.0f }; // Set model position BoundingBox towerBBox = GetMeshBoundingBox(tower.meshes[0]); // Get mesh bounding box + // Ground quad + Vector3 g0 = (Vector3){ -50.0f, 0.0f, -50.0f }; + Vector3 g1 = (Vector3){ -50.0f, 0.0f, 50.0f }; + Vector3 g2 = (Vector3){ 50.0f, 0.0f, 50.0f }; + Vector3 g3 = (Vector3){ 50.0f, 0.0f, -50.0f }; + // Test triangle Vector3 ta = (Vector3){ -25.0f, 0.5f, 0.0f }; Vector3 tb = (Vector3){ -4.0f, 2.5f, 1.0f }; @@ -75,14 +81,15 @@ int main(void) ray = GetMouseRay(GetMousePosition(), camera); // Check ray collision against ground plane - /*RayCollision groundHitInfo = GetCollisionRayQuad(ray, 0.0f); + RayCollision groundHitInfo = GetRayCollisionQuad(ray, g0, g1, g2, g3); + DrawPoint3D(g0, RED); if ((groundHitInfo.hit) && (groundHitInfo.distance < nearestHit.distance)) { nearestHit = groundHitInfo; cursorColor = GREEN; hitObjectName = "Ground"; - }*/ + } // Check ray collision against test triangle RayCollision triHitInfo = GetRayCollisionTriangle(ray, ta, tb, tc); diff --git a/src/models.c b/src/models.c index acf30ebac..29ba5f776 100644 --- a/src/models.c +++ b/src/models.c @@ -3019,11 +3019,12 @@ RayCollision GetRayCollisionBox(Ray ray, BoundingBox box) RayCollision result = { 0 }; // Note: If ray.position is inside the box, the distance is negative (as if the ray was reversed) - // Reversing ray.direction before will give use the correct result. + // Reversing ray.direction will give use the correct result. bool insideBox = ray.position.x > box.min.x && ray.position.x < box.max.x && ray.position.y > box.min.y && ray.position.y < box.max.y && ray.position.z > box.min.z && ray.position.z < box.max.z; + if (insideBox) { ray.direction = Vector3Negate(ray.direction); } @@ -3140,6 +3141,7 @@ RayCollision GetRayCollisionModel(Ray ray, Model model) } // Get collision info between ray and triangle +// NOTE: The points are expected to be in counter-clockwise winding // NOTE: Based on https://en.wikipedia.org/wiki/M%C3%B6ller%E2%80%93Trumbore_intersection_algorithm RayCollision GetRayCollisionTriangle(Ray ray, Vector3 p1, Vector3 p2, Vector3 p3) { @@ -3197,26 +3199,14 @@ RayCollision GetRayCollisionTriangle(Ray ray, Vector3 p1, Vector3 p2, Vector3 p3 return result; } -// Get collision info between ray and ground plane (Y-normal plane) -RayCollision GetRayCollisionGround(Ray ray, float groundHeight) -{ - #define EPSILON 0.000001 // A small number - +// Get collision info between ray and quad +// NOTE: The points are expected to be in counter-clockwise winding +RayCollision GetRayCollisionQuad(Ray ray, Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4) { RayCollision result = { 0 }; - if (fabsf(ray.direction.y) > EPSILON) - { - float distance = (ray.position.y - groundHeight)/-ray.direction.y; + result = GetRayCollisionTriangle(ray, p1, p2, p4); - if (distance >= 0.0) - { - result.hit = true; - result.distance = distance; - result.normal = (Vector3){ 0.0, 1.0, 0.0 }; - result.point = Vector3Add(ray.position, Vector3Scale(ray.direction, distance)); - result.point.y = groundHeight; - } - } + if (!result.hit) result = GetRayCollisionTriangle(ray, p2, p3, p4); return result; }