1 /* 2 * Copyright (c) 2006-2012 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_MOTOR_JOINT_H 20 #define B2_MOTOR_JOINT_H 21 22 #include <Box2D/Dynamics/Joints/b2Joint.h> 23 24 /// Motor joint definition. 25 struct b2MotorJointDef : public b2JointDef 26 { b2MotorJointDefb2MotorJointDef27 b2MotorJointDef() 28 { 29 type = e_motorJoint; 30 linearOffset.SetZero(); 31 angularOffset = 0.0f; 32 maxForce = 1.0f; 33 maxTorque = 1.0f; 34 correctionFactor = 0.3f; 35 } 36 37 /// Initialize the bodies and offsets using the current transforms. 38 void Initialize(b2Body* bodyA, b2Body* bodyB); 39 40 /// Position of bodyB minus the position of bodyA, in bodyA's frame, in meters. 41 b2Vec2 linearOffset; 42 43 /// The bodyB angle minus bodyA angle in radians. 44 float32 angularOffset; 45 46 /// The maximum motor force in N. 47 float32 maxForce; 48 49 /// The maximum motor torque in N-m. 50 float32 maxTorque; 51 52 /// Position correction factor in the range [0,1]. 53 float32 correctionFactor; 54 }; 55 56 /// A motor joint is used to control the relative motion 57 /// between two bodies. A typical usage is to control the movement 58 /// of a dynamic body with respect to the ground. 59 class b2MotorJoint : public b2Joint 60 { 61 public: 62 b2Vec2 GetAnchorA() const; 63 b2Vec2 GetAnchorB() const; 64 65 b2Vec2 GetReactionForce(float32 inv_dt) const; 66 float32 GetReactionTorque(float32 inv_dt) const; 67 68 /// Set/get the target linear offset, in frame A, in meters. 69 void SetLinearOffset(const b2Vec2& linearOffset); 70 const b2Vec2& GetLinearOffset() const; 71 72 /// Set/get the target angular offset, in radians. 73 void SetAngularOffset(float32 angularOffset); 74 float32 GetAngularOffset() const; 75 76 /// Set the maximum friction force in N. 77 void SetMaxForce(float32 force); 78 79 /// Get the maximum friction force in N. 80 float32 GetMaxForce() const; 81 82 /// Set the maximum friction torque in N*m. 83 void SetMaxTorque(float32 torque); 84 85 /// Get the maximum friction torque in N*m. 86 float32 GetMaxTorque() const; 87 88 /// Set the position correction factor in the range [0,1]. 89 void SetCorrectionFactor(float32 factor); 90 91 /// Get the position correction factor in the range [0,1]. 92 float32 GetCorrectionFactor() const; 93 94 /// Dump to b2Log 95 void Dump(); 96 97 protected: 98 99 friend class b2Joint; 100 101 b2MotorJoint(const b2MotorJointDef* def); 102 103 void InitVelocityConstraints(const b2SolverData& data); 104 void SolveVelocityConstraints(const b2SolverData& data); 105 bool SolvePositionConstraints(const b2SolverData& data); 106 107 // Solver shared 108 b2Vec2 m_linearOffset; 109 float32 m_angularOffset; 110 b2Vec2 m_linearImpulse; 111 float32 m_angularImpulse; 112 float32 m_maxForce; 113 float32 m_maxTorque; 114 float32 m_correctionFactor; 115 116 // Solver temp 117 int32 m_indexA; 118 int32 m_indexB; 119 b2Vec2 m_rA; 120 b2Vec2 m_rB; 121 b2Vec2 m_localCenterA; 122 b2Vec2 m_localCenterB; 123 b2Vec2 m_linearError; 124 float32 m_angularError; 125 float32 m_invMassA; 126 float32 m_invMassB; 127 float32 m_invIA; 128 float32 m_invIB; 129 b2Mat22 m_linearMass; 130 float32 m_angularMass; 131 }; 132 133 #endif 134