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

游戏引擎

开发平台:

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_GEAR_JOINT_H
  19. #define B2_GEAR_JOINT_H
  20. #include <Box2D/Dynamics/Joints/b2Joint.h>
  21. class b2RevoluteJoint;
  22. class b2PrismaticJoint;
  23. /// Gear joint definition. This definition requires two existing
  24. /// revolute or prismatic joints (any combination will work).
  25. /// The provided joints must attach a dynamic body to a static body.
  26. struct b2GearJointDef : public b2JointDef
  27. {
  28. b2GearJointDef()
  29. {
  30. type = e_gearJoint;
  31. joint1 = NULL;
  32. joint2 = NULL;
  33. ratio = 1.0f;
  34. }
  35. /// The first revolute/prismatic joint attached to the gear joint.
  36. b2Joint* joint1;
  37. /// The second revolute/prismatic joint attached to the gear joint.
  38. b2Joint* joint2;
  39. /// The gear ratio.
  40. /// @see b2GearJoint for explanation.
  41. float32 ratio;
  42. };
  43. /// A gear joint is used to connect two joints together. Either joint
  44. /// can be a revolute or prismatic joint. You specify a gear ratio
  45. /// to bind the motions together:
  46. /// coordinate1 + ratio * coordinate2 = constant
  47. /// The ratio can be negative or positive. If one joint is a revolute joint
  48. /// and the other joint is a prismatic joint, then the ratio will have units
  49. /// of length or units of 1/length.
  50. /// @warning The revolute and prismatic joints must be attached to
  51. /// fixed bodies (which must be body1 on those joints).
  52. class b2GearJoint : public b2Joint
  53. {
  54. public:
  55. b2Vec2 GetAnchorA() const;
  56. b2Vec2 GetAnchorB() const;
  57. b2Vec2 GetReactionForce(float32 inv_dt) const;
  58. float32 GetReactionTorque(float32 inv_dt) const;
  59. /// Set/Get the gear ratio.
  60. void SetRatio(float32 ratio);
  61. float32 GetRatio() const;
  62. protected:
  63. friend class b2Joint;
  64. b2GearJoint(const b2GearJointDef* data);
  65. void InitVelocityConstraints(const b2TimeStep& step);
  66. void SolveVelocityConstraints(const b2TimeStep& step);
  67. bool SolvePositionConstraints(float32 baumgarte);
  68. b2Body* m_ground1;
  69. b2Body* m_ground2;
  70. // One of these is NULL.
  71. b2RevoluteJoint* m_revolute1;
  72. b2PrismaticJoint* m_prismatic1;
  73. // One of these is NULL.
  74. b2RevoluteJoint* m_revolute2;
  75. b2PrismaticJoint* m_prismatic2;
  76. b2Vec2 m_groundAnchor1;
  77. b2Vec2 m_groundAnchor2;
  78. b2Vec2 m_localAnchor1;
  79. b2Vec2 m_localAnchor2;
  80. b2Jacobian m_J;
  81. float32 m_constant;
  82. float32 m_ratio;
  83. // Effective mass
  84. float32 m_mass;
  85. // Impulse for accumulation/warm starting.
  86. float32 m_impulse;
  87. };
  88. #endif