【问题标题】:How to continuously rotate a body with matter.js?如何用 matter.js 连续旋转身体?
【发布时间】:2017-08-06 22:52:06
【问题描述】:

我是物理引擎的新手,但要开始我设想的项目,我需要让六边形在页面中心的固定位置连续旋转。

我想我从根本上误解了物理引擎的工作原理,但是当我调用 Matter.Body.rotate(hexagon, 1);它只是在由提供的参数 (1) 渲染时立即旋转六边形,并且不会旋转得更远。如何让它连续旋转?

这是我的代码:

请注意,设置了 setStatic 以使六边形不会掉出框架。

// module aliases
var Engine = Matter.Engine,
    Render = Matter.Render,
    World = Matter.World,
    Bodies = Matter.Bodies;
    Composites = Matter.Composites;

// create an engine
var engine = Engine.create();

// create a renderer
var render = Render.create({
    element: document.body,
    engine: engine
});


var hexagon = Bodies.polygon(375, 300, 6, 200, {inertia: Infinity}); // setting inertia to inifinty will prevent rotation upon collision
Matter.Body.setStatic(hexagon, true);
Matter.Body.rotate(hexagon, 1);
console.log(hexagon);
// Matter.Body.rotate(hexagon, 1)

// add all of the bodies to the world
World.add(engine.world, [hexagon]);

// run the engine
Engine.run(engine);


// run the renderer
Render.run(render);
<!DOCTYPE html>
  <head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.5.11/p5.js"></script>
    <!-- <script src="matter.js" type="text/javascript"></script> -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/matter-js/0.12.0/matter.js"></script>
    <!-- <script async src="hexagondwana.js"></script> -->
    <script async src="hex_no_p5.js"></script>
  </head>
  <body>
  </body>
</html>

【问题讨论】:

    标签: javascript rotation physics-engine matter.js


    【解决方案1】:

    您应该使用六边形的循环增加角度并使用Matter.Body.setAngle 设置旋转。这样做看起来像这样:

    var hexagon = Bodies.polygon(375, 300, 6, 200, {
        isStatic: true,
        inertia: Infinity,// setting inertia to infinty will prevent rotation upon collision
        rotationSpeed: 1 // Optional - you could substitute hexagon.rotationSpeed in updateRotation() with this number
    });
    World.add(world, [hexagon]);  
    
    function updateRotation() {
        Matter.Body.setAngle(hexagon, hexagon.angle + hexagon.rotationSpeed);
        requestAnimationFrame(updateRotation);
    }
    window.requestAnimationFrame(updateRotation);
    

    完整代码在这里:

    // module aliases
    var Engine = Matter.Engine,
        Render = Matter.Render,
        World = Matter.World,
        Body = Matter.Body,
        Bodies = Matter.Bodies;
        Composites = Matter.Composites;
    
    // create an engine
    var engine = Engine.create();
    
    // create a renderer
    var render = Render.create({
        element: document.body,
        engine: engine
    });
    
    
    
    var hexagon = Bodies.polygon(375, 300, 6, 200, {
        isStatic: true,
        inertia: Infinity,// setting inertia to infinty will prevent rotation upon collision
        rotationSpeed: 1 // Optional
    }); 
    // add all of the bodies to the world
    World.add(engine.world, [hexagon]);
    
    // run the engine
    Engine.run(engine);
    
    function updateRotation() {
        Body.setAngle(hexagon, hexagon.angle + hexagon.rotationSpeed);
        requestAnimationFrame(updateRotation);
    }
    window.requestAnimationFrame(updateRotation);
    
    
    
    // run the renderer
    Render.run(render);
    <!DOCTYPE html>
      <head>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.5.11/p5.js"></script>
        <!-- <script src="matter.js" type="text/javascript"></script> -->
        <script src="https://cdnjs.cloudflare.com/ajax/libs/matter-js/0.12.0/matter.js"></script>
        <!-- <script async src="hexagondwana.js"></script> -->
        <script async src="hex_no_p5.js"></script>
      </head>
      <body>
      </body>
    </html>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 2022-07-04
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多