| 1 | /* | 
|---|
| 2 | * Copyright (c) 2006-2011 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_PRISMATIC_JOINT_H | 
|---|
| 20 | #define B2_PRISMATIC_JOINT_H | 
|---|
| 21 |  | 
|---|
| 22 | #include <Box2D/Dynamics/Joints/b2Joint.h> | 
|---|
| 23 |  | 
|---|
| 24 | /// Prismatic joint definition. This requires defining a line of | 
|---|
| 25 | /// motion using an axis and an anchor point. The definition uses local | 
|---|
| 26 | /// anchor points and a local axis so that the initial configuration | 
|---|
| 27 | /// can violate the constraint slightly. The joint translation is zero | 
|---|
| 28 | /// when the local anchor points coincide in world space. Using local | 
|---|
| 29 | /// anchors and a local axis helps when saving and loading a game. | 
|---|
| 30 | struct b2PrismaticJointDef : public b2JointDef | 
|---|
| 31 | { | 
|---|
| 32 | b2PrismaticJointDef() | 
|---|
| 33 | { | 
|---|
| 34 | type = e_prismaticJoint; | 
|---|
| 35 | localAnchorA.SetZero(); | 
|---|
| 36 | localAnchorB.SetZero(); | 
|---|
| 37 | localAxisA.Set(1.0f, 0.0f); | 
|---|
| 38 | referenceAngle = 0.0f; | 
|---|
| 39 | enableLimit = false; | 
|---|
| 40 | lowerTranslation = 0.0f; | 
|---|
| 41 | upperTranslation = 0.0f; | 
|---|
| 42 | enableMotor = false; | 
|---|
| 43 | maxMotorForce = 0.0f; | 
|---|
| 44 | motorSpeed = 0.0f; | 
|---|
| 45 | } | 
|---|
| 46 |  | 
|---|
| 47 | /// Initialize the bodies, anchors, axis, and reference angle using the world | 
|---|
| 48 | /// anchor and unit world axis. | 
|---|
| 49 | void Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor, const b2Vec2& axis); | 
|---|
| 50 |  | 
|---|
| 51 | /// The local anchor point relative to bodyA's origin. | 
|---|
| 52 | b2Vec2 localAnchorA; | 
|---|
| 53 |  | 
|---|
| 54 | /// The local anchor point relative to bodyB's origin. | 
|---|
| 55 | b2Vec2 localAnchorB; | 
|---|
| 56 |  | 
|---|
| 57 | /// The local translation unit axis in bodyA. | 
|---|
| 58 | b2Vec2 localAxisA; | 
|---|
| 59 |  | 
|---|
| 60 | /// The constrained angle between the bodies: bodyB_angle - bodyA_angle. | 
|---|
| 61 | float32 referenceAngle; | 
|---|
| 62 |  | 
|---|
| 63 | /// Enable/disable the joint limit. | 
|---|
| 64 | bool enableLimit; | 
|---|
| 65 |  | 
|---|
| 66 | /// The lower translation limit, usually in meters. | 
|---|
| 67 | float32 lowerTranslation; | 
|---|
| 68 |  | 
|---|
| 69 | /// The upper translation limit, usually in meters. | 
|---|
| 70 | float32 upperTranslation; | 
|---|
| 71 |  | 
|---|
| 72 | /// Enable/disable the joint motor. | 
|---|
| 73 | bool enableMotor; | 
|---|
| 74 |  | 
|---|
| 75 | /// The maximum motor torque, usually in N-m. | 
|---|
| 76 | float32 maxMotorForce; | 
|---|
| 77 |  | 
|---|
| 78 | /// The desired motor speed in radians per second. | 
|---|
| 79 | float32 motorSpeed; | 
|---|
| 80 | }; | 
|---|
| 81 |  | 
|---|
| 82 | /// A prismatic joint. This joint provides one degree of freedom: translation | 
|---|
| 83 | /// along an axis fixed in bodyA. Relative rotation is prevented. You can | 
|---|
| 84 | /// use a joint limit to restrict the range of motion and a joint motor to | 
|---|
| 85 | /// drive the motion or to model joint friction. | 
|---|
| 86 | class b2PrismaticJoint : public b2Joint | 
|---|
| 87 | { | 
|---|
| 88 | public: | 
|---|
| 89 | b2Vec2 GetAnchorA() const; | 
|---|
| 90 | b2Vec2 GetAnchorB() const; | 
|---|
| 91 |  | 
|---|
| 92 | b2Vec2 GetReactionForce(float32 inv_dt) const; | 
|---|
| 93 | float32 GetReactionTorque(float32 inv_dt) const; | 
|---|
| 94 |  | 
|---|
| 95 | /// The local anchor point relative to bodyA's origin. | 
|---|
| 96 | const b2Vec2& GetLocalAnchorA() const { return m_localAnchorA; } | 
|---|
| 97 |  | 
|---|
| 98 | /// The local anchor point relative to bodyB's origin. | 
|---|
| 99 | const b2Vec2& GetLocalAnchorB() const  { return m_localAnchorB; } | 
|---|
| 100 |  | 
|---|
| 101 | /// The local joint axis relative to bodyA. | 
|---|
| 102 | const b2Vec2& GetLocalAxisA() const { return m_localXAxisA; } | 
|---|
| 103 |  | 
|---|
| 104 | /// Get the reference angle. | 
|---|
| 105 | float32 GetReferenceAngle() const { return m_referenceAngle; } | 
|---|
| 106 |  | 
|---|
| 107 | /// Get the current joint translation, usually in meters. | 
|---|
| 108 | float32 GetJointTranslation() const; | 
|---|
| 109 |  | 
|---|
| 110 | /// Get the current joint translation speed, usually in meters per second. | 
|---|
| 111 | float32 GetJointSpeed() const; | 
|---|
| 112 |  | 
|---|
| 113 | /// Is the joint limit enabled? | 
|---|
| 114 | bool IsLimitEnabled() const; | 
|---|
| 115 |  | 
|---|
| 116 | /// Enable/disable the joint limit. | 
|---|
| 117 | void EnableLimit(bool flag); | 
|---|
| 118 |  | 
|---|
| 119 | /// Get the lower joint limit, usually in meters. | 
|---|
| 120 | float32 GetLowerLimit() const; | 
|---|
| 121 |  | 
|---|
| 122 | /// Get the upper joint limit, usually in meters. | 
|---|
| 123 | float32 GetUpperLimit() const; | 
|---|
| 124 |  | 
|---|
| 125 | /// Set the joint limits, usually in meters. | 
|---|
| 126 | void SetLimits(float32 lower, float32 upper); | 
|---|
| 127 |  | 
|---|
| 128 | /// Is the joint motor enabled? | 
|---|
| 129 | bool IsMotorEnabled() const; | 
|---|
| 130 |  | 
|---|
| 131 | /// Enable/disable the joint motor. | 
|---|
| 132 | void EnableMotor(bool flag); | 
|---|
| 133 |  | 
|---|
| 134 | /// Set the motor speed, usually in meters per second. | 
|---|
| 135 | void SetMotorSpeed(float32 speed); | 
|---|
| 136 |  | 
|---|
| 137 | /// Get the motor speed, usually in meters per second. | 
|---|
| 138 | float32 GetMotorSpeed() const; | 
|---|
| 139 |  | 
|---|
| 140 | /// Set the maximum motor force, usually in N. | 
|---|
| 141 | void SetMaxMotorForce(float32 force); | 
|---|
| 142 | float32 GetMaxMotorForce() const { return m_maxMotorForce; } | 
|---|
| 143 |  | 
|---|
| 144 | /// Get the current motor force given the inverse time step, usually in N. | 
|---|
| 145 | float32 GetMotorForce(float32 inv_dt) const; | 
|---|
| 146 |  | 
|---|
| 147 | /// Dump to b2Log | 
|---|
| 148 | void Dump(); | 
|---|
| 149 |  | 
|---|
| 150 | protected: | 
|---|
| 151 | friend class b2Joint; | 
|---|
| 152 | friend class b2GearJoint; | 
|---|
| 153 | b2PrismaticJoint(const b2PrismaticJointDef* def); | 
|---|
| 154 |  | 
|---|
| 155 | void InitVelocityConstraints(const b2SolverData& data); | 
|---|
| 156 | void SolveVelocityConstraints(const b2SolverData& data); | 
|---|
| 157 | bool SolvePositionConstraints(const b2SolverData& data); | 
|---|
| 158 |  | 
|---|
| 159 | // Solver shared | 
|---|
| 160 | b2Vec2 m_localAnchorA; | 
|---|
| 161 | b2Vec2 m_localAnchorB; | 
|---|
| 162 | b2Vec2 m_localXAxisA; | 
|---|
| 163 | b2Vec2 m_localYAxisA; | 
|---|
| 164 | float32 m_referenceAngle; | 
|---|
| 165 | b2Vec3 m_impulse; | 
|---|
| 166 | float32 m_motorImpulse; | 
|---|
| 167 | float32 m_lowerTranslation; | 
|---|
| 168 | float32 m_upperTranslation; | 
|---|
| 169 | float32 m_maxMotorForce; | 
|---|
| 170 | float32 m_motorSpeed; | 
|---|
| 171 | bool m_enableLimit; | 
|---|
| 172 | bool m_enableMotor; | 
|---|
| 173 | b2LimitState m_limitState; | 
|---|
| 174 |  | 
|---|
| 175 | // Solver temp | 
|---|
| 176 | int32 m_indexA; | 
|---|
| 177 | int32 m_indexB; | 
|---|
| 178 | b2Vec2 m_localCenterA; | 
|---|
| 179 | b2Vec2 m_localCenterB; | 
|---|
| 180 | float32 m_invMassA; | 
|---|
| 181 | float32 m_invMassB; | 
|---|
| 182 | float32 m_invIA; | 
|---|
| 183 | float32 m_invIB; | 
|---|
| 184 | b2Vec2 m_axis, m_perp; | 
|---|
| 185 | float32 m_s1, m_s2; | 
|---|
| 186 | float32 m_a1, m_a2; | 
|---|
| 187 | b2Mat33 m_K; | 
|---|
| 188 | float32 m_motorMass; | 
|---|
| 189 | }; | 
|---|
| 190 |  | 
|---|
| 191 | inline float32 b2PrismaticJoint::GetMotorSpeed() const | 
|---|
| 192 | { | 
|---|
| 193 | return m_motorSpeed; | 
|---|
| 194 | } | 
|---|
| 195 |  | 
|---|
| 196 | #endif | 
|---|
| 197 |  | 
|---|