physics.html 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>Physics</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript" src="../build/escher.js"></script>
  9. <script type="text/javascript" src="./lib/p2.min.js"></script>
  10. <script type="text/javascript">
  11. var division = document.createElement("div");
  12. division.style.position = "absolute";
  13. division.style.width = "100%";
  14. division.style.height = "100%";
  15. division.style.top = "0px";
  16. division.style.left = "0px";
  17. division.style.overflow = "hidden";
  18. document.body.appendChild(division);
  19. // Setup the display canvas
  20. var canvas = document.createElement("canvas");
  21. canvas.style.position = "absolute";
  22. canvas.style.width = "100%";
  23. canvas.style.height = "100%";
  24. canvas.style.top = "0px";
  25. canvas.style.left = "0px";
  26. canvas.width = window.innerWidth;
  27. canvas.height = window.innerHeight;
  28. canvas.oncontextmenu = function(event)
  29. {
  30. event.preventDefault();
  31. return false;
  32. };
  33. division.appendChild(canvas);
  34. window.onresize = function()
  35. {
  36. canvas.width = window.innerWidth;
  37. canvas.height = window.innerHeight;
  38. };
  39. function PhysicsCircle()
  40. {
  41. Escher.Circle.call(this);
  42. this.strokeStyle = null;
  43. this.fillStyle = Math.random() > 0.5 ? new Escher.ColorStyle("#00FF00") : new Escher.ColorStyle("#0000FF");
  44. this.radius = 1.0;
  45. this.shape = new p2.Circle({radius: this.radius});
  46. this.body = new p2.Body({mass: 1, position: [0,0]});
  47. this.body.addShape(this.shape);
  48. }
  49. PhysicsCircle.prototype = Object.create(Escher.Circle.prototype);
  50. PhysicsCircle.prototype.onPointerEnter = function(pointer, viewport){};
  51. PhysicsCircle.prototype.onPointerLeave = function(pointer, viewport){};
  52. PhysicsCircle.prototype.draw = function(context, viewport, canvas)
  53. {
  54. this.position.set(this.body.position[0], -this.body.position[1]);
  55. Escher.Circle.prototype.draw.call(this, context, viewport, canvas);
  56. }
  57. var group = new Escher.Object2D();
  58. // Init p2.js
  59. var world = new p2.World();
  60. for(var i = 0; i < 150; i++)
  61. {
  62. var circle = new PhysicsCircle();
  63. circle.body.position.set([Math.random() * 30 - 15, Math.random() * 200]);
  64. world.addBody(circle.body);
  65. group.add(circle);
  66. }
  67. // Add a plane
  68. var planeShape = new p2.Plane();
  69. var planeBody = new p2.Body();
  70. planeBody.addShape(planeShape);
  71. world.addBody(planeBody);
  72. var plane = new Escher.Box();
  73. plane.strokeStyle = null;
  74. plane.fillStyle = new Escher.ColorStyle("#556677");
  75. plane.onPointerLeave = null;
  76. plane.onPointerEnter = null;
  77. plane.box.min.set(-1000, 0);
  78. plane.box.max.set(1000, 100);
  79. group.add(plane);
  80. var viewport = new Escher.Viewport(canvas);
  81. viewport.scale = 35.0;
  82. viewport.position.set(900, 650);
  83. var time = performance.now();
  84. var renderer = new Escher.Renderer(canvas);
  85. renderer.createRenderLoop(group, viewport, function()
  86. {
  87. plane.position.y = -planeBody.position[1];
  88. // Move physics bodies forward in time
  89. world.step(1/60);
  90. });
  91. </script>
  92. </body>
  93. </html>