1/* 2* Copyright (c) 2006-2007 Erin Catto http://www.box2d.org 3* 4* This software is provided 'as-is', without any express or implied 5* warranty. In no event will the authors be held liable for any damages 6* arising from the use of this software. 7* Permission is granted to anyone to use this software for any purpose, 8* including commercial applications, and to alter it and redistribute it 9* freely, subject to the following restrictions: 10* 1. The origin of this software must not be misrepresented; you must not 11* claim that you wrote the original software. If you use this software 12* in a product, an acknowledgment in the product documentation would be 13* appreciated but is not required. 14* 2. Altered source versions must be plainly marked as such, and must not be 15* misrepresented as being the original software. 16* 3. This notice may not be removed or altered from any source distribution. 17*/ 18 19#ifndef B2_FRICTION_JOINT_H 20#define B2_FRICTION_JOINT_H 21 22#include <Box2D/Dynamics/Joints/b2Joint.h> 23 24/// Friction joint definition. 25struct b2FrictionJointDef : public b2JointDef 26{ 27 b2FrictionJointDef() 28 { 29 type = e_frictionJoint; 30 localAnchorA.SetZero(); 31 localAnchorB.SetZero(); 32 maxForce = 0.0f; 33 maxTorque = 0.0f; 34 } 35 36 /// Initialize the bodies, anchors, axis, and reference angle using the world 37 /// anchor and world axis. 38 void Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor); 39 40 /// The local anchor point relative to bodyA's origin. 41 b2Vec2 localAnchorA; 42 43 /// The local anchor point relative to bodyB's origin. 44 b2Vec2 localAnchorB; 45 46 /// The maximum friction force in N. 47 float32 maxForce; 48 49 /// The maximum friction torque in N-m. 50 float32 maxTorque; 51}; 52 53/// Friction joint. This is used for top-down friction. 54/// It provides 2D translational friction and angular friction. 55class b2FrictionJoint : public b2Joint 56{ 57public: 58 b2Vec2 GetAnchorA() const; 59 b2Vec2 GetAnchorB() const; 60 61 b2Vec2 GetReactionForce(float32 inv_dt) const; 62 float32 GetReactionTorque(float32 inv_dt) const; 63 64 /// The local anchor point relative to bodyA's origin. 65 const b2Vec2& GetLocalAnchorA() const { return m_localAnchorA; } 66 67 /// The local anchor point relative to bodyB's origin. 68 const b2Vec2& GetLocalAnchorB() const { return m_localAnchorB; } 69 70 /// Set the maximum friction force in N. 71 void SetMaxForce(float32 force); 72 73 /// Get the maximum friction force in N. 74 float32 GetMaxForce() const; 75 76 /// Set the maximum friction torque in N*m. 77 void SetMaxTorque(float32 torque); 78 79 /// Get the maximum friction torque in N*m. 80 float32 GetMaxTorque() const; 81 82 /// Dump joint to dmLog 83 void Dump(); 84 85protected: 86 87 friend class b2Joint; 88 89 b2FrictionJoint(const b2FrictionJointDef* def); 90 91 void InitVelocityConstraints(const b2SolverData& data); 92 void SolveVelocityConstraints(const b2SolverData& data); 93 bool SolvePositionConstraints(const b2SolverData& data); 94 95 b2Vec2 m_localAnchorA; 96 b2Vec2 m_localAnchorB; 97 98 // Solver shared 99 b2Vec2 m_linearImpulse; 100 float32 m_angularImpulse; 101 float32 m_maxForce; 102 float32 m_maxTorque; 103 104 // Solver temp 105 int32 m_indexA; 106 int32 m_indexB; 107 b2Vec2 m_rA; 108 b2Vec2 m_rB; 109 b2Vec2 m_localCenterA; 110 b2Vec2 m_localCenterB; 111 float32 m_invMassA; 112 float32 m_invMassB; 113 float32 m_invIA; 114 float32 m_invIB; 115 b2Mat22 m_linearMass; 116 float32 m_angularMass; 117}; 118 119#endif 120