ViewDesignEngine  3.1.0
高性能 CAD 计算几何引擎
ray_intersect.h
浏览该文件的文档.
1 
11 #pragma once
12 #include "vde/core/point.h"
13 #include "vde/core/line.h"
14 #include "vde/core/triangle.h"
15 #include "vde/core/aabb.h"
16 #include <optional>
17 #include <vector>
18 
19 namespace vde::collision {
20 using core::Point3D;
21 using core::Vector3D;
22 using core::Triangle3D;
23 using core::Ray3Dd;
24 using core::AABB3D;
25 
29 struct RayTriResult {
30  double t;
31  double u, v;
33 };
34 
64 std::optional<RayTriResult> ray_triangle_intersect(
65  const Point3D& origin, const Vector3D& dir, const Triangle3D& tri);
66 
76 inline std::optional<RayTriResult> ray_triangle_intersect(
77  const Ray3Dd& ray, const Triangle3D& tri) {
78  return ray_triangle_intersect(ray.origin(), ray.direction(), tri);
79 }
80 
99 bool ray_aabb_intersect(const Ray3Dd& ray, const AABB3D& box,
100  double& tmin_out, double& tmax_out);
101 
106  double t;
108 };
109 
129 std::optional<RaySphereResult> ray_sphere_intersect(
130  const Point3D& origin, const Vector3D& dir,
131  const Point3D& center, double radius);
132 
141 inline std::optional<RaySphereResult> ray_sphere_intersect(
142  const Ray3Dd& ray, const Point3D& center, double radius) {
143  return ray_sphere_intersect(ray.origin(), ray.direction(), center, radius);
144 }
145 
158 std::optional<double> ray_plane_intersect(
159  const Point3D& origin, const Vector3D& dir,
160  const Point3D& plane_point, const Vector3D& plane_normal);
161 
170 inline std::optional<double> ray_plane_intersect(
171  const Ray3Dd& ray, const Point3D& plane_point,
172  const Vector3D& plane_normal) {
173  return ray_plane_intersect(ray.origin(), ray.direction(),
174  plane_point, plane_normal);
175 }
176 
199 std::optional<RayTriResult> ray_mesh_intersect(
200  const Point3D& origin, const Vector3D& dir,
201  const std::vector<Triangle3D>& triangles);
202 
210 inline std::optional<RayTriResult> ray_mesh_intersect(
211  const Ray3Dd& ray, const std::vector<Triangle3D>& triangles) {
212  return ray_mesh_intersect(ray.origin(), ray.direction(), triangles);
213 }
214 
215 } // namespace vde::collision
std::optional< RayTriResult > ray_mesh_intersect(const Point3D &origin, const Vector3D &dir, const std::vector< Triangle3D > &triangles)
射线-网格求交(暴力遍历)
std::optional< double > ray_plane_intersect(const Point3D &origin, const Vector3D &dir, const Point3D &plane_point, const Vector3D &plane_normal)
射线-平面求交
bool ray_aabb_intersect(const Ray3Dd &ray, const AABB3D &box, double &tmin_out, double &tmax_out)
射线-AABB 求交(slab 方法)
std::optional< RayTriResult > ray_triangle_intersect(const Point3D &origin, const Vector3D &dir, const Triangle3D &tri)
射线-三角形求交(Möller-Trumbore 算法)
std::optional< RaySphereResult > ray_sphere_intersect(const Point3D &origin, const Vector3D &dir, const Point3D &center, double radius)
射线-球体求交(解析法)
Ray3D< double > Ray3Dd
双精度三维射线
Definition: line.h:141
Triangle< double > Triangle3D
双精度三维三角形
Definition: triangle.h:105
AABB< double > AABB3D
双精度三维包围盒
Definition: aabb.h:131
foundation::Vector3D Vector3D
双精度三维向量(重新导出)
Definition: point.h:49
foundation::Point3D Point3D
双精度三维点(重新导出)
Definition: point.h:31
double box(const Point3D &p, const Point3D &half_extents)
轴对齐立方体的 SDF
射线-球体求交结果
射线-三角形求交结果
Definition: ray_intersect.h:29