Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/physics/src/ogrebullet/Dynamics/Prefab/OgreBulletDynamicsRagDoll.cpp @ 2163

Last change on this file since 2163 was 2119, checked in by rgrieder, 16 years ago

Merged physics branch into physics_new branch.

  • Property svn:eol-style set to native
File size: 4.4 KB
Line 
1/***************************************************************************
2
3This source file is part of OGREBULLET
4(Object-oriented Graphics Rendering Engine Bullet Wrapper)
5For the latest info, see http://www.ogre3d.org/phpBB2addons/viewforum.php?f=10
6
7Copyright (c) 2007 tuan.kuranes@gmail.com
8
9
10
11This program is free software; you can redistribute it and/or modify it under
12the terms of the GNU Lesser General Public License as published by the Free Software
13Foundation; either version 2 of the License, or (at your option) any later
14version.
15
16This program is distributed in the hope that it will be useful, but WITHOUT
17ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
18FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
19
20You should have received a copy of the GNU Lesser General Public License along with
21this program; if not, write to the Free Software Foundation, Inc., 59 Temple
22Place - Suite 330, Boston, MA 02111-1307, USA, or go to
23http://www.gnu.org/copyleft/lesser.txt.
24-----------------------------------------------------------------------------
25*/
26
27#include "OgreBulletDynamics.h"
28
29#include "OgreBulletCollisionsShape.h"
30#include "OgreBulletCollisionsObject.h"
31#include "OgreBulletCollisionsWorld.h"
32#include "OgreBulletCollisionsObjectState.h"
33
34#include "OgreBulletDynamicsWorld.h"
35#include "OgreBulletDynamicsRigidBody.h"
36#include "Prefab/OgreBulletDynamicsRagDoll.h"
37
38using namespace Ogre;
39using namespace OgreBulletCollisions;
40
41namespace OgreBulletDynamics
42{
43
44        // -------------------------------------------------------------------------
45        RagDoll::RagDoll (btDynamicsWorld* ownerWorld, const btVector3& positionOffset)
46                : 
47                m_ownerWorld (ownerWorld)
48        {
49                // Setup all the rigid bodies
50                btTransform offset; offset.setIdentity();
51                offset.setOrigin(positionOffset);
52
53
54                btTransform transform;
55
56                // for
57                {
58                        transform.setIdentity();
59                        transform.setOrigin(btVector3(btScalar(0.), btScalar(1.), btScalar(0.)));
60                        m_bodies.push_back(
61                                localCreateRigidBody(btScalar(1.), 
62                                                                                offset*transform, 
63                                                                                new btCapsuleShape(btScalar(0.15), btScalar(0.20))
64                                                                                )
65                                                                        );
66                }
67
68                // Setup some damping on the m_bodies
69                for(std::vector<btRigidBody* >::iterator i=m_bodies.begin();
70                        i!=m_bodies.end();
71                        ++i) 
72                {
73                        (*i)->setDamping(0.05, 0.85);
74                        (*i)->setDeactivationTime(0.8);
75                        (*i)->setSleepingThresholds(1.6, 2.5);
76                }
77
78                // Now setup the constraints
79                btHingeConstraint* hingeC;
80                btConeTwistConstraint* coneC;
81                btTransform localA, localB;
82
83                // for
84                {
85                        localA.setIdentity(); localB.setIdentity();
86                        localA.getBasis().setEulerZYX(0, Ogre::Math::TWO_PI,0); 
87                        localA.setOrigin(btVector3(btScalar(0.), btScalar(0.15), btScalar(0.)));
88                        localB.getBasis().setEulerZYX(0,Ogre::Math::TWO_PI,0); 
89                        localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.15), btScalar(0.)));
90                        hingeC =  new btHingeConstraint(*m_bodies[0], *m_bodies[1], 
91                                localA, localB);
92                        hingeC->setLimit(btScalar(-Ogre::Math::TWO_PI*2), btScalar(Ogre::Math::TWO_PI));
93                        m_joints.push_back(hingeC);
94                        m_ownerWorld->addConstraint(hingeC, true);
95                }
96
97        }
98    // -------------------------------------------------------------------------
99        RagDoll::~RagDoll ()
100        {
101                std::vector<btCollisionShape* >  m_shapes;
102                std::vector<btRigidBody* >               m_bodies;
103                std::vector<btTypedConstraint* > m_joints;
104                // Remove all constraints
105                for(std::vector<btTypedConstraint* >::iterator i=m_joints.begin();
106                        i!=m_joints.end();
107                        ++i) 
108                {
109                        m_ownerWorld->removeConstraint(*i);
110                        delete *i;
111                }
112
113                // Remove all bodies and shapes
114                for(std::vector<btRigidBody* >::iterator i=m_bodies.begin();
115                        i!=m_bodies.end();
116                        ++i) 
117                {
118                        m_ownerWorld->removeRigidBody(*i);
119
120                        delete (*i)->getMotionState();
121                        delete *i;
122                }
123                for(std::vector<btCollisionShape* >::iterator i=m_shapes.begin();
124                        i!=m_shapes.end();
125                        ++i) 
126                {
127                        delete *i;
128                }
129        }
130        // -------------------------------------------------------------------------
131        btRigidBody* RagDoll::localCreateRigidBody (btScalar mass, 
132                const btTransform& startTransform, 
133                btCollisionShape* shape)
134        {
135                bool isDynamic = (mass != 0.f);
136
137                btVector3 localInertia(0,0,0);
138                if (isDynamic)
139                        shape->calculateLocalInertia(mass,localInertia);
140
141                btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform);
142
143                btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,shape,localInertia);
144                btRigidBody* body = new btRigidBody(rbInfo);
145
146                m_ownerWorld->addRigidBody(body);
147
148                return body;
149        }
150}
151
Note: See TracBrowser for help on using the repository browser.