cesium-native/CesiumGeometry/src/IntersectionTests.cpp

34 lines
855 B
C++

#include "CesiumGeometry/IntersectionTests.h"
#include "CesiumGeometry/Plane.h"
#include "CesiumGeometry/Ray.h"
#include <CesiumUtility/Math.h>
#include <glm/geometric.hpp>
using namespace CesiumUtility;
namespace CesiumGeometry {
/*static*/ std::optional<glm::dvec3>
IntersectionTests::rayPlane(const Ray& ray, const Plane& plane) noexcept {
const double denominator = glm::dot(plane.getNormal(), ray.getDirection());
if (glm::abs(denominator) < Math::Epsilon15) {
// Ray is parallel to plane. The ray may be in the polygon's plane.
return std::optional<glm::dvec3>();
}
const double t =
(-plane.getDistance() - glm::dot(plane.getNormal(), ray.getOrigin())) /
denominator;
if (t < 0) {
return std::optional<glm::dvec3>();
}
return ray.getOrigin() + ray.getDirection() * t;
}
} // namespace CesiumGeometry