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

游戏引擎

开发平台:

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_LINE_JOINT_H
  19. #define B2_LINE_JOINT_H
  20. #include <Box2D/Dynamics/Joints/b2Joint.h>
  21. /// Line joint definition. This requires defining a line of
  22. /// motion using an axis and an anchor point. The definition uses local
  23. /// anchor points and a local axis so that the initial configuration
  24. /// can violate the constraint slightly. The joint translation is zero
  25. /// when the local anchor points coincide in world space. Using local
  26. /// anchors and a local axis helps when saving and loading a game.
  27. struct b2LineJointDef : public b2JointDef
  28. {
  29. b2LineJointDef()
  30. {
  31. type = e_lineJoint;
  32. localAnchorA.SetZero();
  33. localAnchorB.SetZero();
  34. localAxisA.Set(1.0f, 0.0f);
  35. enableLimit = false;
  36. lowerTranslation = 0.0f;
  37. upperTranslation = 0.0f;
  38. enableMotor = false;
  39. maxMotorForce = 0.0f;
  40. motorSpeed = 0.0f;
  41. }
  42. /// Initialize the bodies, anchors, axis, and reference angle using the world
  43. /// anchor and world axis.
  44. void Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor, const b2Vec2& axis);
  45. /// The local anchor point relative to body1's origin.
  46. b2Vec2 localAnchorA;
  47. /// The local anchor point relative to body2's origin.
  48. b2Vec2 localAnchorB;
  49. /// The local translation axis in body1.
  50. b2Vec2 localAxisA;
  51. /// Enable/disable the joint limit.
  52. bool enableLimit;
  53. /// The lower translation limit, usually in meters.
  54. float32 lowerTranslation;
  55. /// The upper translation limit, usually in meters.
  56. float32 upperTranslation;
  57. /// Enable/disable the joint motor.
  58. bool enableMotor;
  59. /// The maximum motor torque, usually in N-m.
  60. float32 maxMotorForce;
  61. /// The desired motor speed in radians per second.
  62. float32 motorSpeed;
  63. };
  64. /// A line joint. This joint provides two degrees of freedom: translation
  65. /// along an axis fixed in body1 and rotation in the plane. You can use a
  66. /// joint limit to restrict the range of motion and a joint motor to drive
  67. /// the motion or to model joint friction.
  68. class b2LineJoint : public b2Joint
  69. {
  70. public:
  71. b2Vec2 GetAnchorA() const;
  72. b2Vec2 GetAnchorB() const;
  73. b2Vec2 GetReactionForce(float32 inv_dt) const;
  74. float32 GetReactionTorque(float32 inv_dt) const;
  75. /// Get the current joint translation, usually in meters.
  76. float32 GetJointTranslation() const;
  77. /// Get the current joint translation speed, usually in meters per second.
  78. float32 GetJointSpeed() const;
  79. /// Is the joint limit enabled?
  80. bool IsLimitEnabled() const;
  81. /// Enable/disable the joint limit.
  82. void EnableLimit(bool flag);
  83. /// Get the lower joint limit, usually in meters.
  84. float32 GetLowerLimit() const;
  85. /// Get the upper joint limit, usually in meters.
  86. float32 GetUpperLimit() const;
  87. /// Set the joint limits, usually in meters.
  88. void SetLimits(float32 lower, float32 upper);
  89. /// Is the joint motor enabled?
  90. bool IsMotorEnabled() const;
  91. /// Enable/disable the joint motor.
  92. void EnableMotor(bool flag);
  93. /// Set the motor speed, usually in meters per second.
  94. void SetMotorSpeed(float32 speed);
  95. /// Get the motor speed, usually in meters per second.
  96. float32 GetMotorSpeed() const;
  97. /// Set/Get the maximum motor force, usually in N.
  98. void SetMaxMotorForce(float32 force);
  99. float32 GetMaxMotorForce() const;
  100. /// Get the current motor force, usually in N.
  101. float32 GetMotorForce() const;
  102. protected:
  103. friend class b2Joint;
  104. b2LineJoint(const b2LineJointDef* def);
  105. void InitVelocityConstraints(const b2TimeStep& step);
  106. void SolveVelocityConstraints(const b2TimeStep& step);
  107. bool SolvePositionConstraints(float32 baumgarte);
  108. b2Vec2 m_localAnchor1;
  109. b2Vec2 m_localAnchor2;
  110. b2Vec2 m_localXAxis1;
  111. b2Vec2 m_localYAxis1;
  112. b2Vec2 m_axis, m_perp;
  113. float32 m_s1, m_s2;
  114. float32 m_a1, m_a2;
  115. b2Mat22 m_K;
  116. b2Vec2 m_impulse;
  117. float32 m_motorMass; // effective mass for motor/limit translational constraint.
  118. float32 m_motorImpulse;
  119. float32 m_lowerTranslation;
  120. float32 m_upperTranslation;
  121. float32 m_maxMotorForce;
  122. float32 m_motorSpeed;
  123. bool m_enableLimit;
  124. bool m_enableMotor;
  125. b2LimitState m_limitState;
  126. };
  127. inline float32 b2LineJoint::GetMotorSpeed() const
  128. {
  129. return m_motorSpeed;
  130. }
  131. #endif