Changeset 2124 for code/branches/physics/src
- Timestamp:
- Nov 2, 2008, 8:43:36 PM (16 years ago)
- Location:
- code/branches/physics/src/orxonox/objects
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/physics/src/orxonox/objects/HelloBullet.cc
r2119 r2124 40 40 #include "core/ConfigValueIncludes.h" 41 41 #include "core/XMLPort.h" 42 #include " GraphicsEngine.h"42 #include "objects/Scene.h" 43 43 44 44 #include "util/Sleep.h" … … 49 49 CreateFactory(HelloBullet); 50 50 51 HelloBullet::HelloBullet() 51 HelloBullet::HelloBullet(BaseObject* creator) 52 : BaseObject(creator) 52 53 { 53 54 RegisterObject(HelloBullet); … … 94 95 95 96 //load floor mash 96 Ogre::SceneManager* sceneMgr = GraphicsEngine::getInstance().getLevelSceneManager();97 Ogre::SceneManager* sceneMgr = creator->getScene()->getSceneManager(); 97 98 98 99 int i = 0; -
code/branches/physics/src/orxonox/objects/HelloBullet.h
r2119 r2124 42 42 { 43 43 public: 44 HelloBullet( );44 HelloBullet(BaseObject* creator); 45 45 virtual ~HelloBullet(); 46 46 void setConfigValues(); -
code/branches/physics/src/orxonox/objects/PhysicsTest.cc
r2119 r2124 40 40 #include "core/XMLPort.h" 41 41 #include "GraphicsEngine.h" 42 #include "Scene.h" 42 43 43 44 namespace orxonox … … 45 46 CreateFactory(PhysicsTest); 46 47 47 PhysicsTest::PhysicsTest() 48 : odeWorld_(0) 48 PhysicsTest::PhysicsTest(BaseObject* creator) 49 : BaseObject(creator) 50 , odeWorld_(0) 49 51 , odeSpace_(0) 50 52 , odeStepper_(0) … … 84 86 SUPER(PhysicsTest, XMLPort, xmlelement, mode); 85 87 86 Ogre::SceneManager* sceneMgr = GraphicsEngine::getInstance().getLevelSceneManager();88 Ogre::SceneManager* sceneMgr = this->getScene()->getSceneManager(); 87 89 88 90 // set up OgreOde … … 103 105 const Ogre::Real time_scale = Ogre::Real(1.7); 104 106 const Ogre::Real max_frame_time = Ogre::Real(1.0 / 4); 105 odeStepper_ = new OgreOde::StepHandler(odeWorld_, OgreOde::StepHandler::QuickStep, _time_step,107 odeStepper_ = new OgreOde::StepHandler(odeWorld_, OgreOde::StepHandler::QuickStep, _time_step, 106 108 max_frame_time, time_scale); 107 109 108 110 109 // Create a hanging crate111 // create a plane in x-z dimensions. 110 112 111 113 odeGround_ = new OgreOde::InfinitePlaneGeometry(Ogre::Plane(Ogre::Vector3(0,1,0),0), 112 114 odeWorld_, odeWorld_->getDefaultSpace()); 113 115 114 CollidingObject* collidingObject = new CollidingObject(); 115 116 odeGround_->setUserObject(static_cast<CollisionTestedObject*>(collidingObject)); 116 CollidingObject* collidingObject = new CollidingObject(); 117 odeGround_->setUserObject(static_cast<CollisionTestedObject*>(collidingObject)); 117 118 118 119 // Use a load of meshes to represent the floor … … 139 140 140 141 141 // create a plane in x-z dimensions.142 // create a hanging crate 142 143 143 144 entity_ = sceneMgr->createEntity("crate","crate.mesh"); … … 147 148 entity_->setNormaliseNormals(true); 148 149 entity_->setCastShadows(true); 149 150 150 151 151 odeBody_ = new OgreOde::Body(odeWorld_); … … 178 178 } 179 179 180 bool PhysicsTest::collision(OgreOde::Contact *Contact)181 { 182 183 OgreOde::Geometry * const g1 = Contact->getFirstGeometry();184 OgreOde::Geometry * const g2 = Contact->getSecondGeometry();185 186 187 188 189 const OgreOde::Body * constb2 = g1->getBody();190 191 192 193 194 195 Contact->setBouncyness(1.0);196 Contact->setCoulombFriction(OgreOde::Utility::Infinity);197 Contact->setForceDependentSlip(1.0);198 Contact->setAdditionalFDS(1.0);199 200 /*we have 2 collidable objects from our object system, if one of the Collide function returns false, e return false in this method, too, else we return true, so ode computes a normal collision.201 true means ode will treat this like a normal collison => rigid body behavior202 false means ode will not treat this collision at all => objects ignore each other*/203 204 bool Return= true;205 180 bool PhysicsTest::collision(OgreOde::Contact* contact) 181 { 182 // Check for collisions between things that are connected and ignore them 183 OgreOde::Geometry * const g1 = contact->getFirstGeometry(); 184 OgreOde::Geometry * const g2 = contact->getSecondGeometry(); 185 186 if (g1 && g2) 187 { 188 const OgreOde::Body * const b1 = g2->getBody(); 189 const OgreOde::Body * const b2 = g1->getBody(); 190 if (b1 && b2 && OgreOde::Joint::areConnected(b1, b2)) 191 return false; 192 } 193 194 //set contact parameters: 195 contact->setBouncyness(1.0); 196 contact->setCoulombFriction(OgreOde::Utility::Infinity); 197 contact->setForceDependentSlip(1.0); 198 contact->setAdditionalFDS(1.0); 199 200 // we have 2 collidable objects from our object system, if one of the Collide function returns false, e return false in this method, too, else we return true, so ode computes a normal collision. 201 // true means ode will treat this like a normal collison => rigid body behavior 202 // false means ode will not treat this collision at all => objects ignore each other 203 204 bool res = true; 205 206 206 if (g1->getUserObject()) 207 if (!static_cast<CollisionTestedObject*>(g1->getUserObject())->Collide(true, Contact))208 Return= false;209 207 if (!static_cast<CollisionTestedObject*>(g1->getUserObject())->collide(true, contact)) 208 res = false; 209 210 210 if (g2->getUserObject()) 211 if (!static_cast<CollisionTestedObject*>(g2->getUserObject())->Collide(false, Contact))212 Return= false;213 214 return Return;215 } 216 217 bool CollidingObject::Collide(bool MineIsFirst, OgreOde::Contact *Contact)218 219 Contact->setForceDependentSlip(Contact->getForceDependentSlip() * ForceDependentSlip);220 Contact->setAdditionalFDS(Contact->getForceDependentSlip2() * ForceDependentSlip);221 Contact->setCoulombFriction(Contact->getCoulombFrictionMu() * Friction);222 Contact->setBouncyness(Contact->getBouncyness() * Bouncyness, Contact->getBouncynessVelocity() * BounceVelocity);223 224 211 if (!static_cast<CollisionTestedObject*>(g2->getUserObject())->collide(false, contact)) 212 res = false; 213 214 return res; 215 } 216 217 bool CollidingObject::Collide(bool MineIsFirst, OgreOde::Contact* contact) 218 { 219 contact->setForceDependentSlip(contact->getForceDependentSlip() * ForceDependentSlip); 220 contact->setAdditionalFDS(contact->getForceDependentSlip2() * ForceDependentSlip); 221 contact->setCoulombFriction(contact->getCoulombFrictionMu() * Friction); 222 contact->setBouncyness(contact->getBouncyness() * Bouncyness, contact->getBouncynessVelocity() * BounceVelocity); 223 return true; 224 } 225 225 226 226 } -
code/branches/physics/src/orxonox/objects/PhysicsTest.h
r2119 r2124 42 42 { 43 43 public: 44 PhysicsTest( );44 PhysicsTest(BaseObject* creator); 45 45 virtual ~PhysicsTest(); 46 46 void setConfigValues(); … … 66 66 67 67 68 class _OrxonoxExport CollisionTestedObject69 {70 71 72 73 virtual bool Collide(bool MineIsFirst, OgreOde::Contact *Contact) = 0;74 };68 class _OrxonoxExport CollisionTestedObject 69 { 70 public: 71 CollisionTestedObject(void); 72 virtual ~CollisionTestedObject(void); 73 virtual bool Collide(bool bMineFirst, OgreOde::Contact* contact) = 0; 74 }; 75 75 76 class _OrxonoxExport CollidingObject : public virtual CollisionTestedObject 77 { 78 protected: 79 float Friction; 80 float Bouncyness; 81 float BounceVelocity; 82 float ForceDependentSlip; 83 84 public: 85 CollidingObject(void); 86 virtual ~CollidingObject(void); 87 88 // bool virtual WriteToIni(IniFile& Ini) const; 89 // bool virtual LoadFromIni(const std::basic_string<wchar_t>& ObjectID, IniFile& Ini); 90 91 float GetFriction(void) const {return Friction;} 92 float GetBouncyness(void) const {return Bouncyness;} 93 float GetBounceVelocity(void) const {return BounceVelocity;} 94 float GetFDS(void) const {return ForceDependentSlip;} 95 96 virtual bool Collide(bool MineIsFirst, OgreOde::Contact *Contact); 97 98 private: 99 static const wchar_t* KEY_FRICTION; 100 static const float DEF_FRICTION; 101 static const wchar_t* KEY_BOUNCYNESS; 102 static const float DEF_BOUNCYNESS; 103 static const wchar_t* KEY_FDS; 104 static const float DEF_FDS; 105 static const wchar_t* KEY_BOUNCE_VELO; 106 static const float DEF_BOUNCE_VELO; 107 }; 76 class _OrxonoxExport CollidingObject : virtual public CollisionTestedObject 77 { 78 protected: 79 float friction_; 80 float bouncyness_; 81 float bounceVelocity_; 82 float forceDependentSlip_; 83 84 public: 85 CollidingObject(void); 86 virtual ~CollidingObject(void); 87 88 //virtual bool writeToIni(IniFile& ini) const; 89 //virtual bool loadFromIni(const std::basic_string<wchar_t>& objectID, IniFile& ini); 90 91 float getFriction(void) const {return friction_;} 92 float getBouncyness(void) const {return bouncyness_;} 93 float getBounceVelocity(void) const {return bounceVelocity_;} 94 float getFDS(void) const {return forceDependentSlip_;} 95 96 virtual bool collide(bool bMineFirst, OgreOde::Contact *contact); 97 98 private: 99 //static const wchar_t* KEY_FRICTION; 100 //static const float DEF_FRICTION; 101 //static const wchar_t* KEY_BOUNCYNESS; 102 //static const float DEF_BOUNCYNESS; 103 //static const wchar_t* KEY_FDS; 104 //static const float DEF_FDS; 105 //static const wchar_t* KEY_BOUNCE_VELO; 106 //static const float DEF_BOUNCE_VELO; 107 108 }; 108 109 109 110 }
Note: See TracChangeset
for help on using the changeset viewer.