| 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 |  |