Bullet Collision Detection & Physics Library
btBox2dShape.h
Go to the documentation of this file.
1/*
2Bullet Continuous Collision Detection and Physics Library
3Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
4
5This software is provided 'as-is', without any express or implied warranty.
6In no event will the authors be held liable for any damages arising from the use of this software.
7Permission is granted to anyone to use this software for any purpose,
8including commercial applications, and to alter it and redistribute it freely,
9subject to the following restrictions:
10
111. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
122. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
133. This notice may not be removed or altered from any source distribution.
14*/
15
16#ifndef BT_OBB_BOX_2D_SHAPE_H
17#define BT_OBB_BOX_2D_SHAPE_H
18
23#include "LinearMath/btMinMax.h"
24
27{
28
29 //btVector3 m_boxHalfExtents1; //use m_implicitShapeDimensions instead
30
32 btVector3 m_vertices[4];
33 btVector3 m_normals[4];
34
35public:
36
38
40 {
41 btVector3 halfExtents = getHalfExtentsWithoutMargin();
42 btVector3 margin(getMargin(),getMargin(),getMargin());
43 halfExtents += margin;
44 return halfExtents;
45 }
46
48 {
49 return m_implicitShapeDimensions;//changed in Bullet 2.63: assume the scaling and margin are included
50 }
51
52
54 {
55 btVector3 halfExtents = getHalfExtentsWithoutMargin();
56 btVector3 margin(getMargin(),getMargin(),getMargin());
57 halfExtents += margin;
58
59 return btVector3(btFsels(vec.x(), halfExtents.x(), -halfExtents.x()),
60 btFsels(vec.y(), halfExtents.y(), -halfExtents.y()),
61 btFsels(vec.z(), halfExtents.z(), -halfExtents.z()));
62 }
63
65 {
66 const btVector3& halfExtents = getHalfExtentsWithoutMargin();
67
68 return btVector3(btFsels(vec.x(), halfExtents.x(), -halfExtents.x()),
69 btFsels(vec.y(), halfExtents.y(), -halfExtents.y()),
70 btFsels(vec.z(), halfExtents.z(), -halfExtents.z()));
71 }
72
73 virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const
74 {
75 const btVector3& halfExtents = getHalfExtentsWithoutMargin();
76
77 for (int i=0;i<numVectors;i++)
78 {
79 const btVector3& vec = vectors[i];
80 supportVerticesOut[i].setValue(btFsels(vec.x(), halfExtents.x(), -halfExtents.x()),
81 btFsels(vec.y(), halfExtents.y(), -halfExtents.y()),
82 btFsels(vec.z(), halfExtents.z(), -halfExtents.z()));
83 }
84
85 }
86
87
89 btBox2dShape( const btVector3& boxHalfExtents)
91 m_centroid(0,0,0)
92 {
93 m_vertices[0].setValue(-boxHalfExtents.getX(),-boxHalfExtents.getY(),0);
94 m_vertices[1].setValue(boxHalfExtents.getX(),-boxHalfExtents.getY(),0);
95 m_vertices[2].setValue(boxHalfExtents.getX(),boxHalfExtents.getY(),0);
96 m_vertices[3].setValue(-boxHalfExtents.getX(),boxHalfExtents.getY(),0);
97
98 m_normals[0].setValue(0,-1,0);
99 m_normals[1].setValue(1,0,0);
100 m_normals[2].setValue(0,1,0);
101 m_normals[3].setValue(-1,0,0);
102
103 btScalar minDimension = boxHalfExtents.getX();
104 if (minDimension>boxHalfExtents.getY())
105 minDimension = boxHalfExtents.getY();
106
107 m_shapeType = BOX_2D_SHAPE_PROXYTYPE;
108 btVector3 margin(getMargin(),getMargin(),getMargin());
109 m_implicitShapeDimensions = (boxHalfExtents * m_localScaling) - margin;
110
111 setSafeMargin(minDimension);
112 };
113
114 virtual void setMargin(btScalar collisionMargin)
115 {
116 //correct the m_implicitShapeDimensions for the margin
117 btVector3 oldMargin(getMargin(),getMargin(),getMargin());
118 btVector3 implicitShapeDimensionsWithMargin = m_implicitShapeDimensions+oldMargin;
119
120 btConvexInternalShape::setMargin(collisionMargin);
121 btVector3 newMargin(getMargin(),getMargin(),getMargin());
122 m_implicitShapeDimensions = implicitShapeDimensionsWithMargin - newMargin;
123
124 }
125 virtual void setLocalScaling(const btVector3& scaling)
126 {
127 btVector3 oldMargin(getMargin(),getMargin(),getMargin());
128 btVector3 implicitShapeDimensionsWithMargin = m_implicitShapeDimensions+oldMargin;
129 btVector3 unScaledImplicitShapeDimensionsWithMargin = implicitShapeDimensionsWithMargin / m_localScaling;
130
132
133 m_implicitShapeDimensions = (unScaledImplicitShapeDimensionsWithMargin * m_localScaling) - oldMargin;
134
135 }
136
137 virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const;
138
139
140
141 virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const;
142
143
144
145
146
147 int getVertexCount() const
148 {
149 return 4;
150 }
151
152 virtual int getNumVertices()const
153 {
154 return 4;
155 }
156
157 const btVector3* getVertices() const
158 {
159 return &m_vertices[0];
160 }
161
162 const btVector3* getNormals() const
163 {
164 return &m_normals[0];
165 }
166
167
168
169
170
171
172
173 virtual void getPlane(btVector3& planeNormal,btVector3& planeSupport,int i ) const
174 {
175 //this plane might not be aligned...
176 btVector4 plane ;
177 getPlaneEquation(plane,i);
178 planeNormal = btVector3(plane.getX(),plane.getY(),plane.getZ());
179 planeSupport = localGetSupportingVertex(-planeNormal);
180 }
181
182
183 const btVector3& getCentroid() const
184 {
185 return m_centroid;
186 }
187
188 virtual int getNumPlanes() const
189 {
190 return 6;
191 }
192
193
194
195 virtual int getNumEdges() const
196 {
197 return 12;
198 }
199
200
201 virtual void getVertex(int i,btVector3& vtx) const
202 {
203 btVector3 halfExtents = getHalfExtentsWithoutMargin();
204
205 vtx = btVector3(
206 halfExtents.x() * (1-(i&1)) - halfExtents.x() * (i&1),
207 halfExtents.y() * (1-((i&2)>>1)) - halfExtents.y() * ((i&2)>>1),
208 halfExtents.z() * (1-((i&4)>>2)) - halfExtents.z() * ((i&4)>>2));
209 }
210
211
212 virtual void getPlaneEquation(btVector4& plane,int i) const
213 {
214 btVector3 halfExtents = getHalfExtentsWithoutMargin();
215
216 switch (i)
217 {
218 case 0:
219 plane.setValue(btScalar(1.),btScalar(0.),btScalar(0.),-halfExtents.x());
220 break;
221 case 1:
222 plane.setValue(btScalar(-1.),btScalar(0.),btScalar(0.),-halfExtents.x());
223 break;
224 case 2:
225 plane.setValue(btScalar(0.),btScalar(1.),btScalar(0.),-halfExtents.y());
226 break;
227 case 3:
228 plane.setValue(btScalar(0.),btScalar(-1.),btScalar(0.),-halfExtents.y());
229 break;
230 case 4:
231 plane.setValue(btScalar(0.),btScalar(0.),btScalar(1.),-halfExtents.z());
232 break;
233 case 5:
234 plane.setValue(btScalar(0.),btScalar(0.),btScalar(-1.),-halfExtents.z());
235 break;
236 default:
237 btAssert(0);
238 }
239 }
240
241
242 virtual void getEdge(int i,btVector3& pa,btVector3& pb) const
243 //virtual void getEdge(int i,Edge& edge) const
244 {
245 int edgeVert0 = 0;
246 int edgeVert1 = 0;
247
248 switch (i)
249 {
250 case 0:
251 edgeVert0 = 0;
252 edgeVert1 = 1;
253 break;
254 case 1:
255 edgeVert0 = 0;
256 edgeVert1 = 2;
257 break;
258 case 2:
259 edgeVert0 = 1;
260 edgeVert1 = 3;
261
262 break;
263 case 3:
264 edgeVert0 = 2;
265 edgeVert1 = 3;
266 break;
267 case 4:
268 edgeVert0 = 0;
269 edgeVert1 = 4;
270 break;
271 case 5:
272 edgeVert0 = 1;
273 edgeVert1 = 5;
274
275 break;
276 case 6:
277 edgeVert0 = 2;
278 edgeVert1 = 6;
279 break;
280 case 7:
281 edgeVert0 = 3;
282 edgeVert1 = 7;
283 break;
284 case 8:
285 edgeVert0 = 4;
286 edgeVert1 = 5;
287 break;
288 case 9:
289 edgeVert0 = 4;
290 edgeVert1 = 6;
291 break;
292 case 10:
293 edgeVert0 = 5;
294 edgeVert1 = 7;
295 break;
296 case 11:
297 edgeVert0 = 6;
298 edgeVert1 = 7;
299 break;
300 default:
301 btAssert(0);
302
303 }
304
305 getVertex(edgeVert0,pa );
306 getVertex(edgeVert1,pb );
307 }
308
309
310
311
312
313 virtual bool isInside(const btVector3& pt,btScalar tolerance) const
314 {
315 btVector3 halfExtents = getHalfExtentsWithoutMargin();
316
317 //btScalar minDist = 2*tolerance;
318
319 bool result = (pt.x() <= (halfExtents.x()+tolerance)) &&
320 (pt.x() >= (-halfExtents.x()-tolerance)) &&
321 (pt.y() <= (halfExtents.y()+tolerance)) &&
322 (pt.y() >= (-halfExtents.y()-tolerance)) &&
323 (pt.z() <= (halfExtents.z()+tolerance)) &&
324 (pt.z() >= (-halfExtents.z()-tolerance));
325
326 return result;
327 }
328
329
330 //debugging
331 virtual const char* getName()const
332 {
333 return "Box2d";
334 }
335
337 {
338 return 6;
339 }
340
341 virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const
342 {
343 switch (index)
344 {
345 case 0:
346 penetrationVector.setValue(btScalar(1.),btScalar(0.),btScalar(0.));
347 break;
348 case 1:
349 penetrationVector.setValue(btScalar(-1.),btScalar(0.),btScalar(0.));
350 break;
351 case 2:
352 penetrationVector.setValue(btScalar(0.),btScalar(1.),btScalar(0.));
353 break;
354 case 3:
355 penetrationVector.setValue(btScalar(0.),btScalar(-1.),btScalar(0.));
356 break;
357 case 4:
358 penetrationVector.setValue(btScalar(0.),btScalar(0.),btScalar(1.));
359 break;
360 case 5:
361 penetrationVector.setValue(btScalar(0.),btScalar(0.),btScalar(-1.));
362 break;
363 default:
364 btAssert(0);
365 }
366 }
367
368};
369
370#endif //BT_OBB_BOX_2D_SHAPE_H
371
372
@ BOX_2D_SHAPE_PROXYTYPE
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
Definition: btScalar.h:292
#define ATTRIBUTE_ALIGNED16(a)
Definition: btScalar.h:82
#define SIMD_FORCE_INLINE
Definition: btScalar.h:81
#define btFsels(a, b, c)
Definition: btScalar.h:581
#define btAssert(x)
Definition: btScalar.h:131
The btBox2dShape is a box primitive around the origin, its sides axis aligned with length specified b...
Definition: btBox2dShape.h:27
virtual int getNumVertices() const
Definition: btBox2dShape.h:152
btVector3 m_centroid
Definition: btBox2dShape.h:31
virtual void getPlane(btVector3 &planeNormal, btVector3 &planeSupport, int i) const
Definition: btBox2dShape.h:173
virtual int getNumEdges() const
Definition: btBox2dShape.h:195
btBox2dShape(const btVector3 &boxHalfExtents)
a btBox2dShape is a flat 2D box in the X-Y plane (Z extents are zero)
Definition: btBox2dShape.h:89
virtual void setLocalScaling(const btVector3 &scaling)
Definition: btBox2dShape.h:125
virtual void setMargin(btScalar collisionMargin)
Definition: btBox2dShape.h:114
const btVector3 * getVertices() const
Definition: btBox2dShape.h:157
virtual int getNumPreferredPenetrationDirections() const
Definition: btBox2dShape.h:336
int getVertexCount() const
Definition: btBox2dShape.h:147
const btVector3 & getHalfExtentsWithoutMargin() const
Definition: btBox2dShape.h:47
virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3 *vectors, btVector3 *supportVerticesOut, int numVectors) const
Definition: btBox2dShape.h:73
const btVector3 & getCentroid() const
Definition: btBox2dShape.h:183
virtual const char * getName() const
Definition: btBox2dShape.h:331
virtual bool isInside(const btVector3 &pt, btScalar tolerance) const
Definition: btBox2dShape.h:313
btVector3 localGetSupportingVertexWithoutMargin(const btVector3 &vec) const
Definition: btBox2dShape.h:64
virtual void getEdge(int i, btVector3 &pa, btVector3 &pb) const
Definition: btBox2dShape.h:242
BT_DECLARE_ALIGNED_ALLOCATOR()
virtual void getPlaneEquation(btVector4 &plane, int i) const
Definition: btBox2dShape.h:212
btVector3 getHalfExtentsWithMargin() const
Definition: btBox2dShape.h:39
virtual int getNumPlanes() const
Definition: btBox2dShape.h:188
virtual void getVertex(int i, btVector3 &vtx) const
Definition: btBox2dShape.h:201
virtual btVector3 localGetSupportingVertex(const btVector3 &vec) const
Definition: btBox2dShape.h:53
virtual void getPreferredPenetrationDirection(int index, btVector3 &penetrationVector) const
Definition: btBox2dShape.h:341
const btVector3 * getNormals() const
Definition: btBox2dShape.h:162
virtual void setMargin(btScalar margin)
virtual void setLocalScaling(const btVector3 &scaling)
The btPolyhedralConvexShape is an internal interface class for polyhedral convex shapes.
The btTransform class supports rigid transforms with only translation and rotation and no scaling/she...
Definition: btTransform.h:34
btVector3 can be used to represent 3D points and vectors.
Definition: btVector3.h:84
const btScalar & getZ() const
Return the z value.
Definition: btVector3.h:577
const btScalar & z() const
Return the z value.
Definition: btVector3.h:591
void setValue(const btScalar &_x, const btScalar &_y, const btScalar &_z)
Definition: btVector3.h:652
const btScalar & getY() const
Return the y value.
Definition: btVector3.h:575
const btScalar & x() const
Return the x value.
Definition: btVector3.h:587
const btScalar & getX() const
Return the x value.
Definition: btVector3.h:573
const btScalar & y() const
Return the y value.
Definition: btVector3.h:589
void setValue(const btScalar &_x, const btScalar &_y, const btScalar &_z, const btScalar &_w)
Set x,y,z and zero w.
Definition: btVector3.h:1225