PeriDyno 1.0.0
Loading...
Searching...
No Matches
PrimitiveSweep3D.inl
Go to the documentation of this file.
1//#include "Primitive3D.h"
2#include "Complex.h"
3
4#include "CCD/TightCCD.h"
5
6
7namespace dyno
8{
9 template<typename Real>
11 {
12 start_point = start;
13 end_point = end;
14 }
15
16
17 template<typename Real>
19 {
20 start_point = point_sweep.start_point;
21 end_point = point_sweep.end_point;
22 }
23
24 template<typename Real>
25 DYN_FUNC bool TPointSweep3D<Real>::intersect(const TTriangleSweep3D<Real>& triangle_sweep, typename TTriangle3D<Real>::Param& baryc, Real& t, const Real threshold) const
26 {
27 bool collided = TightCCD<Real>::VertexFaceCCD(
28 start_point.origin, triangle_sweep.start_triangle.v[0], triangle_sweep.start_triangle.v[1], triangle_sweep.start_triangle.v[2],
29 end_point.origin, triangle_sweep.end_triangle.v[0], triangle_sweep.end_triangle.v[1], triangle_sweep.end_triangle.v[2],
30 t);
31
32 //check whether the intersection point lies inside the triangle
33 if (collided)
34 {
35 Point3D p_ret = interpolate(t);
36 Triangle3D tri_ret = triangle_sweep.interpolate(t);
37
38 typename TTriangle3D<Real>::Param baryParam;
39 bool bValid = tri_ret.computeBarycentrics(p_ret.origin, baryParam);
40 Real dist = glm::abs(p_ret.distance(tri_ret));
41 bool bIntersected = baryParam.u >= Real(0) & baryParam.u <= Real(1) + threshold & baryParam.v >= Real(0) - threshold & baryParam.v <= Real(1) + threshold & baryParam.w >= Real(0) - threshold & baryParam.w <= Real(1) + threshold;
42 if (bValid && bIntersected)
43 {
44
45 baryc.u = max(Real(0), min(baryParam.u, Real(1)));
46 baryc.v = max(Real(0), min(baryParam.v, Real(1)));
47 baryc.w = max(Real(0), min(baryParam.w, Real(1)));
48
49 return true;
50 }
51 else
52 return false;
53 }
54
55 return true;
56 }
57
58 template<typename Real>
60 {
62 point.origin = (1 - t)*start_point.origin + t * end_point.origin;
63
64 return point;
65 }
66
67
68 template<typename Real>
70 {
71 start_triangle = start;
72 end_triangle = end;
73 }
74
75
76 template<typename Real>
78 {
79 start_triangle = triangle_sweep.start_triangle;
80 end_triangle = triangle_sweep.end_triangle;
81 }
82
83
84 template<typename Real>
86 {
87 Real t0 = t;
88 Real t1 = 1 - t;
89
90 TTriangle3D<Real> triangle;
91 triangle.v[0] = t1 * start_triangle.v[0] + t0 * end_triangle.v[0];
92 triangle.v[1] = t1 * start_triangle.v[1] + t0 * end_triangle.v[1];
93 triangle.v[2] = t1 * start_triangle.v[2] + t0 * end_triangle.v[2];
94
95 return triangle;
96 }
97
98}
double Real
Definition Typedef.inl:23
0D geometric primitive in three-dimensional space
DYN_FUNC Real distance(const TPoint3D< Real > &pt) const
DYN_FUNC TPointSweep3D(TPoint3D< Real > &start, TPoint3D< Real > &end)
TPoint3D< Real > end_point
DYN_FUNC bool intersect(const TTriangleSweep3D< Real > &triangle_sweep, typename TTriangle3D< Real >::Param &baryc, Real &t, const Real threshold=Real(0.00001)) const
Calculate the possible intersection for a moving point and a moving triangle. We assume both the poin...
TPoint3D< Real > start_point
DYN_FUNC TPoint3D< double > interpolate(double t) const
DYN_FUNC bool computeBarycentrics(const Coord3D &p, Param &bary) const
DYN_FUNC TTriangleSweep3D(TTriangle3D< Real > &start, TTriangle3D< Real > &end)
TTriangle3D< Real > end_triangle
TTriangle3D< Real > start_triangle
DYN_FUNC TTriangle3D< Real > interpolate(Real t) const
Return the intermediate state for a triangle.
static DYN_FUNC bool VertexFaceCCD(const Vector< T, 3 > &p0, const Vector< T, 3 > &a0, const Vector< T, 3 > &b0, const Vector< T, 3 > &c0, const Vector< T, 3 > &p1, const Vector< T, 3 > &a1, const Vector< T, 3 > &b1, const Vector< T, 3 > &c1, T &time)
Do a continuous collision detection between a vertex and a triangle.
Definition TightCCD.inl:223
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
TTriangle3D< double > Triangle3D
TPoint3D< double > Point3D
#define max(x, y)
Definition svd3_cuda.h:41