From 659f83c800fb980b5c137e027dde3a099ab1a6d7 Mon Sep 17 00:00:00 2001 From: Daniel Karbach Date: Mon, 18 Dec 2017 09:51:48 +0100 Subject: [PATCH] test ray/sphere intersect --- tst/math/IntersectTest.cpp | 66 ++++++++++++++++++++++++++++++++++++++ tst/math/IntersectTest.hpp | 2 ++ 2 files changed, 68 insertions(+) diff --git a/tst/math/IntersectTest.cpp b/tst/math/IntersectTest.cpp index 2ed07fb..cd50845 100644 --- a/tst/math/IntersectTest.cpp +++ b/tst/math/IntersectTest.cpp @@ -223,6 +223,72 @@ void IntersectTest::testBoxBoxIntersection() { ); } +void IntersectTest::testRaySphereIntersection() { + const double epsilon = std::numeric_limits::epsilon(); + Ray ray{ { 0.0, 0.0, 0.0 }, { 1.0, 0.0, 0.0 } }; // at origin, pointing right + Sphere sphere{ { 0.0, 0.0, 0.0 }, 1.0 }; // unit sphere at origin + + glm::dvec3 normal(0.0); + double dist = 0.0; + CPPUNIT_ASSERT_MESSAGE( + "ray at origin does not intersect sphere at origin", + Intersect(ray, sphere, normal, dist) + ); + CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( + "distance along ray to unit sphere, both at origin, is not 1", + 1.0, dist, epsilon + ); + AssertEqual( + "bad intersection normal", + glm::dvec3(1.0, 0.0, 0.0), normal + ); + + ray.Origin({ 2.0, 0.0, 0.0 }); // move outside + CPPUNIT_ASSERT_MESSAGE( + "ray pointing away from sphere intersects it for some reason", + !Intersect(ray, sphere, normal, dist) + ); + + ray.Direction({ -1.0, 0.0, 0.0 }); // flip it around + CPPUNIT_ASSERT_MESSAGE( + "negative X ray does not intersect sphere", + Intersect(ray, sphere, normal, dist) + ); + CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( + "distance along ray to unit sphere at origin is not 1", + 1.0, dist, epsilon + ); + AssertEqual( + "bad intersection normal", + glm::dvec3(1.0, 0.0, 0.0), normal + ); + + // sphere at 3,0,0; ray at 0,4,0 pointing directly at it + // should be 5 units apart, minus one for the radius + ray.Origin({ 0.0, 4.0, 0.0 }); + ray.Direction(glm::normalize(glm::dvec3(3.0, -4.0, 0.0))); + sphere.origin = { 3.0, 0.0, 0.0 }; + CPPUNIT_ASSERT_MESSAGE( + "diagonal ray does not intersect sphere", + Intersect(ray, sphere, normal, dist) + ); + CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( + "distance along ray to unit sphere is not 4", + 4.0, dist, epsilon + ); + AssertEqual( + "bad intersection normal", + glm::normalize(glm::dvec3(-3.0, 4.0, 0.0)), normal + ); + + // point the ray straight down, so it misses + ray.Direction({ 0.0, -1.0, 0.0}); + CPPUNIT_ASSERT_MESSAGE( + "vertical ray should not intersect sphere", + !Intersect(ray, sphere, normal, dist) + ); +} + } } } diff --git a/tst/math/IntersectTest.hpp b/tst/math/IntersectTest.hpp index 13ac134..85d88fa 100644 --- a/tst/math/IntersectTest.hpp +++ b/tst/math/IntersectTest.hpp @@ -15,6 +15,7 @@ CPPUNIT_TEST_SUITE(IntersectTest); CPPUNIT_TEST(testRayBoxIntersection); CPPUNIT_TEST(testBoxBoxIntersection); +CPPUNIT_TEST(testRaySphereIntersection); CPPUNIT_TEST_SUITE_END(); @@ -24,6 +25,7 @@ public: void testRayBoxIntersection(); void testBoxBoxIntersection(); + void testRaySphereIntersection(); }; -- 2.39.2