PeriDyno 1.0.0
Loading...
Searching...
No Matches
CollisionDetectionAlgorithm.h
Go to the documentation of this file.
1#pragma once
2
3#include "CollisionData.h"
4
5namespace dyno
6{
16
17 template<typename Real>
19 {
27
28
33 int separation_flag = 0; // [0 A-B, 1 B-A]
34
35 public:
36 DYN_FUNC void reverse() { separation_flag = 1 - separation_flag; }
37
38 DYN_FUNC Real depth() { return separation_distance; }
40 DYN_FUNC SeparationType type() { return separation_type; }
41 DYN_FUNC SeparationType face() { return SeparationType(int(separation_type) ^ separation_flag); } // 0: A, 1: B
42
43 DYN_FUNC Vector<Real, 3> point(int i) { return separation_point[i]; }
48
49 DYN_FUNC void update(SeparationType type, Real BoundaryA, Real BoundaryB, Real Depth, Vec3f N, Vec3f a0, Vec3f a1, Vec3f a2 = Vec3f(0.), Vec3f a3 = Vec3f(0.))
50 {
51 N = ((BoundaryA < BoundaryB) ^ (isless(Depth, 0.f))) ? N : -N; // [Question: why -N]
52 if (!isless(Depth, 0.f))
53 {
54 separation_distance = Depth;
56 }
57 else if (isgreat(Depth, separation_distance))
58 {
60 separation_distance = Depth;
62 separation_point[0] = a0;
63 separation_point[1] = a1;
64 separation_point[2] = a2;
65 separation_point[3] = a3;
66 }
67 }
68 };
69
70 template<typename Real>
72 {
73 public:
84
87
88 //--------------------------------------------------------------------------------------------------
89 // Minkowski Sum + Separating Axis Theorem for Round Primitives
90 // Round Primitive : [Sphere, Capsule(Segment), Triangle, Tetrahedron, Box]
91
92 // MSDF(A, B) : Minkowski Sum Signed Distance Function, return the depth and normal on B's boundary.
93 // request(A, B) : Generate contact points, depth and normal on B's boundary.
94
95 // [Sphere - Sphere]
96 DYN_FUNC static void MSDF(SeparationData& sat, const Sphere3D& sphereA, const Sphere3D& sphereB, const Real radiusA, const Real radiusB);
97 DYN_FUNC static void request(Manifold& m, const Sphere3D& sphereA, const Sphere3D& sphereB, const Real radiusA, const Real radiusB);
98
99 // [Seg - Sphere]
100 DYN_FUNC static void MSDF(SeparationData& sat, const Segment3D& segA, const Sphere3D& sphereB, const Real radiusA, const Real radiusB);
101 DYN_FUNC static void request(Manifold& m, const Segment3D& segA, const Sphere3D& sphereB, const Real radiusA, const Real radiusB);
102 DYN_FUNC static void request(Manifold& m, const Sphere3D& sphereA, const Segment3D& segB, const Real radiusA, const Real radiusB);
103
104 // [Tri - Sphere]
105 DYN_FUNC static void MSDF(SeparationData& sat, const Triangle3D& triA, const Sphere3D& sphereB, const Real radiusA, const Real radiusB);
106 DYN_FUNC static void request(Manifold& m, const Triangle3D& triA, const Sphere3D& sphereB, const Real radiusA, const Real radiusB);
107 DYN_FUNC static void request(Manifold& m, const Sphere3D& sphereA, const Triangle3D& triB, const Real radiusA, const Real radiusB);
108
109 // [Tet - Sphere]
110 DYN_FUNC static void MSDF(SeparationData& sat, const Tet3D& tetA, const Sphere3D& sphereB, const Real radiusA, const Real radiusB);
111 DYN_FUNC static void request(Manifold& m, const Tet3D& tetA, const Sphere3D& sphereB, const Real radiusA, const Real radiusB);
112 DYN_FUNC static void request(Manifold& m, const Sphere3D& sphereA, const Tet3D& tetB, const Real radiusA, const Real radiusB);
113
114 // [Box - Sphere]
115 DYN_FUNC static void MSDF(SeparationData& sat, const OBox3D& boxA, const Sphere3D& sphereB, const Real radiusA, const Real radiusB);
116 DYN_FUNC static void request(Manifold& m, const OBox3D& boxA, const Sphere3D& sphereB, const Real radiusA, const Real radiusB);
117 DYN_FUNC static void request(Manifold& m, const Sphere3D& sphereA, const OBox3D& boxB, const Real radiusA, const Real radiusB);
118
119
120 // [Seg - Seg]
121 DYN_FUNC static void MSDF(SeparationData& sat, const Segment3D& segA, const Segment3D& segB, const Real radiusA, const Real radiusB);
122 DYN_FUNC static void request(Manifold& m, const Segment3D& segA, const Segment3D& segB, const Real radiusA, const Real radiusB);
123
124 // [Tri - Seg]
125 DYN_FUNC static void MSDF(SeparationData& sat, const Triangle3D& triA, const Segment3D& segB, const Real radiusA, const Real radiusB);
126 DYN_FUNC static void request(Manifold& m, const Triangle3D& triA, const Segment3D& segB, const Real radiusA, const Real radiusB);
127 DYN_FUNC static void request(Manifold& m, const Segment3D& segA, const Triangle3D& triB, const Real radiusA, const Real radiusB);
128
129 // [Tet- Seg]
130 DYN_FUNC static void MSDF(SeparationData& sat, const Tet3D& tetA, const Segment3D& segB, const Real radiusA, const Real radiusB);
131 DYN_FUNC static void request(Manifold& m, const Tet3D& tetA, const Segment3D& segB, const Real radiusA, const Real radiusB);
132 DYN_FUNC static void request(Manifold& m, const Segment3D& segA, const Tet3D& tetB, const Real radiusA, const Real radiusB);
133
134 // [Box - Seg]
135 DYN_FUNC static void MSDF(SeparationData& sat, const OBox3D& boxA, const Segment3D& segB, const Real radiusA, const Real radiusB);
136 DYN_FUNC static void request(Manifold& m, const OBox3D& boxA, const Segment3D& segB, const Real radiusA, const Real radiusB);
137 DYN_FUNC static void request(Manifold& m, const Segment3D& segA, const OBox3D& boxB, const Real radiusA, const Real radiusB);
138
139
140 // [Tri - Tri]
141 DYN_FUNC static void MSDF(SeparationData& sat, const Triangle3D& triA, const Triangle3D& triB, const Real radiusA, const Real radiusB);
142 DYN_FUNC static void request(Manifold& m, const Triangle3D& triA, const Triangle3D& triB, const Real radiusA, const Real radiusB);
143
144 // [Tet - Tri]
145 DYN_FUNC static void MSDF(SeparationData& sat, const Tet3D& tetA, const Triangle3D& triB, const Real radiusA, const Real radiusB);
146 DYN_FUNC static void request(Manifold& m, const Tet3D& tetA, const Triangle3D& triB, const Real radiusA, const Real radiusB);
147 DYN_FUNC static void request(Manifold& m, const Triangle3D& triA, const Tet3D& tetB, const Real radiusA, const Real radiusB);
148
149 // [Box - Tri]
150 DYN_FUNC static void MSDF(SeparationData& sat, const OBox3D& boxA, const Triangle3D& triB, const Real radiusA, const Real radiusB);
151 DYN_FUNC static void request(Manifold& m, const OBox3D& boxA, const Triangle3D& triB, const Real radiusA, const Real radiusB);
152 DYN_FUNC static void request(Manifold& m, const Triangle3D& triA, const OBox3D& boxB, const Real radiusA, const Real radiusB);
153
154
155 // [Tet - Tet]
156 DYN_FUNC static void MSDF(SeparationData& sat, const Tet3D& tetA, const Tet3D& tetB, const Real radiusA, const Real radiusB);
157 DYN_FUNC static void request(Manifold& m, const Tet3D& tetA, const Tet3D& tetB, const Real radiusA, const Real radiusB);
158
159 // [Box - Tet]
160 DYN_FUNC static void MSDF(SeparationData& sat, const OBox3D& boxA, const Tet3D& tetB, const Real radiusA, const Real radiusB);
161 DYN_FUNC static void request(Manifold& m, const OBox3D& boxA, const Tet3D& tetB, const Real radiusA, const Real radiusB);
162 DYN_FUNC static void request(Manifold& m, const Tet3D& tetA, const OBox3D& boxB, const Real radiusA, const Real radiusB);
163
164
165 // [Box - Box]
166 DYN_FUNC static void MSDF(SeparationData& sat, const OBox3D& boxA, const OBox3D& boxB, const Real radiusA, const Real radiusB);
167 DYN_FUNC static void request(Manifold& m, const OBox3D& boxA, const OBox3D& boxB, const Real radiusA, const Real radiusB);
168
169
170 //--------------------------------------------------------------------------------------------------
171 // Resources:
172 // https://box2d.googlecode.com/files/GDC2007_ErinCatto.zip
173 // https://box2d.googlecode.com/files/Box2D_Lite.zip
174 DYN_FUNC static void request(Manifold& m, const OBox3D box0, const OBox3D box1);
175
176 DYN_FUNC static void request(Manifold& m, const Sphere3D& sphere, const OBox3D& box);
177 DYN_FUNC static void request(Manifold& m, const OBox3D& box, const Sphere3D& sphere);
178
179 DYN_FUNC static void request(Manifold& m, const Sphere3D& sphere0, const Sphere3D& sphere1);
180
181 DYN_FUNC static void request(Manifold& m, const Tet3D& tet0, const Tet3D& tet1);
182
183 DYN_FUNC static void request(Manifold& m, const Tet3D& tet, const OBox3D& box);
184 DYN_FUNC static void request(Manifold& m, const OBox3D& box, const Tet3D& tet);
185
186 DYN_FUNC static void request(Manifold& m, const Sphere3D& sphere, const Tet3D& tet);
187 DYN_FUNC static void request(Manifold& m, const Tet3D& tet, const Sphere3D& sphere);
188
189 DYN_FUNC static void request(Manifold& m, const Sphere3D& sphere, const Capsule3D& cap);
190 DYN_FUNC static void request(Manifold& m, const Capsule3D& cap, const Sphere3D& sphere);
191
192 //=========================================
193 DYN_FUNC static void request(Manifold& m, const Capsule3D& cap0, const Capsule3D& cap1);//untested
194
195 DYN_FUNC static void request(Manifold& m, const Sphere3D& sphere, const Triangle3D& tri);//untested
196 DYN_FUNC static void request(Manifold& m, const Triangle3D& tri, const Sphere3D& sphere);//untested
197
198
199 DYN_FUNC static void request(Manifold& m, const Triangle3D& tri, const Capsule3D cap); //untested
200
201 DYN_FUNC static void request(Manifold& m, const Capsule3D& cap, const Tet3D& tet);//untested
202 DYN_FUNC static void request(Manifold& m, const Tet3D& tet, const Capsule3D& cap);//untested
203
204 DYN_FUNC static void request(Manifold& m, const Capsule3D& cap, const OBox3D& box);//untested
205 DYN_FUNC static void request(Manifold& m, const OBox3D& box, const Capsule3D& cap);//untested
206
207 DYN_FUNC static void request(Manifold& m, const Tet3D& tet, const Triangle3D& tri);
208
209 DYN_FUNC static void request(Manifold& m, const Triangle3D& tri, const Tet3D& tet);
210
211 DYN_FUNC static void request(Manifold& m, const OBox3D& box, const Triangle3D& tri);//unfinished
212
213 //=========================================
214
215
216 private:
217
218
219 };
220}
221
double Real
Definition Typedef.inl:23
TSeparationData< Real > SeparationData
static DYN_FUNC void request(Manifold &m, const Triangle3D &tri, const Capsule3D cap)
static DYN_FUNC void MSDF(SeparationData &sat, const Sphere3D &sphereA, const Sphere3D &sphereB, const Real radiusA, const Real radiusB)
static DYN_FUNC void request(Manifold &m, const Sphere3D &sphereA, const Sphere3D &sphereB, const Real radiusA, const Real radiusB)
static DYN_FUNC void request(Manifold &m, const OBox3D &box, const Triangle3D &tri)
DYN_FUNC Vector< Real, 3 > pointA()
Vector< Real, 3 > separation_point[4]
DYN_FUNC Vector< Real, 3 > pointB()
DYN_FUNC SeparationType face()
DYN_FUNC SeparationType type()
DYN_FUNC void update(SeparationType type, Real BoundaryA, Real BoundaryB, Real Depth, Vec3f N, Vec3f a0, Vec3f a1, Vec3f a2=Vec3f(0.), Vec3f a3=Vec3f(0.))
DYN_FUNC Vector< Real, 3 > normal()
DYN_FUNC Vector< Real, 3 > point(int i)
3D geometric primitives in three-dimensional space
vertices are ordered so that the normal vectors for the triangular faces point outwards 3 / | \ 0 - 2...
#define N(x, y, z)
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
DYN_FUNC int isless(T const &a, T const &b, T const EPS=EPSILON)
Definition SimpleMath.h:13
Vector< float, 2 > Vec2f
Definition Vector2D.h:81
Vector< float, 3 > Vec3f
Definition Vector3D.h:93
DYN_FUNC int isgreat(T const &a, T const &b, T const EPS=EPSILON)
Definition SimpleMath.h:23
constexpr Real REAL_INF
Definition Typedef.inl:47