00001
00002
00003
00004
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 };
00075
00076 }
00077
00078 #endif
00079