/jbox2d-testbed/src/main/java/org/jbox2d/testbed/tests/PistonTest.java

http://jbox2d.googlecode.com/ · Java · 209 lines · 171 code · 33 blank · 5 comment · 4 complexity · a8660aa34a7d09e88d9e86957c7a4361 MD5 · raw file

  1. package org.jbox2d.testbed.tests;
  2. import org.jbox2d.collision.shapes.CircleShape;
  3. import org.jbox2d.collision.shapes.PolygonShape;
  4. import org.jbox2d.common.MathUtils;
  5. import org.jbox2d.common.Vec2;
  6. import org.jbox2d.dynamics.Body;
  7. import org.jbox2d.dynamics.BodyDef;
  8. import org.jbox2d.dynamics.BodyType;
  9. import org.jbox2d.dynamics.FixtureDef;
  10. import org.jbox2d.dynamics.World;
  11. import org.jbox2d.dynamics.joints.PrismaticJoint;
  12. import org.jbox2d.dynamics.joints.PrismaticJointDef;
  13. import org.jbox2d.dynamics.joints.RevoluteJoint;
  14. import org.jbox2d.dynamics.joints.RevoluteJointDef;
  15. import org.jbox2d.testbed.framework.TestbedTest;
  16. public class PistonTest extends TestbedTest {
  17. public RevoluteJoint m_joint1;
  18. public PrismaticJoint m_joint2;
  19. private boolean bullet = false;
  20. @Override
  21. public boolean isSaveLoadEnabled() {
  22. return true;
  23. }
  24. @Override
  25. public void initTest(boolean argDeserialized) {
  26. if (argDeserialized) {
  27. return;
  28. }
  29. World world = getWorld();
  30. Body ground = null;
  31. {
  32. BodyDef bd = new BodyDef();
  33. ground = getWorld().createBody(bd);
  34. PolygonShape shape = new PolygonShape();
  35. shape.setAsBox(5.0f, 100.0f);
  36. bd = new BodyDef();
  37. bd.type = BodyType.STATIC;
  38. FixtureDef sides = new FixtureDef();
  39. sides.shape = shape;
  40. sides.density = 0;
  41. sides.friction = 0;
  42. sides.restitution = .8f;
  43. sides.filter.categoryBits = 4;
  44. sides.filter.maskBits = 2;
  45. bd.position.set(-10.01f, 50.0f);
  46. Body bod = world.createBody(bd);
  47. bod.createFixture(sides);
  48. bd.position.set(10.01f, 50.0f);
  49. bod = world.createBody(bd);
  50. bod.createFixture(sides);
  51. }
  52. // turney
  53. {
  54. CircleShape cd;
  55. FixtureDef fd = new FixtureDef();
  56. BodyDef bd = new BodyDef();
  57. bd.type = BodyType.DYNAMIC;
  58. int numPieces = 5;
  59. float radius = 4f;
  60. bd.position = new Vec2(0.0f, 25.0f);
  61. Body body = getWorld().createBody(bd);
  62. for (int i = 0; i < numPieces; i++) {
  63. cd = new CircleShape();
  64. cd.m_radius = .5f;
  65. fd.shape = cd;
  66. fd.density = 25;
  67. fd.friction = .1f;
  68. fd.restitution = .9f;
  69. float xPos = radius * (float) Math.cos(2f * Math.PI * (i / (float) (numPieces)));
  70. float yPos = radius * (float) Math.sin(2f * Math.PI * (i / (float) (numPieces)));
  71. cd.m_p.set(xPos, yPos);
  72. body.createFixture(fd);
  73. }
  74. body.setBullet(false);
  75. RevoluteJointDef rjd = new RevoluteJointDef();
  76. rjd.initialize(body, getGroundBody(), body.getPosition());
  77. rjd.motorSpeed = MathUtils.PI;
  78. rjd.maxMotorTorque = 1000000.0f;
  79. rjd.enableMotor = true;
  80. RevoluteJoint joint = (RevoluteJoint) getWorld().createJoint(rjd);
  81. }
  82. {
  83. Body prevBody = ground;
  84. // Define crank.
  85. {
  86. PolygonShape shape = new PolygonShape();
  87. shape.setAsBox(0.5f, 2.0f);
  88. BodyDef bd = new BodyDef();
  89. bd.type = BodyType.DYNAMIC;
  90. bd.position.set(0.0f, 7.0f);
  91. Body body = getWorld().createBody(bd);
  92. body.createFixture(shape, 2.0f);
  93. RevoluteJointDef rjd = new RevoluteJointDef();
  94. rjd.initialize(prevBody, body, new Vec2(0.0f, 5.0f));
  95. rjd.motorSpeed = 1.0f * MathUtils.PI;
  96. rjd.maxMotorTorque = 20000;
  97. rjd.enableMotor = true;
  98. m_joint1 = (RevoluteJoint) getWorld().createJoint(rjd);
  99. prevBody = body;
  100. }
  101. // Define follower.
  102. {
  103. PolygonShape shape = new PolygonShape();
  104. shape.setAsBox(0.5f, 4.0f);
  105. BodyDef bd = new BodyDef();
  106. bd.type = BodyType.DYNAMIC;
  107. bd.position.set(0.0f, 13.0f);
  108. Body body = getWorld().createBody(bd);
  109. body.createFixture(shape, 2.0f);
  110. RevoluteJointDef rjd = new RevoluteJointDef();
  111. rjd.initialize(prevBody, body, new Vec2(0.0f, 9.0f));
  112. rjd.enableMotor = false;
  113. getWorld().createJoint(rjd);
  114. prevBody = body;
  115. }
  116. // Define piston
  117. {
  118. PolygonShape shape = new PolygonShape();
  119. shape.setAsBox(7f, 2f);
  120. BodyDef bd = new BodyDef();
  121. bd.type = BodyType.DYNAMIC;
  122. bd.position.set(0.0f, 17.0f);
  123. Body body = getWorld().createBody(bd);
  124. FixtureDef piston = new FixtureDef();
  125. piston.shape = shape;
  126. piston.density = 2;
  127. piston.filter.categoryBits = 1;
  128. piston.filter.maskBits = 2;
  129. body.createFixture(piston);
  130. RevoluteJointDef rjd = new RevoluteJointDef();
  131. rjd.initialize(prevBody, body, new Vec2(0.0f, 17.0f));
  132. getWorld().createJoint(rjd);
  133. PrismaticJointDef pjd = new PrismaticJointDef();
  134. pjd.initialize(ground, body, new Vec2(0.0f, 17.0f), new Vec2(0.0f, 1.0f));
  135. pjd.maxMotorForce = 1000.0f;
  136. pjd.enableMotor = true;
  137. m_joint2 = (PrismaticJoint) getWorld().createJoint(pjd);
  138. }
  139. // Create a payload
  140. {
  141. PolygonShape sd = new PolygonShape();
  142. BodyDef bd = new BodyDef();
  143. bd.type = BodyType.DYNAMIC;
  144. FixtureDef fixture = new FixtureDef();
  145. Body body;
  146. for (int i = 0; i < 100; ++i) {
  147. sd.setAsBox(0.4f, 0.3f);
  148. bd.position.set(-1.0f, 23.0f + i);
  149. bd.bullet = bullet;
  150. body = world.createBody(bd);
  151. fixture.shape = sd;
  152. fixture.density = .1f;
  153. fixture.filter.categoryBits = 2;
  154. fixture.filter.maskBits = 1 | 4 | 2;
  155. body.createFixture(fixture);
  156. }
  157. CircleShape cd = new CircleShape();
  158. cd.m_radius = 0.36f;
  159. for (int i = 0; i < 100; ++i) {
  160. bd.position.set(1.0f, 23.0f + i);
  161. bd.bullet = bullet;
  162. fixture.shape = cd;
  163. fixture.density = 2f;
  164. fixture.filter.categoryBits = 2;
  165. fixture.filter.maskBits = 1 | 4 | 2;
  166. body = world.createBody(bd);
  167. body.createFixture(fixture);
  168. }
  169. }
  170. }
  171. }
  172. @Override
  173. public String getTestName() {
  174. return "Piston Stress Test";
  175. }
  176. }