00001
00002
00003
00004
00005
00006
00007 #ifndef _COLLISION_METHOD_H
00008 #define _COLLISION_METHOD_H
00009
00010 #include <list>
00011 #include <boost/shared_ptr.hpp>
00012 #include <Physsim/Base.h>
00013 #include <Physsim/Matrix3.h>
00014 #include <Physsim/MeasureData.h>
00015
00016 namespace Physsim {
00017
00018 class RigidBody;
00019 class Contact;
00020
00022 class CollisionMethod : public Base
00023 {
00024 public:
00025 CollisionMethod() {}
00026 virtual ~CollisionMethod() {}
00027
00029
00037 virtual void process_impacts(const std::list<ContactPtr>& contacts) const = 0;
00038
00040
00046 virtual bool is_global_method() const = 0;
00047
00048 static bool is_impacting(ContactPtr c);
00049 static bool is_separating(ContactPtr c);
00050
00051 protected:
00052 static Vector3 calc_collision_point(ContactPtr c);
00053 static Matrix3 det_collision_matrix(const Matrix3& contact_frame_transpose, const Vector3& contact_point, RigidBodyPtr body1, boost::shared_ptr<RigidBody> body2);
00054 static void determine_A_b(const std::vector<MeasureData>& ms, MatrixNN& A, VectorN& b);
00055 static void measure_point_vels(const std::vector<MeasureData>& points, VectorN& result);
00056 static void measure_point_vels(const std::vector<MeasureData>& points, VectorN& result, RigidBodyPtr rb1, RigidBodyPtr rb2);
00057 static void measure_sep_vels(const std::vector<MeasureData>& points, VectorN& result);
00058 static void measure_sep_vels(const std::vector<MeasureData>& points, VectorN& result, RigidBodyPtr rb1, RigidBodyPtr rb2);
00059 };
00060
00061 }
00062
00063 #endif
00064