Bullet Collision Detection & Physics Library
gim_tri_collision.h
Go to the documentation of this file.
1#ifndef GIM_TRI_COLLISION_H_INCLUDED
2#define GIM_TRI_COLLISION_H_INCLUDED
3
7/*
8-----------------------------------------------------------------------------
9This source file is part of GIMPACT Library.
10
11For the latest info, see http://gimpact.sourceforge.net/
12
13Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371.
14email: projectileman@yahoo.com
15
16 This library is free software; you can redistribute it and/or
17 modify it under the terms of EITHER:
18 (1) The GNU Lesser General Public License as published by the Free
19 Software Foundation; either version 2.1 of the License, or (at
20 your option) any later version. The text of the GNU Lesser
21 General Public License is included with this library in the
22 file GIMPACT-LICENSE-LGPL.TXT.
23 (2) The BSD-style license that is included with this library in
24 the file GIMPACT-LICENSE-BSD.TXT.
25 (3) The zlib/libpng license that is included with this library in
26 the file GIMPACT-LICENSE-ZLIB.TXT.
27
28 This library is distributed in the hope that it will be useful,
29 but WITHOUT ANY WARRANTY; without even the implied warranty of
30 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files
31 GIMPACT-LICENSE-LGPL.TXT, GIMPACT-LICENSE-ZLIB.TXT and GIMPACT-LICENSE-BSD.TXT for more details.
32
33-----------------------------------------------------------------------------
34*/
35
36#include "gim_box_collision.h"
37#include "gim_clip_polygon.h"
38
39#ifndef MAX_TRI_CLIPPING
40#define MAX_TRI_CLIPPING 16
41#endif
42
45{
50
52 {
57 while (i--)
58 {
59 m_points[i] = other.m_points[i];
60 }
61 }
62
64 {
65 }
66
68 {
69 copy_from(other);
70 }
71
73 template <typename DISTANCE_FUNC, typename CLASS_PLANE>
76 {
77 m_point_count = 0;
78 m_penetration_depth = -1000.0f;
79
81
82 GUINT _k;
83
84 for (_k = 0; _k < point_count; _k++)
85 {
86 GREAL _dist = -distance_func(plane, points[_k]) + margin;
87
88 if (_dist >= 0.0f)
89 {
91 {
93 point_indices[0] = _k;
94 m_point_count = 1;
95 }
96 else if ((_dist + G_EPSILON) >= m_penetration_depth)
97 {
100 }
101 }
102 }
103
104 for (_k = 0; _k < m_point_count; _k++)
105 {
107 }
108 }
109
113 {
116 }
117};
118
121{
122public:
125
127 {
128 }
129
131 {
133 }
134
136 {
138 }
139
141 {
143 ;
144 }
145
147 {
148 m_vertices[0] = trans(m_vertices[0]);
149 m_vertices[1] = trans(m_vertices[1]);
150 m_vertices[2] = trans(m_vertices[2]);
151 }
152
154 {
156 const btVector3 &e1 = m_vertices[(edge_index + 1) % 3];
158 }
159
161
168 {
170
174
178
179 //y axis
180 xaxis = zaxis.cross(xaxis);
182
183 triangle_transform.setOrigin(m_vertices[0]);
184 }
185
187
192 const GIM_TRIANGLE &other,
194
196
202 const GIM_TRIANGLE &other,
204 {
205 //test box collisioin
207 GIM_AABB boxv(other.m_vertices[0], other.m_vertices[1], other.m_vertices[2], other.m_margin);
208 if (!boxu.has_collision(boxv)) return false;
209
210 //do hard test
212 }
213
243 const btVector3 &point,
244 const btVector3 &tri_plane,
245 GREAL &u, GREAL &v) const
246 {
249 btVector3 _vecproj = point - m_vertices[0];
250 GUINT _i1 = (tri_plane.closestAxis() + 1) % 3;
251 GUINT _i2 = (_i1 + 1) % 3;
252 if (btFabs(_axe2[_i2]) < G_EPSILON)
253 {
254 u = (_vecproj[_i2] * _axe2[_i1] - _vecproj[_i1] * _axe2[_i2]) / (_axe1[_i2] * _axe2[_i1] - _axe1[_i1] * _axe2[_i2]);
255 v = (_vecproj[_i1] - u * _axe1[_i1]) / _axe2[_i1];
256 }
257 else
258 {
259 u = (_vecproj[_i1] * _axe2[_i2] - _vecproj[_i2] * _axe2[_i1]) / (_axe1[_i1] * _axe2[_i2] - _axe1[_i2] * _axe2[_i1]);
260 v = (_vecproj[_i2] - u * _axe1[_i2]) / _axe2[_i2];
261 }
262
263 if (u < -G_EPSILON)
264 {
265 return false;
266 }
267 else if (v < -G_EPSILON)
268 {
269 return false;
270 }
271 else
272 {
274 sumuv = u + v;
275 if (sumuv < -G_EPSILON)
276 {
277 return false;
278 }
279 else if (sumuv - 1.0f > G_EPSILON)
280 {
281 return false;
282 }
283 }
284 return true;
285 }
286
288
292 {
293 //Test with edge 0
295 this->get_edge_plane(0, tri_normal, edge_plane);
297 if (dist - m_margin > 0.0f) return false; // outside plane
298
299 this->get_edge_plane(1, tri_normal, edge_plane);
300 dist = DISTANCE_PLANE_POINT(edge_plane, point);
301 if (dist - m_margin > 0.0f) return false; // outside plane
302
303 this->get_edge_plane(2, tri_normal, edge_plane);
304 dist = DISTANCE_PLANE_POINT(edge_plane, point);
305 if (dist - m_margin > 0.0f) return false; // outside plane
306 return true;
307 }
308
311 const btVector3 &vPoint,
314 {
316 {
321 }
322
324 if (res == 0) return false;
325 if (!is_point_inside(pout, faceplane)) return false;
326
327 if (res == 2) //invert normal
328 {
329 triangle_normal.setValue(-faceplane[0], -faceplane[1], -faceplane[2]);
330 }
331 else
332 {
333 triangle_normal.setValue(faceplane[0], faceplane[1], faceplane[2]);
334 }
335
337
338 return true;
339 }
340
343 const btVector3 &vPoint,
346 {
348 {
353 }
354
356 if (res != 1) return false;
357
358 if (!is_point_inside(pout, faceplane)) return false;
359
360 triangle_normal.setValue(faceplane[0], faceplane[1], faceplane[2]);
361
363
364 return true;
365 }
366};
367
368#endif // GIM_TRI_COLLISION_H_INCLUDED
const T & btMax(const T &a, const T &b)
Definition btMinMax.h:27
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
Definition btScalar.h:314
btScalar btFabs(btScalar x)
Definition btScalar.h:497
#define SIMD_FORCE_INLINE
Definition btScalar.h:98
This function calcs the distance from a 3D plane.
Axis aligned box.
Class for colliding triangles.
void apply_transform(const btTransform &trans)
btVector3 m_vertices[3]
bool get_uv_parameters(const btVector3 &point, const btVector3 &tri_plane, GREAL &u, GREAL &v) const
bool collide_triangle_hard_test(const GIM_TRIANGLE &other, GIM_TRIANGLE_CONTACT_DATA &contact_data) const
Test triangles by finding separating axis.
GIM_AABB get_box() const
bool ray_collision_front_side(const btVector3 &vPoint, const btVector3 &vDir, btVector3 &pout, btVector3 &triangle_normal, GREAL &tparam, GREAL tmax=G_REAL_INFINITY)
one direccion ray collision
void get_edge_plane(GUINT edge_index, const btVector3 &triangle_normal, btVector4 &plane) const
void get_triangle_transform(btTransform &triangle_transform) const
Gets the relative transformation of this triangle.
bool ray_collision(const btVector3 &vPoint, const btVector3 &vDir, btVector3 &pout, btVector3 &triangle_normal, GREAL &tparam, GREAL tmax=G_REAL_INFINITY)
Bidireccional ray collision.
void get_normal(btVector3 &normal) const
bool is_point_inside(const btVector3 &point, const btVector3 &tri_normal) const
is point in triangle beam?
bool collide_triangle(const GIM_TRIANGLE &other, GIM_TRIANGLE_CONTACT_DATA &contact_data) const
Test boxes before doing hard test.
void get_plane(btVector4 &plane) const
The btMatrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with...
Definition btMatrix3x3.h:50
The btTransform class supports rigid transforms with only translation and rotation and no scaling/she...
Definition btTransform.h:30
btVector3 can be used to represent 3D points and vectors.
Definition btVector3.h:82
btScalar dot(const btVector3 &v) const
Return the dot product.
Definition btVector3.h:229
#define DISTANCE_PLANE_POINT(plane, point)
#define TRIANGLE_PLANE(v1, v2, v3, plane)
plane is a vec4f
#define EDGE_PLANE(e1, e2, n, plane)
Calc a plane from an edge an a normal. plane is a vec4f.
#define TRIANGLE_NORMAL(v1, v2, v3, n)
GUINT LINE_PLANE_COLLISION(const CLASS_PLANE &plane, const CLASS_POINT &vDir, const CLASS_POINT &vPoint, CLASS_POINT &pout, T &tparam, T tmin, T tmax)
line collision
#define MAT_SET_X(mat, vec3)
Get the triple(3) col of a transform matrix.
#define MAT_SET_Z(mat, vec3)
Get the triple(3) col of a transform matrix.
#define VEC_CROSS(c, a, b)
Vector cross.
#define VEC_NORMALIZE(a)
Vector length.
#define MAT_SET_Y(mat, vec3)
Get the triple(3) col of a transform matrix.
#define GREAL
Definition gim_math.h:37
#define GUINT
Definition gim_math.h:40
#define G_REAL_INFINITY
Definition gim_math.h:54
#define G_EPSILON
Definition gim_math.h:56
#define MAX_TRI_CLIPPING
Structure for collision.
btVector3 m_points[MAX_TRI_CLIPPING]
void mergepoints_generic(const CLASS_PLANE &plane, GREAL margin, const btVector3 *points, GUINT point_count, DISTANCE_FUNC distance_func)
classify points that are closer
void copy_from(const GIM_TRIANGLE_CONTACT_DATA &other)
GIM_TRIANGLE_CONTACT_DATA(const GIM_TRIANGLE_CONTACT_DATA &other)
void merge_points(const btVector4 &plane, GREAL margin, const btVector3 *points, GUINT point_count)
classify points that are closer