205 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C
		
	
	
	
		
		
			
		
	
	
			205 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C
		
	
	
	
|  | /*
 | ||
|  | * Copyright (c) 2006-2011 Erin Catto http://www.box2d.org
 | ||
|  | * | ||
|  | * This software is provided 'as-is', without any express or implied | ||
|  | * warranty.  In no event will the authors be held liable for any damages | ||
|  | * arising from the use of this software. | ||
|  | * Permission is granted to anyone to use this software for any purpose, | ||
|  | * including commercial applications, and to alter it and redistribute it | ||
|  | * freely, subject to the following restrictions: | ||
|  | * 1. The origin of this software must not be misrepresented; you must not | ||
|  | * claim that you wrote the original software. If you use this software | ||
|  | * in a product, an acknowledgment in the product documentation would be | ||
|  | * appreciated but is not required. | ||
|  | * 2. Altered source versions must be plainly marked as such, and must not be | ||
|  | * misrepresented as being the original software. | ||
|  | * 3. This notice may not be removed or altered from any source distribution. | ||
|  | */ | ||
|  | 
 | ||
|  | #ifndef B2_REVOLUTE_JOINT_H
 | ||
|  | #define B2_REVOLUTE_JOINT_H
 | ||
|  | 
 | ||
|  | #include "Box2D/Dynamics/Joints/b2Joint.h"
 | ||
|  | 
 | ||
|  | /// Revolute joint definition. This requires defining an
 | ||
|  | /// anchor point where the bodies are joined. The definition
 | ||
|  | /// uses local anchor points so that the initial configuration
 | ||
|  | /// can violate the constraint slightly. You also need to
 | ||
|  | /// specify the initial relative angle for joint limits. This
 | ||
|  | /// helps when saving and loading a game.
 | ||
|  | /// The local anchor points are measured from the body's origin
 | ||
|  | /// rather than the center of mass because:
 | ||
|  | /// 1. you might not know where the center of mass will be.
 | ||
|  | /// 2. if you add/remove shapes from a body and recompute the mass,
 | ||
|  | ///    the joints will be broken.
 | ||
|  | struct b2RevoluteJointDef : public b2JointDef | ||
|  | { | ||
|  | 	b2RevoluteJointDef() | ||
|  | 	{ | ||
|  | 		type = e_revoluteJoint; | ||
|  | 		localAnchorA.Set(0.0f, 0.0f); | ||
|  | 		localAnchorB.Set(0.0f, 0.0f); | ||
|  | 		referenceAngle = 0.0f; | ||
|  | 		lowerAngle = 0.0f; | ||
|  | 		upperAngle = 0.0f; | ||
|  | 		maxMotorTorque = 0.0f; | ||
|  | 		motorSpeed = 0.0f; | ||
|  | 		enableLimit = false; | ||
|  | 		enableMotor = false; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/// Initialize the bodies, anchors, and reference angle using a world
 | ||
|  | 	/// anchor point.
 | ||
|  | 	void Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor); | ||
|  | 
 | ||
|  | 	/// The local anchor point relative to bodyA's origin.
 | ||
|  | 	b2Vec2 localAnchorA; | ||
|  | 
 | ||
|  | 	/// The local anchor point relative to bodyB's origin.
 | ||
|  | 	b2Vec2 localAnchorB; | ||
|  | 
 | ||
|  | 	/// The bodyB angle minus bodyA angle in the reference state (radians).
 | ||
|  | 	float32 referenceAngle; | ||
|  | 
 | ||
|  | 	/// A flag to enable joint limits.
 | ||
|  | 	bool enableLimit; | ||
|  | 
 | ||
|  | 	/// The lower angle for the joint limit (radians).
 | ||
|  | 	float32 lowerAngle; | ||
|  | 
 | ||
|  | 	/// The upper angle for the joint limit (radians).
 | ||
|  | 	float32 upperAngle; | ||
|  | 
 | ||
|  | 	/// A flag to enable the joint motor.
 | ||
|  | 	bool enableMotor; | ||
|  | 
 | ||
|  | 	/// The desired motor speed. Usually in radians per second.
 | ||
|  | 	float32 motorSpeed; | ||
|  | 
 | ||
|  | 	/// The maximum motor torque used to achieve the desired motor speed.
 | ||
|  | 	/// Usually in N-m.
 | ||
|  | 	float32 maxMotorTorque; | ||
|  | }; | ||
|  | 
 | ||
|  | /// A revolute joint constrains two bodies to share a common point while they
 | ||
|  | /// are free to rotate about the point. The relative rotation about the shared
 | ||
|  | /// point is the joint angle. You can limit the relative rotation with
 | ||
|  | /// a joint limit that specifies a lower and upper angle. You can use a motor
 | ||
|  | /// to drive the relative rotation about the shared point. A maximum motor torque
 | ||
|  | /// is provided so that infinite forces are not generated.
 | ||
