34 lines
855 B
C++
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
|