b2Joint.h
上传用户:gb3593
上传日期:2022-01-07
资源大小:3028k
文件大小:6k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /*
  2. * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com
  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. #ifndef B2_JOINT_H
  19. #define B2_JOINT_H
  20. #include <Box2D/Common/b2Math.h>
  21. class b2Body;
  22. class b2Joint;
  23. struct b2TimeStep;
  24. class b2BlockAllocator;
  25. enum b2JointType
  26. {
  27. e_unknownJoint,
  28. e_revoluteJoint,
  29. e_prismaticJoint,
  30. e_distanceJoint,
  31. e_pulleyJoint,
  32. e_mouseJoint,
  33. e_gearJoint,
  34. e_lineJoint,
  35.     e_weldJoint,
  36. e_frictionJoint,
  37. };
  38. enum b2LimitState
  39. {
  40. e_inactiveLimit,
  41. e_atLowerLimit,
  42. e_atUpperLimit,
  43. e_equalLimits
  44. };
  45. struct b2Jacobian
  46. {
  47. b2Vec2 linearA;
  48. float32 angularA;
  49. b2Vec2 linearB;
  50. float32 angularB;
  51. void SetZero();
  52. void Set(const b2Vec2& x1, float32 a1, const b2Vec2& x2, float32 a2);
  53. float32 Compute(const b2Vec2& x1, float32 a1, const b2Vec2& x2, float32 a2);
  54. };
  55. /// A joint edge is used to connect bodies and joints together
  56. /// in a joint graph where each body is a node and each joint
  57. /// is an edge. A joint edge belongs to a doubly linked list
  58. /// maintained in each attached body. Each joint has two joint
  59. /// nodes, one for each attached body.
  60. struct b2JointEdge
  61. {
  62. b2Body* other; ///< provides quick access to the other body attached.
  63. b2Joint* joint; ///< the joint
  64. b2JointEdge* prev; ///< the previous joint edge in the body's joint list
  65. b2JointEdge* next; ///< the next joint edge in the body's joint list
  66. };
  67. /// Joint definitions are used to construct joints.
  68. struct b2JointDef
  69. {
  70. b2JointDef()
  71. {
  72. type = e_unknownJoint;
  73. userData = NULL;
  74. bodyA = NULL;
  75. bodyB = NULL;
  76. collideConnected = false;
  77. }
  78. /// The joint type is set automatically for concrete joint types.
  79. b2JointType type;
  80. /// Use this to attach application specific data to your joints.
  81. void* userData;
  82. /// The first attached body.
  83. b2Body* bodyA;
  84. /// The second attached body.
  85. b2Body* bodyB;
  86. /// Set this flag to true if the attached bodies should collide.
  87. bool collideConnected;
  88. };
  89. /// The base joint class. Joints are used to constraint two bodies together in
  90. /// various fashions. Some joints also feature limits and motors.
  91. class b2Joint
  92. {
  93. public:
  94. /// Get the type of the concrete joint.
  95. b2JointType GetType() const;
  96. /// Get the first body attached to this joint.
  97. b2Body* GetBodyA();
  98. /// Get the second body attached to this joint.
  99. b2Body* GetBodyB();
  100. /// Get the anchor point on bodyA in world coordinates.
  101. virtual b2Vec2 GetAnchorA() const = 0;
  102. /// Get the anchor point on bodyB in world coordinates.
  103. virtual b2Vec2 GetAnchorB() const = 0;
  104. /// Get the reaction force on body2 at the joint anchor in Newtons.
  105. virtual b2Vec2 GetReactionForce(float32 inv_dt) const = 0;
  106. /// Get the reaction torque on body2 in N*m.
  107. virtual float32 GetReactionTorque(float32 inv_dt) const = 0;
  108. /// Get the next joint the world joint list.
  109. b2Joint* GetNext();
  110. /// Get the user data pointer.
  111. void* GetUserData() const;
  112. /// Set the user data pointer.
  113. void SetUserData(void* data);
  114. /// Short-cut function to determine if either body is inactive.
  115. bool IsActive() const;
  116. protected:
  117. friend class b2World;
  118. friend class b2Body;
  119. friend class b2Island;
  120. static b2Joint* Create(const b2JointDef* def, b2BlockAllocator* allocator);
  121. static void Destroy(b2Joint* joint, b2BlockAllocator* allocator);
  122. b2Joint(const b2JointDef* def);
  123. virtual ~b2Joint() {}
  124. virtual void InitVelocityConstraints(const b2TimeStep& step) = 0;
  125. virtual void SolveVelocityConstraints(const b2TimeStep& step) = 0;
  126. // This returns true if the position errors are within tolerance.
  127. virtual bool SolvePositionConstraints(float32 baumgarte) = 0;
  128. b2JointType m_type;
  129. b2Joint* m_prev;
  130. b2Joint* m_next;
  131. b2JointEdge m_edgeA;
  132. b2JointEdge m_edgeB;
  133. b2Body* m_bodyA;
  134. b2Body* m_bodyB;
  135. bool m_islandFlag;
  136. bool m_collideConnected;
  137. void* m_userData;
  138. // Cache here per time step to reduce cache misses.
  139. b2Vec2 m_localCenterA, m_localCenterB;
  140. float32 m_invMassA, m_invIA;
  141. float32 m_invMassB, m_invIB;
  142. };
  143. inline void b2Jacobian::SetZero()
  144. {
  145. linearA.SetZero(); angularA = 0.0f;
  146. linearB.SetZero(); angularB = 0.0f;
  147. }
  148. inline void b2Jacobian::Set(const b2Vec2& x1, float32 a1, const b2Vec2& x2, float32 a2)
  149. {
  150. linearA = x1; angularA = a1;
  151. linearB = x2; angularB = a2;
  152. }
  153. inline float32 b2Jacobian::Compute(const b2Vec2& x1, float32 a1, const b2Vec2& x2, float32 a2)
  154. {
  155. return b2Dot(linearA, x1) + angularA * a1 + b2Dot(linearB, x2) + angularB * a2;
  156. }
  157. inline b2JointType b2Joint::GetType() const
  158. {
  159. return m_type;
  160. }
  161. inline b2Body* b2Joint::GetBodyA()
  162. {
  163. return m_bodyA;
  164. }
  165. inline b2Body* b2Joint::GetBodyB()
  166. {
  167. return m_bodyB;
  168. }
  169. inline b2Joint* b2Joint::GetNext()
  170. {
  171. return m_next;
  172. }
  173. inline void* b2Joint::GetUserData() const
  174. {
  175. return m_userData;
  176. }
  177. inline void b2Joint::SetUserData(void* data)
  178. {
  179. m_userData = data;
  180. }
  181. #endif