Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Oct 15, 2008, 3:52:33 PM (16 years ago)
Author:
martisty
Message:

Collision detection

Location:
code/branches/physics/src/orxonox/objects
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • code/branches/physics/src/orxonox/objects/PhysicsTest.cc

    r1925 r1933  
    3434#include <OgreEntity.h>
    3535#include "ogreode/OgreOde_Core.h"
     36#include "ogreode/OgreOdeGeometry.h"
    3637#include "util/Convert.h"
    3738#include "core/CoreIncludes.h"
     
    99100        // set up stepper
    100101
    101         const Ogre::Real _time_step = 0.5;
     102        const Ogre::Real _time_step = 0.5;http://isg.ee.ethz.ch/
    102103        const Ogre::Real time_scale = Ogre::Real(1.7);
    103104        const Ogre::Real max_frame_time = Ogre::Real(1.0 / 4);
     
    110111        odeGround_ = new OgreOde::InfinitePlaneGeometry(Ogre::Plane(Ogre::Vector3(0,1,0),0),
    111112            odeWorld_, odeWorld_->getDefaultSpace());
     113
     114        CollidingObject* collidingObject = new CollidingObject();
     115       
     116        odeGround_->setUserObject(static_cast<CollisionTestedObject*>(collidingObject));
     117
    112118        // Use a load of meshes to represent the floor
    113119        int i = 0;
     
    128134                floor->addEntity(entity, Ogre::Vector3(x,0,z));
    129135            }
    130         }
     136        }       
     137
    131138        floor->build();
    132139
     
    156163        odeGeom_->setBody(odeBody_);
    157164        entity_->setUserObject(odeGeom_);
     165        odeGeom_->setUserObject(static_cast<CollisionTestedObject*>(this));
     166
    158167
    159168        odeBody_->setOrientation(Quaternion(Degree(30.0), Vector3(0,0,0)));
     
    168177            odeWorld_->synchronise();
    169178    }
     179
     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 Return = true;
     205               
     206        if (g1->getUserObject())
     207                if (!static_cast<CollisionTestedObject*>(g1->getUserObject())->Collide(true, Contact))
     208                        Return = false;
     209       
     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                return true;
     224        }
     225
    170226}
  • code/branches/physics/src/orxonox/objects/PhysicsTest.h

    r1924 r1933  
    6464        bool                            bRunning_;
    6565    };
     66
     67
     68   class _OrxonoxExport CollisionTestedObject
     69   {
     70        public:
     71                CollisionTestedObject(void);
     72                virtual ~CollisionTestedObject(void);
     73                virtual bool Collide(bool MineIsFirst, OgreOde::Contact *Contact) = 0;
     74   };
     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   };
     108
    66109}
    67110
     111
     112
    68113#endif /* _PhysicsTest_H__ */
Note: See TracChangeset for help on using the changeset viewer.