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

游戏引擎

开发平台:

Visual C++

  1. /*
  2. * Copyright (c) 2006-2009 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 APPLY_FORCE_H
  19. #define APPLY_FORCE_H
  20. class ApplyForce : public Test
  21. {
  22. public:
  23. ApplyForce()
  24. {
  25. m_world->SetGravity(b2Vec2(0.0f, 0.0f));
  26. const float32 k_restitution = 0.4f;
  27. b2Body* ground;
  28. {
  29. b2BodyDef bd;
  30. bd.position.Set(0.0f, 20.0f);
  31. ground = m_world->CreateBody(&bd);
  32. b2PolygonShape shape;
  33. b2FixtureDef sd;
  34. sd.shape = &shape;
  35. sd.density = 0.0f;
  36. sd.restitution = k_restitution;
  37. // Left vertical
  38. shape.SetAsEdge(b2Vec2(-20.0f, -20.0f), b2Vec2(-20.0f, 20.0f));
  39. ground->CreateFixture(&sd);
  40. // Right vertical
  41. shape.SetAsEdge(b2Vec2(20.0f, -20.0f), b2Vec2(20.0f, 20.0f));
  42. ground->CreateFixture(&sd);
  43. // Top horizontal
  44. shape.SetAsEdge(b2Vec2(-20.0f, 20.0f), b2Vec2(20.0f, 20.0f));
  45. ground->CreateFixture(&sd);
  46. // Bottom horizontal
  47. shape.SetAsEdge(b2Vec2(-20.0f, -20.0f), b2Vec2(20.0f, -20.0f));
  48. ground->CreateFixture(&sd);
  49. }
  50. {
  51. b2Transform xf1;
  52. xf1.R.Set(0.3524f * b2_pi);
  53. xf1.position = b2Mul(xf1.R, b2Vec2(1.0f, 0.0f));
  54. b2Vec2 vertices[3];
  55. vertices[0] = b2Mul(xf1, b2Vec2(-1.0f, 0.0f));
  56. vertices[1] = b2Mul(xf1, b2Vec2(1.0f, 0.0f));
  57. vertices[2] = b2Mul(xf1, b2Vec2(0.0f, 0.5f));
  58. b2PolygonShape poly1;
  59. poly1.Set(vertices, 3);
  60. b2FixtureDef sd1;
  61. sd1.shape = &poly1;
  62. sd1.density = 4.0f;
  63. b2Transform xf2;
  64. xf2.R.Set(-0.3524f * b2_pi);
  65. xf2.position = b2Mul(xf2.R, b2Vec2(-1.0f, 0.0f));
  66. vertices[0] = b2Mul(xf2, b2Vec2(-1.0f, 0.0f));
  67. vertices[1] = b2Mul(xf2, b2Vec2(1.0f, 0.0f));
  68. vertices[2] = b2Mul(xf2, b2Vec2(0.0f, 0.5f));
  69. b2PolygonShape poly2;
  70. poly2.Set(vertices, 3);
  71. b2FixtureDef sd2;
  72. sd2.shape = &poly2;
  73. sd2.density = 2.0f;
  74. b2BodyDef bd;
  75. bd.type = b2_dynamicBody;
  76. bd.angularDamping = 5.0f;
  77. bd.linearDamping = 0.1f;
  78. bd.position.Set(0.0f, 2.0);
  79. bd.angle = b2_pi;
  80. bd.allowSleep = false;
  81. m_body = m_world->CreateBody(&bd);
  82. m_body->CreateFixture(&sd1);
  83. m_body->CreateFixture(&sd2);
  84. }
  85. {
  86. b2PolygonShape shape;
  87. shape.SetAsBox(0.5f, 0.5f);
  88. b2FixtureDef fd;
  89. fd.shape = &shape;
  90. fd.density = 1.0f;
  91. fd.friction = 0.3f;
  92. for (int i = 0; i < 10; ++i)
  93. {
  94. b2BodyDef bd;
  95. bd.type = b2_dynamicBody;
  96. bd.position.Set(0.0f, 5.0f + 1.54f * i);
  97. b2Body* body = m_world->CreateBody(&bd);
  98. body->CreateFixture(&fd);
  99. float32 gravity = 10.0f;
  100. float32 I = body->GetInertia();
  101. float32 mass = body->GetMass();
  102. // For a circle: I = 0.5 * m * r * r ==> r = sqrt(2 * I / m)
  103. float32 radius = b2Sqrt(2.0f * I / mass);
  104. b2FrictionJointDef jd;
  105. jd.localAnchorA.SetZero();
  106. jd.localAnchorB.SetZero();
  107. jd.bodyA = ground;
  108. jd.bodyB = body;
  109. jd.collideConnected = true;
  110. jd.maxForce = mass * gravity;
  111. jd.maxTorque = mass * radius * gravity;
  112. m_world->CreateJoint(&jd);
  113. }
  114. }
  115. }
  116. void Keyboard(unsigned char key)
  117. {
  118. switch (key)
  119. {
  120. case 'w':
  121. {
  122. b2Vec2 f = m_body->GetWorldVector(b2Vec2(0.0f, -200.0f));
  123. b2Vec2 p = m_body->GetWorldPoint(b2Vec2(0.0f, 2.0f));
  124. m_body->ApplyForce(f, p);
  125. }
  126. break;
  127. case 'a':
  128. {
  129. m_body->ApplyTorque(50.0f);
  130. }
  131. break;
  132. case 'd':
  133. {
  134. m_body->ApplyTorque(-50.0f);
  135. }
  136. break;
  137. }
  138. }
  139. static Test* Create()
  140. {
  141. return new ApplyForce;
  142. }
  143. b2Body* m_body;
  144. };
  145. #endif