|  | class b2RevoluteJoint : public b2Joint | ||
|  | { | ||
|  | public: | ||
|  | 	b2Vec2 GetAnchorA() const override; | ||
|  | 	b2Vec2 GetAnchorB() const override; | ||
|  | 
 | ||
|  | 	/// The local anchor point relative to bodyA's origin.
 | ||
|  | 	const b2Vec2& GetLocalAnchorA() const { return m_localAnchorA; } | ||
|  | 
 | ||
|  | 	/// The local anchor point relative to bodyB's origin.
 | ||
|  | 	const b2Vec2& GetLocalAnchorB() const  { return m_localAnchorB; } | ||
|  | 
 | ||
|  | 	/// Get the reference angle.
 | ||
|  | 	float32 GetReferenceAngle() const { return m_referenceAngle; } | ||
|  | 
 | ||
|  | 	/// Get the current joint angle in radians.
 | ||
|  | 	float32 GetJointAngle() const; | ||
|  | 
 | ||
|  | 	/// Get the current joint angle speed in radians per second.
 | ||
|  | 	float32 GetJointSpeed() const; | ||
|  | 
 | ||
|  | 	/// Is the joint limit enabled?
 | ||
|  | 	bool IsLimitEnabled() const; | ||
|  | 
 | ||
|  | 	/// Enable/disable the joint limit.
 | ||
|  | 	void EnableLimit(bool flag); | ||
|  | 
 | ||
|  | 	/// Get the lower joint limit in radians.
 | ||
|  | 	float32 GetLowerLimit() const; | ||
|  | 
 | ||
|  | 	/// Get the upper joint limit in radians.
 | ||
|  | 	float32 GetUpperLimit() const; | ||
|  | 
 | ||
|  | 	/// Set the joint limits in radians.
 | ||
|  | 	void SetLimits(float32 lower, float32 upper); | ||
|  | 
 | ||
|  | 	/// Is the joint motor enabled?
 | ||
|  | 	bool IsMotorEnabled() const; | ||
|  | 
 | ||
|  | 	/// Enable/disable the joint motor.
 | ||
|  | 	void EnableMotor(bool flag); | ||
|  | 
 | ||
|  | 	/// Set the motor speed in radians per second.
 | ||
|  | 	void SetMotorSpeed(float32 speed); | ||
|  | 
 | ||
|  | 	/// Get the motor speed in radians per second.
 | ||
|  | 	float32 GetMotorSpeed() const; | ||
|  | 
 | ||
|  | 	/// Set the maximum motor torque, usually in N-m.
 | ||
|  | 	void SetMaxMotorTorque(float32 torque); | ||
|  | 	float32 GetMaxMotorTorque() const { return m_maxMotorTorque; } | ||
|  | 
 | ||
|  | 	/// Get the reaction force given the inverse time step.
 | ||
|  | 	/// Unit is N.
 | ||
|  | 	b2Vec2 GetReactionForce(float32 inv_dt) const override; | ||
|  | 
 | ||
|  | 	/// Get the reaction torque due to the joint limit given the inverse time step.
 | ||
|  | 	/// Unit is N*m.
 | ||
|  | 	float32 GetReactionTorque(float32 inv_dt) const override; | ||
|  | 
 | ||
|  | 	/// Get the current motor torque given the inverse time step.
 | ||
|  | 	/// Unit is N*m.
 | ||
|  | 	float32 GetMotorTorque(float32 inv_dt) const; | ||
|  | 
 | ||
|  | 	/// Dump to b2Log.
 | ||
|  | 	void Dump() override; | ||
|  | 
 | ||
|  | protected: | ||
|  | 	 | ||
|  | 	friend class b2Joint; | ||
|  | 	friend class b2GearJoint; | ||
|  | 
 | ||
|  | 	b2RevoluteJoint(const b2RevoluteJointDef* def); | ||
|  | 
 | ||
|  | 	void InitVelocityConstraints(const b2SolverData& data) override; | ||
|  | 	void SolveVelocityConstraints(const b2SolverData& data) override; | ||
|  | 	bool SolvePositionConstraints(const b2SolverData& data) override; | ||
|  | 
 | ||
|  | 	// Solver shared
 | ||
|  | 	b2Vec2 m_localAnchorA; | ||
|  | 	b2Vec2 m_localAnchorB; | ||
|  | 	b2Vec3 m_impulse; | ||
|  | 	float32 m_motorImpulse; | ||
|  | 
 | ||
|  | 	bool m_enableMotor; | ||
|  | 	float32 m_maxMotorTorque; | ||
|  | 	float32 m_motorSpeed; | ||
|  | 
 | ||
|  | 	bool m_enableLimit; | ||
|  | 	float32 m_referenceAngle; | ||
|  | 	float32 m_lowerAngle; | ||
|  | 	float32 m_upperAngle; | ||
|  | 
 | ||
|  | 	// Solver temp
 | ||
|  | 	int32 m_indexA; | ||
|  | 	int32 m_indexB; | ||
|  | 	b2Vec2 m_rA; | ||
|  | 	b2Vec2 m_rB; | ||
|  | 	b2Vec2 m_localCenterA; | ||
|  | 	b2Vec2 m_localCenterB; | ||
|  | 	float32 m_invMassA; | ||
|  | 	float32 m_invMassB; | ||
|  | 	float32 m_invIA; | ||
|  | 	float32 m_invIB; | ||
|  | 	b2Mat33 m_mass;			// effective mass for point-to-point constraint.
 | ||
|  | 	float32 m_motorMass;	// effective mass for motor/limit angular constraint.
 | ||
|  | 	b2LimitState m_limitState; | ||
|  | }; | ||
|  | 
 | ||
|  | inline float32 b2RevoluteJoint::GetMotorSpeed() const | ||
|  | { | ||
|  | 	return m_motorSpeed; | ||
|  | } | ||
|  | 
 | ||
|  | #endif
 |