Imported Upstream version 2.81
[platform/upstream/libbullet.git] / Demos / GenericJointDemo / Ragdoll.cpp
1 /*
2 Bullet Continuous Collision Detection and Physics Library
3 Ragdoll Demo
4 Copyright (c) 2007 Starbreeze Studios
5
6 This software is provided 'as-is', without any express or implied warranty.
7 In no event will the authors be held liable for any damages arising from the use of this software.
8 Permission is granted to anyone to use this software for any purpose,
9 including commercial applications, and to alter it and redistribute it freely,
10 subject to the following restrictions:
11
12 1. 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.
13 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
14 3. This notice may not be removed or altered from any source distribution.
15
16 Written by: Marten Svanfeldt
17 */
18
19 #include "Ragdoll.h"
20
21 //#define RIGID 1
22
23 RagDoll::RagDoll (btDynamicsWorld* ownerWorld, const btVector3& positionOffset,
24         btScalar scale_ragdoll) : m_ownerWorld (ownerWorld)
25 {
26
27
28         // Setup the geometry
29         m_shapes[BODYPART_PELVIS] = new btCapsuleShape(
30         btScalar(scale_ragdoll*0.15), btScalar(scale_ragdoll*0.20));
31         m_shapes[BODYPART_SPINE] = new btCapsuleShape(
32         btScalar(scale_ragdoll*0.15), btScalar(scale_ragdoll*0.28));
33         m_shapes[BODYPART_HEAD] = new btCapsuleShape(btScalar(scale_ragdoll*0.10), btScalar(scale_ragdoll*0.05));
34         m_shapes[BODYPART_LEFT_UPPER_LEG] = new btCapsuleShape(btScalar(scale_ragdoll*0.07), btScalar(scale_ragdoll*0.45));
35         m_shapes[BODYPART_LEFT_LOWER_LEG] = new btCapsuleShape(btScalar(scale_ragdoll*0.05), btScalar(scale_ragdoll*0.37));
36         m_shapes[BODYPART_RIGHT_UPPER_LEG] = new btCapsuleShape(btScalar(scale_ragdoll*0.07), btScalar(scale_ragdoll*0.45));
37         m_shapes[BODYPART_RIGHT_LOWER_LEG] = new btCapsuleShape(btScalar(scale_ragdoll*0.05), btScalar(scale_ragdoll*0.37));
38         m_shapes[BODYPART_LEFT_UPPER_ARM] = new btCapsuleShape(btScalar(scale_ragdoll*0.05), btScalar(scale_ragdoll*0.33));
39         m_shapes[BODYPART_LEFT_LOWER_ARM] = new btCapsuleShape(btScalar(scale_ragdoll*0.04), btScalar(scale_ragdoll*0.25));
40         m_shapes[BODYPART_RIGHT_UPPER_ARM] = new btCapsuleShape(btScalar(scale_ragdoll*0.05), btScalar(scale_ragdoll*0.33));
41         m_shapes[BODYPART_RIGHT_LOWER_ARM] = new btCapsuleShape(btScalar(scale_ragdoll*0.04), btScalar(scale_ragdoll*0.25));
42
43         // Setup all the rigid bodies
44         btTransform offset; offset.setIdentity();
45         offset.setOrigin(positionOffset);
46
47         btTransform transform;
48         transform.setIdentity();
49         transform.setOrigin(btVector3(btScalar(0.), btScalar(scale_ragdoll*1.), btScalar(0.)));
50         m_bodies[BODYPART_PELVIS] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_PELVIS]);
51
52         transform.setIdentity();
53         transform.setOrigin(btVector3(btScalar(0.), btScalar(scale_ragdoll*1.2), btScalar(0.)));
54         m_bodies[BODYPART_SPINE] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_SPINE]);
55
56         transform.setIdentity();
57         transform.setOrigin(btVector3(btScalar(0.), btScalar(scale_ragdoll*1.6), btScalar(0.)));
58         m_bodies[BODYPART_HEAD] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_HEAD]);
59
60         transform.setIdentity();
61         transform.setOrigin(btVector3(btScalar(-0.18*scale_ragdoll), btScalar(0.65*scale_ragdoll),
62 btScalar(0.)));
63         m_bodies[BODYPART_LEFT_UPPER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_UPPER_LEG]);
64
65         transform.setIdentity();
66         transform.setOrigin(btVector3(btScalar(-0.18*scale_ragdoll), btScalar(0.2*scale_ragdoll), btScalar(0.)));
67         m_bodies[BODYPART_LEFT_LOWER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_LOWER_LEG]);
68
69         transform.setIdentity();
70         transform.setOrigin(btVector3(btScalar(0.18*scale_ragdoll), btScalar(0.65*scale_ragdoll), btScalar(0.)));
71         m_bodies[BODYPART_RIGHT_UPPER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_UPPER_LEG]);
72
73         transform.setIdentity();
74         transform.setOrigin(btVector3(btScalar(0.18*scale_ragdoll), btScalar(0.2*scale_ragdoll), btScalar(0.)));
75         m_bodies[BODYPART_RIGHT_LOWER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_LOWER_LEG]);
76
77         transform.setIdentity();
78         transform.setOrigin(btVector3(btScalar(-0.35*scale_ragdoll), btScalar(1.45*scale_ragdoll), btScalar(0.)));
79         transform.getBasis().setEulerZYX(0,0,SIMD_HALF_PI);
80         m_bodies[BODYPART_LEFT_UPPER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_UPPER_ARM]);
81
82         transform.setIdentity();
83         transform.setOrigin(btVector3(btScalar(-0.7*scale_ragdoll), btScalar(1.45*scale_ragdoll), btScalar(0.)));
84         transform.getBasis().setEulerZYX(0,0,SIMD_HALF_PI);
85         m_bodies[BODYPART_LEFT_LOWER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_LOWER_ARM]);
86
87         transform.setIdentity();
88         transform.setOrigin(btVector3(btScalar(0.35*scale_ragdoll), btScalar(1.45*scale_ragdoll), btScalar(0.)));
89         transform.getBasis().setEulerZYX(0,0,-SIMD_HALF_PI);
90         m_bodies[BODYPART_RIGHT_UPPER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_UPPER_ARM]);
91
92         transform.setIdentity();
93         transform.setOrigin(btVector3(btScalar(0.7*scale_ragdoll), btScalar(1.45*scale_ragdoll), btScalar(0.)));
94         transform.getBasis().setEulerZYX(0,0,-SIMD_HALF_PI);
95         m_bodies[BODYPART_RIGHT_LOWER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_LOWER_ARM]);
96
97         // Setup some damping on the m_bodies
98         for (int i = 0; i < BODYPART_COUNT; ++i)
99         {
100                 m_bodies[i]->setDamping(0.05f, 0.85f);
101                 m_bodies[i]->setDeactivationTime(0.8f);
102                 m_bodies[i]->setSleepingThresholds(1.6f, 2.5f);
103         }
104
105 ///////////////////////////// SETTING THE CONSTRAINTS /////////////////////////////////////////////7777
106         // Now setup the constraints
107         btGeneric6DofConstraint * joint6DOF;
108         btTransform localA, localB;
109         bool useLinearReferenceFrameA = true;
110 /// ******* SPINE HEAD ******** ///
111         {
112                 localA.setIdentity(); localB.setIdentity();
113
114                 localA.setOrigin(btVector3(btScalar(0.), btScalar(0.30*scale_ragdoll), btScalar(0.)));
115
116                 localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.14*scale_ragdoll), btScalar(0.)));
117
118                 joint6DOF = new btGeneric6DofConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_HEAD], localA, localB,useLinearReferenceFrameA);
119
120 #ifdef RIGID
121                 joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON));
122                 joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON));
123 #else
124                 joint6DOF->setAngularLowerLimit(btVector3(-SIMD_PI*0.3f,-SIMD_EPSILON,-SIMD_PI*0.3f));
125                 joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.5f,SIMD_EPSILON,SIMD_PI*0.3f));
126 #endif
127                 m_joints[JOINT_SPINE_HEAD] = joint6DOF;
128                 m_ownerWorld->addConstraint(m_joints[JOINT_SPINE_HEAD], true);
129         }
130 /// *************************** ///
131
132
133
134
135 /// ******* LEFT SHOULDER ******** ///
136         {
137                 localA.setIdentity(); localB.setIdentity();
138
139                 localA.setOrigin(btVector3(btScalar(-0.2*scale_ragdoll), btScalar(0.15*scale_ragdoll), btScalar(0.)));
140
141                 localB.getBasis().setEulerZYX(SIMD_HALF_PI,0,-SIMD_HALF_PI);
142                 localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.18*scale_ragdoll), btScalar(0.)));
143
144                 joint6DOF = new btGeneric6DofConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_LEFT_UPPER_ARM], localA, localB,useLinearReferenceFrameA);
145
146 #ifdef RIGID
147                 joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON));
148                 joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON));
149 #else
150                 joint6DOF->setAngularLowerLimit(btVector3(-SIMD_PI*0.8f,-SIMD_EPSILON,-SIMD_PI*0.5f));
151                 joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.8f,SIMD_EPSILON,SIMD_PI*0.5f));
152 #endif
153                 m_joints[JOINT_LEFT_SHOULDER] = joint6DOF;
154                 m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_SHOULDER], true);
155         }
156 /// *************************** ///
157
158
159 /// ******* RIGHT SHOULDER ******** ///
160         {
161                 localA.setIdentity(); localB.setIdentity();
162
163                 localA.setOrigin(btVector3(btScalar(0.2*scale_ragdoll), btScalar(0.15*scale_ragdoll), btScalar(0.)));
164                 localB.getBasis().setEulerZYX(0,0,SIMD_HALF_PI);
165                 localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.18*scale_ragdoll), btScalar(0.)));
166                 joint6DOF = new btGeneric6DofConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_RIGHT_UPPER_ARM], localA, localB,useLinearReferenceFrameA);
167
168 #ifdef RIGID
169                 joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON));
170                 joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON));
171 #else
172
173                 joint6DOF->setAngularLowerLimit(btVector3(-SIMD_PI*0.8f,-SIMD_EPSILON,-SIMD_PI*0.5f));
174                 joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.8f,SIMD_EPSILON,SIMD_PI*0.5f));
175 #endif
176                 m_joints[JOINT_RIGHT_SHOULDER] = joint6DOF;
177                 m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_SHOULDER], true);
178         }
179 /// *************************** ///
180
181 /// ******* LEFT ELBOW ******** ///
182         {
183                 localA.setIdentity(); localB.setIdentity();
184
185                 localA.setOrigin(btVector3(btScalar(0.), btScalar(0.18*scale_ragdoll), btScalar(0.)));
186                 localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.14*scale_ragdoll), btScalar(0.)));
187                 joint6DOF =  new btGeneric6DofConstraint (*m_bodies[BODYPART_LEFT_UPPER_ARM], *m_bodies[BODYPART_LEFT_LOWER_ARM], localA, localB,useLinearReferenceFrameA);
188
189 #ifdef RIGID
190                 joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON));
191                 joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON));
192 #else
193                 joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON));
194                 joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.7f,SIMD_EPSILON,SIMD_EPSILON));
195 #endif
196                 m_joints[JOINT_LEFT_ELBOW] = joint6DOF;
197                 m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_ELBOW], true);
198         }
199 /// *************************** ///
200
201 /// ******* RIGHT ELBOW ******** ///
202         {
203                 localA.setIdentity(); localB.setIdentity();
204
205                 localA.setOrigin(btVector3(btScalar(0.), btScalar(0.18*scale_ragdoll), btScalar(0.)));
206                 localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.14*scale_ragdoll), btScalar(0.)));
207                 joint6DOF =  new btGeneric6DofConstraint (*m_bodies[BODYPART_RIGHT_UPPER_ARM], *m_bodies[BODYPART_RIGHT_LOWER_ARM], localA, localB,useLinearReferenceFrameA);
208
209 #ifdef RIGID
210                 joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON));
211                 joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON));
212 #else
213                 joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON));
214                 joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.7,SIMD_EPSILON,SIMD_EPSILON));
215 #endif
216
217                 m_joints[JOINT_RIGHT_ELBOW] = joint6DOF;
218                 m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_ELBOW], true);
219         }
220 /// *************************** ///
221
222
223 /// ******* PELVIS ******** ///
224         {
225                 localA.setIdentity(); localB.setIdentity();
226
227                 localA.getBasis().setEulerZYX(0,SIMD_HALF_PI,0);
228                 localA.setOrigin(btVector3(btScalar(0.), btScalar(0.15*scale_ragdoll), btScalar(0.)));
229                 localB.getBasis().setEulerZYX(0,SIMD_HALF_PI,0);
230                 localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.15*scale_ragdoll), btScalar(0.)));
231                 joint6DOF =  new btGeneric6DofConstraint (*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_SPINE], localA, localB,useLinearReferenceFrameA);
232
233 #ifdef RIGID
234                 joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON));
235                 joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON));
236 #else
237                 joint6DOF->setAngularLowerLimit(btVector3(-SIMD_PI*0.2,-SIMD_EPSILON,-SIMD_PI*0.3));
238                 joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.2,SIMD_EPSILON,SIMD_PI*0.6));
239 #endif
240                 m_joints[JOINT_PELVIS_SPINE] = joint6DOF;
241                 m_ownerWorld->addConstraint(m_joints[JOINT_PELVIS_SPINE], true);
242         }
243 /// *************************** ///
244
245 /// ******* LEFT HIP ******** ///
246         {
247                 localA.setIdentity(); localB.setIdentity();
248
249                 localA.setOrigin(btVector3(btScalar(-0.18*scale_ragdoll), btScalar(-0.10*scale_ragdoll), btScalar(0.)));
250
251                 localB.setOrigin(btVector3(btScalar(0.), btScalar(0.225*scale_ragdoll), btScalar(0.)));
252
253                 joint6DOF = new btGeneric6DofConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_LEFT_UPPER_LEG], localA, localB,useLinearReferenceFrameA);
254
255 #ifdef RIGID
256                 joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON));
257                 joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON));
258 #else
259                 joint6DOF->setAngularLowerLimit(btVector3(-SIMD_HALF_PI*0.5,-SIMD_EPSILON,-SIMD_EPSILON));
260                 joint6DOF->setAngularUpperLimit(btVector3(SIMD_HALF_PI*0.8,SIMD_EPSILON,SIMD_HALF_PI*0.6f));
261 #endif
262                 m_joints[JOINT_LEFT_HIP] = joint6DOF;
263                 m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_HIP], true);
264         }
265 /// *************************** ///
266
267
268 /// ******* RIGHT HIP ******** ///
269         {
270                 localA.setIdentity(); localB.setIdentity();
271
272                 localA.setOrigin(btVector3(btScalar(0.18*scale_ragdoll), btScalar(-0.10*scale_ragdoll), btScalar(0.)));
273                 localB.setOrigin(btVector3(btScalar(0.), btScalar(0.225*scale_ragdoll), btScalar(0.)));
274
275                 joint6DOF = new btGeneric6DofConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_RIGHT_UPPER_LEG], localA, localB,useLinearReferenceFrameA);
276
277 #ifdef RIGID
278                 joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON));
279                 joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON));
280 #else
281                 joint6DOF->setAngularLowerLimit(btVector3(-SIMD_HALF_PI*0.5,-SIMD_EPSILON,-SIMD_HALF_PI*0.6f));
282                 joint6DOF->setAngularUpperLimit(btVector3(SIMD_HALF_PI*0.8,SIMD_EPSILON,SIMD_EPSILON));
283 #endif
284                 m_joints[JOINT_RIGHT_HIP] = joint6DOF;
285                 m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_HIP], true);
286         }
287 /// *************************** ///
288
289
290 /// ******* LEFT KNEE ******** ///
291         {
292                 localA.setIdentity(); localB.setIdentity();
293
294                 localA.setOrigin(btVector3(btScalar(0.), btScalar(-0.225*scale_ragdoll), btScalar(0.)));
295                 localB.setOrigin(btVector3(btScalar(0.), btScalar(0.185*scale_ragdoll), btScalar(0.)));
296                 joint6DOF =  new btGeneric6DofConstraint (*m_bodies[BODYPART_LEFT_UPPER_LEG], *m_bodies[BODYPART_LEFT_LOWER_LEG], localA, localB,useLinearReferenceFrameA);
297 //
298 #ifdef RIGID
299                 joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON));
300                 joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON));
301 #else
302                 joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON));
303                 joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.7f,SIMD_EPSILON,SIMD_EPSILON));
304 #endif
305                 m_joints[JOINT_LEFT_KNEE] = joint6DOF;
306                 m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_KNEE], true);
307         }
308 /// *************************** ///
309
310 /// ******* RIGHT KNEE ******** ///
311         {
312                 localA.setIdentity(); localB.setIdentity();
313
314                 localA.setOrigin(btVector3(btScalar(0.), btScalar(-0.225*scale_ragdoll), btScalar(0.)));
315                 localB.setOrigin(btVector3(btScalar(0.), btScalar(0.185*scale_ragdoll), btScalar(0.)));
316                 joint6DOF =  new btGeneric6DofConstraint (*m_bodies[BODYPART_RIGHT_UPPER_LEG], *m_bodies[BODYPART_RIGHT_LOWER_LEG], localA, localB,useLinearReferenceFrameA);
317
318 #ifdef RIGID
319                 joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON));
320                 joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON));
321 #else
322                 joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON));
323                 joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.7f,SIMD_EPSILON,SIMD_EPSILON));
324 #endif
325                 m_joints[JOINT_RIGHT_KNEE] = joint6DOF;
326                 m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_KNEE], true);
327         }
328 /// *************************** ///
329
330 }
331
332
333 RagDoll::~RagDoll()
334 {
335         int i;
336
337         // Remove all constraints
338         for (i = 0; i < JOINT_COUNT; ++i)
339         {
340                 m_ownerWorld->removeConstraint(m_joints[i]);
341                 delete m_joints[i]; m_joints[i] = 0;
342         }
343
344         // Remove all bodies and shapes
345         for (i = 0; i < BODYPART_COUNT; ++i)
346         {
347                 m_ownerWorld->removeRigidBody(m_bodies[i]);
348
349                 delete m_bodies[i]->getMotionState();
350
351                 delete m_bodies[i]; m_bodies[i] = 0;
352                 delete m_shapes[i]; m_shapes[i] = 0;
353         }
354 }
355
356
357 btRigidBody* RagDoll::localCreateRigidBody (btScalar mass, const btTransform& startTransform, btCollisionShape* shape)
358 {
359         bool isDynamic = (mass != 0.f);
360
361         btVector3 localInertia(0,0,0);
362         if (isDynamic)
363                 shape->calculateLocalInertia(mass,localInertia);
364
365         btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform);
366         btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,shape,localInertia);
367         rbInfo.m_additionalDamping = true;
368         btRigidBody* body = new btRigidBody(rbInfo);
369
370         m_ownerWorld->addRigidBody(body);
371
372         return body;
373 }