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