MCArticulatedBody.h

00001 
00002 /****************************************************************************
00003  * Copyright 2007 Evan Drumwright
00004  * This library is distributed under the terms of the GNU General Public 
00005  * License (found in COPYING).
00006  ****************************************************************************/
00007 
00008 #ifndef _MC_ARTICULATED_BODY_H
00009 #define _MC_ARTICULATED_BODY_H
00010 
00011 #include <pthread.h>
00012 #include <map>
00013 #include <list>
00014 #include <vector>
00015 #include <ext/hash_map>
00016 #include <boost/shared_ptr.hpp>
00017 #include <Physsim/Constants.h>
00018 #include <Physsim/HashClasses.h>
00019 #include <Physsim/SVector6.h>
00020 #include <Physsim/Vector3.h>
00021 #include <Physsim/Matrix3.h>
00022 #include <Physsim/ArticulatedBody.h>
00023 
00024 namespace Physsim {
00025 
00026 class RigidBody;
00027 
00029 
00040 class MCArticulatedBody : public ArticulatedBody
00041 {
00042         public:
00043                 MCArticulatedBody();
00044                 MCArticulatedBody(const MCArticulatedBody& source);
00045                 virtual ~MCArticulatedBody() {}
00046                 virtual void clone(BasePtr& cloned, bimap<BasePtr, BasePtr>* obj_map = NULL) const;
00047                 virtual bool is_struct_identical(BaseConstPtr object) 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                 void set_links(const std::vector<ArticulatedBodyLinkPtr>& links);
00051                 RigidBodyPtr find_link(const std::string& linkname) const;
00052                 MCArticulatedBodyJointPtr find_joint(const std::string& jointname) const;
00053                 void add_link(MCArticulatedBodyLinkPtr link);
00054                 virtual VectorN get_state_deriv();
00055                 virtual VectorN get_state();
00056                 virtual void set_state(const VectorN& state);
00057                 MatrixNPtr calc_jacobian_column(MCMCArticulatedBodyJointPtr joint, const Vector3& point);
00058                 MatrixNNPtr calc_jacobian_floating_base(const VectorN& point);
00059                 virtual std::list<RigidBodyPtr> get_rigid_bodies() const;
00060                 virtual void reset_accumulators();
00061                 virtual std::list<sorted_pair<RigidBodyPtr> > get_adjacent_links() const;
00062                 void add_joint(MCArticulatedBodyJointPtr joint);
00063                 void set_joints(const std::vector<MCArticulatedBodyJointPtr> joints);
00064                 void update_link_transforms() const;            
00065                 void update_link_velocities();
00066                 void apply_impulse(const Vector3& j, const Vector3& k, const Vector3& contact_point, MCArticulatedBodyLinkPtr link);
00067                 virtual void compile();
00068                 virtual void calc_fwd_dyn();
00069                 virtual void update_visualization();
00070                 virtual void load_from_xml(XMLTreeConstPtr node, std::map<std::string, BasePtr>& id_map);
00071                 virtual void save_to_xml(XMLTreePtr node, std::list<BaseConstPtr>& shared_objects) const;
00072                 MCArticulatedBodyPtr get_this() { return boost::dynamic_pointer_cast<MCArticulatedBody>(shared_from_this()); }
00073                 MCArticulatedBodyConstPtr get_this() const { return boost::dynamic_pointer_cast<const MCArticulatedBody>(shared_from_this()); }
00074 
00075                 // NOTE: the following three methods are currently disabled, pending
00076                 // my decision on whether to keep them...               
00077                 virtual bool joint_limit_collision(Real collision_tolerance) const { return false; }
00078                 virtual void correct_joint_limit_collisions(Real collision_tolerance) {}
00079                 virtual void correct_joint_limit_violations() {}
00080 
00082                 const std::vector<MCArticulatedBodyLinkPtr>& get_links() const { return _links; }
00083 
00085                 const std::vector<MCArticulatedBodyJointPtr>& get_joints() const { return _joints; }
00086 
00087         private:
00089                 std::vector<MCArticulatedBodyJointPtr> _joints;
00090 
00092                 std::vector<MCArticulatedBodyLinkPtr> _links;
00093 
00095                 std::map<RigidBodyPtr, unsigned> _link_idx_map;
00096 }; // end class
00097 
00098 } // end namespace
00099 #endif
00100 

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