PenaltyRestingContact.h

00001 /****************************************************************************
00002  * Copyright 2006 Evan Drumwright
00003  * This library is distributed under the terms of the GNU General Public 
00004  * License (found in COPYING).
00005  ****************************************************************************/
00006 
00007 #ifndef _PENALTY_RESTING_CONTACT_H
00008 #define _PENALTY_RESTING_CONTACT_H
00009 
00010 #include <list>
00011 #include <boost/shared_ptr.hpp>
00012 #include <Physsim/Triangle.h>
00013 #include <Physsim/RestingContactMethod.h>
00014 
00015 namespace Physsim {
00016 
00017 class Contact;
00018 
00020 class StaticFrictionInfo : public Base
00021 {
00022         friend class PenaltyRestingContact;
00023 
00024         public:
00025                 StaticFrictionInfo(CollisionGeometryPtr geom1, CollisionGeometryPtr geom2, const Vector3& contact_point);
00026                 StaticFrictionInfo() {}
00027                 Vector3 calc_contact_point(RigidBodyPtr rb) const;
00028                 Vector3 calc_contact_point(CollisionGeometryPtr geom) const;
00029                 sorted_pair<CollisionGeometryPtr> get_geometries() const { return make_sorted_pair(_geom1, _geom2); }
00030                 void set_geometries(CollisionGeometryPtr geom1, CollisionGeometryPtr geom2, const Vector3& contact_point);
00031                 virtual void load_from_xml(XMLTreeConstPtr node, std::map<std::string, BasePtr>& id_map);
00032                 virtual void save_to_xml(XMLTreePtr node, std::list<BaseConstPtr>& shared_objects) const;
00033 
00034         private:
00036                 CollisionGeometryPtr _geom1, _geom2;            
00037 
00039                 Vector3 _p1_rel, _p2_rel;
00040 };
00041 
00043 class PenaltyRestingContact : public RestingContactMethod
00044 {
00045         public:
00046                 PenaltyRestingContact() { _analytic_fs_calc = false; }
00047                 virtual void clone(BasePtr& cloned, bimap<BasePtr, BasePtr>* obj_map = NULL) const;
00048                 virtual void load_state(BaseConstPtr object, bimap<BasePtr, BasePtr>* correspondence = NULL);
00049                 virtual void save_state(BasePtr object, bimap<BasePtr, BasePtr>* correspondence = NULL) const;
00050                 virtual void process_resting_contacts(const std::list<ContactPtr >& contacts);
00051                 virtual void load_from_xml(XMLTreeConstPtr node, std::map<std::string, BasePtr>& id_map);
00052                 virtual void save_to_xml(XMLTreePtr node, std::list<BaseConstPtr>& shared_objects) const;
00053 
00055                 virtual bool is_global_method() const { return false; }
00056 
00057         private:
00058 
00060                 bool _analytic_fs_calc;
00061 
00063                 std::map<sorted_pair<RigidBodyPtr>, Real> _integrative;
00064 
00066                 std::map<sorted_pair<CollisionGeometryPtr>, std::list<StaticFrictionInfo> > _fs_points;
00067 
00068                 static bool is_sticking_friction(const std::list<ContactPtr>& contacts);
00069                 static void det_sticking_friction_forces(const std::list<ContactPtr>& contacts);
00070                 void det_corrective_sticking_friction_forces(ContactPtr c);
00071                 static void det_sliding_friction_forces(ContactPtr c);
00072                 static Real det_spring_forces(ContactPtr c);
00073                 void det_integrative_mag(std::list<ContactPtr>& contacts, Real max_pdepth);
00074 }; // end class
00075 
00076 } // end namespace
00077 
00078 #endif
00079 

Generated on Wed Oct 24 14:54:21 2007 for Physsim by  doxygen 1.5.1