b2RevoluteJoint.h
Go to the documentation of this file.
00001 /*
00002 * Copyright (c) 2006-2011 Erin Catto http://www.box2d.org
00003 *
00004 * This software is provided 'as-is', without any express or implied
00005 * warranty.  In no event will the authors be held liable for any damages
00006 * arising from the use of this software.
00007 * Permission is granted to anyone to use this software for any purpose,
00008 * including commercial applications, and to alter it and redistribute it
00009 * freely, subject to the following restrictions:
00010 * 1. The origin of this software must not be misrepresented; you must not
00011 * claim that you wrote the original software. If you use this software
00012 * in a product, an acknowledgment in the product documentation would be
00013 * appreciated but is not required.
00014 * 2. Altered source versions must be plainly marked as such, and must not be
00015 * misrepresented as being the original software.
00016 * 3. This notice may not be removed or altered from any source distribution.
00017 */
00018 
00019 #ifndef B2_REVOLUTE_JOINT_H
00020 #define B2_REVOLUTE_JOINT_H
00021 
00022 #include <Box2D/Dynamics/Joints/b2Joint.h>
00023 
00035 struct b2RevoluteJointDef : public b2JointDef
00036 {
00037         b2RevoluteJointDef()
00038         {
00039                 type = e_revoluteJoint;
00040                 localAnchorA.Set(0.0f, 0.0f);
00041                 localAnchorB.Set(0.0f, 0.0f);
00042                 referenceAngle = 0.0f;
00043                 lowerAngle = 0.0f;
00044                 upperAngle = 0.0f;
00045                 maxMotorTorque = 0.0f;
00046                 motorSpeed = 0.0f;
00047                 enableLimit = false;
00048                 enableMotor = false;
00049         }
00050 
00053         void Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor);
00054 
00056         b2Vec2 localAnchorA;
00057 
00059         b2Vec2 localAnchorB;
00060 
00062         float32 referenceAngle;
00063 
00065         bool enableLimit;
00066 
00068         float32 lowerAngle;
00069 
00071         float32 upperAngle;
00072 
00074         bool enableMotor;
00075 
00077         float32 motorSpeed;
00078 
00081         float32 maxMotorTorque;
00082 };
00083 
00090 class b2RevoluteJoint : public b2Joint
00091 {
00092 public:
00093         b2Vec2 GetAnchorA() const;
00094         b2Vec2 GetAnchorB() const;
00095 
00097         const b2Vec2& GetLocalAnchorA() const { return m_localAnchorA; }
00098 
00100         const b2Vec2& GetLocalAnchorB() const  { return m_localAnchorB; }
00101 
00103         float32 GetReferenceAngle() const { return m_referenceAngle; }
00104 
00106         float32 GetJointAngle() const;
00107 
00109         float32 GetJointSpeed() const;
00110 
00112         bool IsLimitEnabled() const;
00113 
00115         void EnableLimit(bool flag);
00116 
00118         float32 GetLowerLimit() const;
00119 
00121         float32 GetUpperLimit() const;
00122 
00124         void SetLimits(float32 lower, float32 upper);
00125 
00127         bool IsMotorEnabled() const;
00128 
00130         void EnableMotor(bool flag);
00131 
00133         void SetMotorSpeed(float32 speed);
00134 
00136         float32 GetMotorSpeed() const;
00137 
00139         void SetMaxMotorTorque(float32 torque);
00140         float32 GetMaxMotorTorque() const { return m_maxMotorTorque; }
00141 
00144         b2Vec2 GetReactionForce(float32 inv_dt) const;
00145 
00148         float32 GetReactionTorque(float32 inv_dt) const;
00149 
00152         float32 GetMotorTorque(float32 inv_dt) const;
00153 
00155         void Dump();
00156 
00157 protected:
00158         
00159         friend class b2Joint;
00160         friend class b2GearJoint;
00161 
00162         b2RevoluteJoint(const b2RevoluteJointDef* def);
00163 
00164         void InitVelocityConstraints(const b2SolverData& data);
00165         void SolveVelocityConstraints(const b2SolverData& data);
00166         bool SolvePositionConstraints(const b2SolverData& data);
00167 
00168         // Solver shared
00169         b2Vec2 m_localAnchorA;
00170         b2Vec2 m_localAnchorB;
00171         b2Vec3 m_impulse;
00172         float32 m_motorImpulse;
00173 
00174         bool m_enableMotor;
00175         float32 m_maxMotorTorque;
00176         float32 m_motorSpeed;
00177 
00178         bool m_enableLimit;
00179         float32 m_referenceAngle;
00180         float32 m_lowerAngle;
00181         float32 m_upperAngle;
00182 
00183         // Solver temp
00184         int32 m_indexA;
00185         int32 m_indexB;
00186         b2Vec2 m_rA;
00187         b2Vec2 m_rB;
00188         b2Vec2 m_localCenterA;
00189         b2Vec2 m_localCenterB;
00190         float32 m_invMassA;
00191         float32 m_invMassB;
00192         float32 m_invIA;
00193         float32 m_invIB;
00194         b2Mat33 m_mass;                 // effective mass for point-to-point constraint.
00195         float32 m_motorMass;    // effective mass for motor/limit angular constraint.
00196         b2LimitState m_limitState;
00197 };
00198 
00199 inline float32 b2RevoluteJoint::GetMotorSpeed() const
00200 {
00201         return m_motorSpeed;
00202 }
00203 
00204 #endif


mvsim
Author(s):
autogenerated on Thu Jun 6 2019 22:08:35