physics
body.hpp
Go to the documentation of this file.
1 
5 #pragma once
6 #include <stack>
7 #include <algorithm>
8 
9 #define GLM_ENABLE_EXPERIMENTAL
10 #include "glm/glm.hpp"
11 #include "glm/gtx/string_cast.hpp"
12 #include "glm/gtx/norm.hpp"
13 class CollisionBody;
14 #include "math_3d.hpp"
15 #include "collision.hpp"
16 
17 const float pi = 3.141592654f;
18 
22 class Tri {
23 public:
24  int id;
25  vector<vec3> data;
26  Tri(int _id, vector<vec3> _data);
27 };
28 
32 class TriOctree {
33 public:
34  static int counter;
35  int index;
36  vec3 position;
37  float hw;
38  vector<Tri> triangles;
39  float xMin;
40  float yMin;
41  float zMin;
42  float xMax;
43  float yMax;
44  float zMax;
45  vector<TriOctree> children;
46  int MAX_TRIANGLES = 50;
47  TriOctree();
48 };
49 
53 vector<int> getTriangleSet(TriOctree &octree, CollisionBody &sphereBody, vector<int> &tri_ids);
57 void createChildren(TriOctree &octree);
61 void initOctree(TriOctree &octree, int ind, vec3 pos, float hwidth, vector<Tri> tris);
65 vector<vec4> getAllNodes();
66 
70 struct Face {
71  vector<vec3> verts_ws = {};
72  vector<uint> verts_indices = {};
74  vec3 normal_ws;
75  int id = -1;
79  Face(const vector<uint> &verts_indices);
83  int setData(const vector<vec3> &verts);
87  Face(const Face &f);
88  ~Face();
89 
90 };
91 
95 struct Edge {
96  vec3 v1_ws;
97  vec3 v2_ws;
98 
99  int v1_index;
100  int v2_index;
101 
102  vector<uint> faces_indices = {};
103  vector<Face> faces = {};
104  int id = -1;
108  Edge(const vector<uint> &verts_indices, const vector<uint> &faces_indices);
109  ~Edge();
113  int setData(const vector<vec3> &verts, const vector<Face> &faces);
114 };
115 
116 enum BodyType { NONE=-1, TRIANGLE=0, BOX=1, SPHERE=2, CYLINDER=3, COMPOSITE=4};
117 
122 public:
126  CollisionBody();
127  CollisionBody& operator=(const CollisionBody &other);
128  CollisionBody(const CollisionBody &other);
129  ~CollisionBody();
130 
134  mat4 getModelMatrix();
138  int update();
142  int calculateVertices();
146  static int getIndex(int ID);
147 
148 public:
149  static vector<CollisionBody*> allBodies;
150  static int Counter;
151  float dX2 = 0.5f;
152  float dY2 = 0.5f;
153  float dZ2 = 0.5f;
154 
156 
158  int id = -1;
159  vector<int> triIDs = {};
160  vector<int> objectIDs = {};
161 
162  bool colliding;
163 
165  float mass;
167  float density = 1.0f;
168  float friction;
173  vec3 cm_force;
174  vec3 torque;
178 
179  vector<vec3> a_bounding_vertices = { vec3(0,0,0),vec3(0,0,0),vec3(0,0,0),vec3(0,0,0),
180  vec3(0,0,0),vec3(0,0,0),vec3(0,0,0),vec3(0,0,0) };
181 
182  vector<vec3> a_body_bounding_vertices = {};
183  vector<Face> faces = {};
184  vector<Edge> edges = {};
185 
186  mat4 offset;
187 
188  void *contactFeature = NULL;
189  int compositeBodyIndex = -1;
190 
191  bool sleeping = false;
192 
193  int group_id = -1;
194 
195  bool is_static = false;
196 };
197 
201 int initBox(CollisionBody *body, float w, float h, float b);
205 int initSphere(CollisionBody *body, float r);
209 int initCylinder(CollisionBody *body, float r1, float r2, float h);
213 int initTriangle(CollisionBody *body, vector<vec3> verts);
217 vector<CollisionBody> initTriangleMesh(vector<vec3> verts);
218 
220 
224 class RigidBody {
225 public:
229  RigidBody();
233  ~RigidBody();
237  int integrateForces(vec3 gravity, float deltaTime);
241  int integrateVelocities(float deltaTime);
245  void add(int bodyID);
249  mat4 getModelMatrix();
253  bool getColliding();
254 
255 public:
256 
257  static int Counter;
258 
259  int id = -1;
260 
262  float mass;
264  float density = 1.0f;
269  vec3 cm_force;
270  vec3 torque;
274 
275  vector<vec3> a_bounding_vertices = { vec3(0,0,0),vec3(0,0,0),vec3(0,0,0),vec3(0,0,0),
276  vec3(0,0,0),vec3(0,0,0),vec3(0,0,0),vec3(0,0,0) };
277 
278  vector<vec3> a_body_bounding_vertices = {};
279 
280  vector<unsigned int> bodyIndexes = {};
281  static vector<RigidBody*> allBodies;
282  int compositeBodyIndex = -1;
284 
285  // default false for stability
286  bool apply_gyroscopic_term = false;
287 
288  bool sleeping = false;
289  unsigned int colliding = 0;
290 };
float bounding_radius
Definition: body.hpp:155
float xMax
Definition: body.hpp:42
vec3 angular_momentum
Definition: body.hpp:172
Definition: body.hpp:116
vec3 position
Definition: body.hpp:36
float xMin
Definition: body.hpp:39
Tri(int _id, vector< vec3 > _data)
BodyType type
Definition: body.hpp:283
float friction
Definition: body.hpp:168
vec3 torque
Definition: body.hpp:270
Definition: body.hpp:116
mat3 inverse_world_inertia_tensor
Definition: body.hpp:271
int initCylinder(CollisionBody *body, float r1, float r2, float h)
Initializer function for a cylinder CollisionBody.
float yMax
Definition: body.hpp:43
vec3 cm_force
Definition: body.hpp:269
BodyType
Definition: body.hpp:116
int initTriangle(CollisionBody *body, vector< vec3 > verts)
Initializer function for a triangle CollisionBody.
float mass
Definition: body.hpp:165
bool colliding
Definition: body.hpp:162
Octree for triangle meshes.
Definition: body.hpp:32
vec3 torque
Definition: body.hpp:174
void createChildren(TriOctree &octree)
Helper function for spawning child TriOctree.
static int Counter
Definition: body.hpp:150
vector< TriOctree > children
Definition: body.hpp:45
vec3 angular_velocity
Definition: body.hpp:177
static vector< CollisionBody * > allBodies
Definition: body.hpp:149
RigidBody structure for organising data to model physics simulations of convex hull collisions...
Definition: body.hpp:224
float zMin
Definition: body.hpp:41
vec3 angular_momentum
Definition: body.hpp:268
static int Counter
Definition: body.hpp:257
Definition: body.hpp:116
Definition: body.hpp:116
vec3 angular_velocity
Definition: body.hpp:273
float coefficient_of_restitution
Definition: body.hpp:164
vec3 position_ws
Definition: body.hpp:73
mat3 inverse_body_inertia_tensor
Definition: body.hpp:176
int index
Definition: body.hpp:35
const float pi
Definition: body.hpp:17
vec3 v2_ws
Definition: body.hpp:97
vec3 cm_velocity
Definition: body.hpp:171
vector< vec4 > getAllNodes()
Get a vector of nodes, represented with a 3D position and half-width of the TriOctree. {vec4(x,y,z,hw), ... }.
float coefficient_of_restitution
Definition: body.hpp:261
float yMin
Definition: body.hpp:40
CollisionBody structure for organising data to model physics simulations of convex hull collisions...
Definition: body.hpp:121
float zMax
Definition: body.hpp:44
vec3 cm_velocity
Definition: body.hpp:267
int initSphere(CollisionBody *body, float r)
Initializer function for a sphere CollisionBody.
int id
Definition: body.hpp:24
Definition: body.hpp:116
vector< vec3 > data
Definition: body.hpp:25
vector< int > getTriangleSet(TriOctree &octree, CollisionBody &sphereBody, vector< int > &tri_ids)
Get triangle set in the octree for the positions.
mat3 orientation
Definition: body.hpp:170
vector< CollisionBody > initTriangleMesh(vector< vec3 > verts)
Initializer function for triangle mesh CollisionBody&#39;s.
vec3 normal_ws
Definition: body.hpp:74
Face structure for organising CollisionBody collision data.
Definition: body.hpp:70
static vector< RigidBody * > allBodies
Definition: body.hpp:281
int v1_index
Definition: body.hpp:99
mat3 inverse_world_inertia_tensor
Definition: body.hpp:175
vector< Tri > triangles
Definition: body.hpp:38
Edge structure for organising CollisionBody collision data.
Definition: body.hpp:95
vec3 cm_force
Definition: body.hpp:173
int initBox(CollisionBody *body, float w, float h, float b)
Initializer function for a box CollisionBody; w x h x b.
float one_over_mass
Definition: body.hpp:166
vec3 v1_ws
Definition: body.hpp:96
float mass
Definition: body.hpp:262
Definition: body.hpp:116
vec3 cm_position
Definition: body.hpp:265
mat3 inverse_body_inertia_tensor
Definition: body.hpp:272
vec3 cm_position
Definition: body.hpp:169
static int counter
Definition: body.hpp:34
Triangle class for managing data for triangle meshes.
Definition: body.hpp:22
mat3 orientation
Definition: body.hpp:266
TriOctree * getOctree()
void initOctree(TriOctree &octree, int ind, vec3 pos, float hwidth, vector< Tri > tris)
Initialization function.
float one_over_mass
Definition: body.hpp:263
mat4 offset
Definition: body.hpp:186
float hw
Definition: body.hpp:37
int v2_index
Definition: body.hpp:100