00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef _OGREBULLETDYNAMICS_RigidObject_H
00032 #define _OGREBULLETDYNAMICS_RigidObject_H
00033
00034 #include "OgreBulletDynamicsPreRequisites.h"
00035
00036 #include "OgreBulletCollisionsObject.h"
00037 #include "OgreBulletCollisionsWorld.h"
00038 #include "Utils/OgreBulletConverter.h"
00039
00040 #include "OgreBulletDynamicsWorld.h"
00041
00042 #include "Constraints/OgreBulletDynamicsRaycastVehicle.h"
00043 #include "BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h"
00044
00045 namespace OgreBulletDynamics
00046 {
00047
00048
00049 class RigidBody : public OgreBulletCollisions::Object
00050 {
00051 public:
00052 RigidBody(const Ogre::String &name,
00053 DynamicsWorld *world,
00054 const short collisionGroup = 0,
00055 const short collisionMask = 0);
00056
00057 virtual ~RigidBody();
00058
00059 void setShape(Ogre::SceneNode *node,
00060 OgreBulletCollisions::CollisionShape *shape,
00061 const float bodyRestitution,
00062 const float bodyFriction,
00063 const float bodyMass,
00064 const Ogre::Vector3 &pos = Ogre::Vector3::ZERO,
00065 const Ogre::Quaternion &quat = Ogre::Quaternion::IDENTITY);
00066
00067 void setStaticShape(Ogre::SceneNode *node,
00068 OgreBulletCollisions::CollisionShape *shape,
00069 const float bodyRestitution,
00070 const float bodyFriction,
00071 const Ogre::Vector3 &pos = Ogre::Vector3::ZERO,
00072 const Ogre::Quaternion &quat = Ogre::Quaternion::IDENTITY);
00073
00074
00075 void setStaticShape(btScaledBvhTriangleMeshShape *shape,
00076 const float bodyRestitution,
00077 const float bodyFriction,
00078 const Ogre::Vector3 &pos = Ogre::Vector3::ZERO,
00079 const Ogre::Quaternion &quat = Ogre::Quaternion::IDENTITY);
00080
00081
00082 void setStaticShape(OgreBulletCollisions::CollisionShape *shape,
00083 const float bodyRestitution,
00084 const float bodyFriction,
00085 const Ogre::Vector3 &pos = Ogre::Vector3::ZERO,
00086 const Ogre::Quaternion &quat = Ogre::Quaternion::IDENTITY);
00087
00088
00089 void setLinearVelocity(const Ogre::Vector3 &vel);
00090 void setLinearVelocity(const Ogre::Real x, const Ogre::Real y, const Ogre::Real z);
00091 Ogre::Vector3 getLinearVelocity();
00092 void applyImpulse(const Ogre::Vector3 &impulse, const Ogre::Vector3 &position);
00093 void applyForce(const Ogre::Vector3 &impulse, const Ogre::Vector3 &position);
00094
00095
00096 inline btRigidBody* getBulletRigidBody() const;
00097 inline btDynamicsWorld* getBulletDynamicsWorld() const;
00098 inline DynamicsWorld* getDynamicsWorld();
00099
00100 Ogre::SceneNode* getSceneNode() const {return mRootNode;};
00101
00102 inline bool isStaticObject() const;
00103 inline bool isKinematicObject() const;
00104
00105 void setKinematicObject(bool isKinematic);
00106
00107 inline void disableDeactivation();
00108 inline void enableActiveState ();
00109 inline void forceActivationState();
00110 void setDeactivationTime(const float ftime);
00111
00112 inline const btTransform &getCenterOfMassTransform() const;
00113 inline Ogre::Quaternion getCenterOfMassOrientation () const;
00114 inline Ogre::Vector3 getCenterOfMassPosition() const;
00115
00116 Ogre::Vector3 getCenterOfMassPivot (const Ogre::Vector3 &pivotPosition) const;
00117
00118 void setDamping( const Ogre::Real linearDamping, const Ogre::Real angularDamping );
00119 protected:
00120 short mCollisionGroup;
00121 short mCollisionMask;
00122 };
00123
00124
00125 class WheeledRigidBody : public RigidBody
00126 {
00127 public:
00128 WheeledRigidBody(const Ogre::String &name, DynamicsWorld *world):
00129 RigidBody(name, world),
00130 mVehicle(0)
00131 {
00132 };
00133
00134
00135 void setVehicle(RaycastVehicle *v){mVehicle = v;};
00136
00137 virtual void setPosition(const btVector3 &pos);
00138 virtual void setOrientation(const btQuaternion &quat);
00139 virtual void setTransform(const btVector3 &pos, const btQuaternion &quat);
00140 virtual void setTransform(const btTransform& worldTrans);
00141
00142 virtual ~WheeledRigidBody(){};
00143
00144 protected:
00145 RaycastVehicle *mVehicle;
00146
00147 };
00148
00149
00150
00151 inline btRigidBody* RigidBody::getBulletRigidBody() const
00152 {
00153 return static_cast <btRigidBody* > (mObject);
00154 };
00155
00156 inline btDynamicsWorld* RigidBody::getBulletDynamicsWorld() const
00157 {
00158 return static_cast <btDynamicsWorld * > (mWorld->getBulletCollisionWorld ());
00159 };
00160
00161 inline DynamicsWorld* RigidBody::getDynamicsWorld()
00162 {
00163 return static_cast <DynamicsWorld* > (mWorld);
00164 };
00165
00166 inline bool RigidBody::isStaticObject() const
00167 {
00168 return getBulletRigidBody()->isStaticObject();
00169 }
00170
00171 inline bool RigidBody::isKinematicObject() const
00172 {
00173 return getBulletRigidBody()->isKinematicObject();
00174 };
00175
00176 inline void RigidBody::disableDeactivation()
00177 {
00178 getBulletRigidBody()->setActivationState(DISABLE_DEACTIVATION);
00179 }
00180
00181 inline void RigidBody::enableActiveState()
00182 {
00183 getBulletRigidBody()->setActivationState(ACTIVE_TAG);
00184 }
00185
00186 inline void RigidBody::forceActivationState()
00187 {
00188 getBulletRigidBody()->forceActivationState(ACTIVE_TAG);
00189 }
00190
00191
00192 inline const btTransform &RigidBody::getCenterOfMassTransform() const
00193 {
00194 return getBulletRigidBody()->getCenterOfMassTransform();
00195 }
00196
00197 inline Ogre::Quaternion RigidBody::getCenterOfMassOrientation() const
00198 {
00199 return OgreBulletCollisions::BtOgreConverter::to(getCenterOfMassTransform().getRotation ());
00200 }
00201
00202 inline Ogre::Vector3 RigidBody::getCenterOfMassPosition() const
00203 {
00204 return OgreBulletCollisions::BtOgreConverter::to(getBulletRigidBody()->getCenterOfMassPosition());
00205 }
00206
00207
00208 }
00209 #endif //_OGREBULLETDYNAMICS_RigidObject_H
00210