2
* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org
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.
19
#ifndef B2_WHEEL_JOINT_H
20
#define B2_WHEEL_JOINT_H
22
#include <Box2D/Dynamics/Joints/b2Joint.h>
24
/// Wheel 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
// emscripten - b2WheelJointDef: add functions to set/get base class members
31
struct b2WheelJointDef : public b2JointDef
36
localAnchorA.SetZero();
37
localAnchorB.SetZero();
38
localAxisA.Set(1.0f, 0.0f);
40
maxMotorTorque = 0.0f;
46
/// Initialize the bodies, anchors, axis, and reference angle using the world
47
/// anchor and world axis.
48
void Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor, const b2Vec2& axis);
50
/// The local anchor point relative to bodyA's origin.
53
/// The local anchor point relative to bodyB's origin.
56
/// The local translation axis in bodyA.
59
/// Enable/disable the joint motor.
62
/// The maximum motor torque, usually in N-m.
63
float32 maxMotorTorque;
65
/// The desired motor speed in radians per second.
68
/// Suspension frequency, zero indicates no suspension
71
/// Suspension damping ratio, one indicates critical damping
74
// to generate javascript bindings
75
void set_bodyA(b2Body* b) { bodyA = b; }
76
void set_bodyB(b2Body* b) { bodyB = b; }
77
void set_collideConnected(bool b) { collideConnected = b; }
78
b2Body* get_bodyA(b2Body* b) { return bodyA; }
79
b2Body* get_bodyB(b2Body* b) { return bodyB; }
80
bool get_collideConnected(bool b) { return collideConnected; }
83
/// A wheel joint. This joint provides two degrees of freedom: translation
84
/// along an axis fixed in bodyA and rotation in the plane. You can use a
85
/// joint limit to restrict the range of motion and a joint motor to drive
86
/// the rotation or to model rotational friction.
87
/// This joint is designed for vehicle suspensions.
88
// emscripten - b2WheelJoint: make constructor public
89
class b2WheelJoint : public b2Joint
92
void GetDefinition(b2WheelJointDef* def) const;
94
b2Vec2 GetAnchorA() const;
95
b2Vec2 GetAnchorB() const;
97
b2Vec2 GetReactionForce(float32 inv_dt) const;
98
float32 GetReactionTorque(float32 inv_dt) const;
100
/// The local anchor point relative to bodyA's origin.
101
const b2Vec2& GetLocalAnchorA() const { return m_localAnchorA; }
103
/// The local anchor point relative to bodyB's origin.
104
const b2Vec2& GetLocalAnchorB() const { return m_localAnchorB; }
106
/// The local joint axis relative to bodyA.
107
const b2Vec2& GetLocalAxisA() const { return m_localXAxisA; }
109
/// Get the current joint translation, usually in meters.
110
float32 GetJointTranslation() const;
112
/// Get the current joint translation speed, usually in meters per second.
113
float32 GetJointSpeed() const;
115
/// Is the joint motor enabled?
116
bool IsMotorEnabled() const;
118
/// Enable/disable the joint motor.
119
void EnableMotor(bool flag);
121
/// Set the motor speed, usually in radians per second.
122
void SetMotorSpeed(float32 speed);
124
/// Get the motor speed, usually in radians per second.
125
float32 GetMotorSpeed() const;
127
/// Set/Get the maximum motor force, usually in N-m.
128
void SetMaxMotorTorque(float32 torque);
129
float32 GetMaxMotorTorque() const;
131
/// Get the current motor torque given the inverse time step, usually in N-m.
132
float32 GetMotorTorque(float32 inv_dt) const;
134
/// Set/Get the spring frequency in hertz. Setting the frequency to zero disables the spring.
135
void SetSpringFrequencyHz(float32 hz);
136
float32 GetSpringFrequencyHz() const;
138
/// Set/Get the spring damping ratio
139
void SetSpringDampingRatio(float32 ratio);
140
float32 GetSpringDampingRatio() const;
145
b2WheelJoint(const b2WheelJointDef* def);
149
friend class b2Joint;
151
void InitVelocityConstraints(const b2SolverData& data);
152
void SolveVelocityConstraints(const b2SolverData& data);
153
bool SolvePositionConstraints(const b2SolverData& data);
155
float32 m_frequencyHz;
156
float32 m_dampingRatio;
159
b2Vec2 m_localAnchorA;
160
b2Vec2 m_localAnchorB;
161
b2Vec2 m_localXAxisA;
162
b2Vec2 m_localYAxisA;
165
float32 m_motorImpulse;
166
float32 m_springImpulse;
168
float32 m_maxMotorTorque;
169
float32 m_motorSpeed;
175
b2Vec2 m_localCenterA;
176
b2Vec2 m_localCenterB;
183
float32 m_sAx, m_sBx;
184
float32 m_sAy, m_sBy;
188
float32 m_springMass;
194
inline float32 b2WheelJoint::GetMotorSpeed() const
199
inline float32 b2WheelJoint::GetMaxMotorTorque() const
201
return m_maxMotorTorque;
204
inline void b2WheelJoint::SetSpringFrequencyHz(float32 hz)
209
inline float32 b2WheelJoint::GetSpringFrequencyHz() const
211
return m_frequencyHz;
214
inline void b2WheelJoint::SetSpringDampingRatio(float32 ratio)
216
m_dampingRatio = ratio;
219
inline float32 b2WheelJoint::GetSpringDampingRatio() const
221
return m_dampingRatio;