代码之家  ›  专栏  ›  技术社区  ›  Danny Cullen

低速时不遵守反射定律的物体

  •  0
  • Danny Cullen  · 技术社区  · 7 年前

    我试图模拟一个球在台球桌上弹跳,遇到了很多问题。(视图从上方俯视桌子)。

    Angle of incidence = angle of reflection

    enter image description here

    在右边界上的模拟结束时,球似乎沿着它滚动。为什么它不遵循反射定律?

    例子: https://jsfiddle.net/5sjx7oyw/

        var Engine = Matter.Engine,
        Render = Matter.Render,
        World = Matter.World,
        Bodies = Matter.Bodies,
        Body = Matter.Body,
        Vector = Matter.Vector,
        Events = Matter.Events;
    
    // create an engine
    var engine = Engine.create();
    
    var canvas = document.getElementById('canvas');
    
    engine.world.gravity.y = 0; // gravity not needed in this app
    
    // create a renderer
    var render = Render.create({
        element: document.body,
        canvas: canvas,
        engine: engine,
        options: {wireframes: true}
    });
    
    var ball_options = {
        density: 0.04,
      restitution: 1,// 0 = no bouncing, 1 = 100% of kinetic energy bounce back
      friction: 0,
      frictionAir: 0.05,
      inertia: Infinity
    };
    
    var boundary_options = {
      isStatic: true
    };
    
    var ball = Bodies.circle(100, 150, 11, ball_options);
    
    var boundary_left = Bodies.rectangle(10, 160, 100, 200, boundary_options);
    var boundary_right = Bodies.rectangle(300, 160, 100, 200, boundary_options);
    var boundary_top = Bodies.rectangle(150, 10, 200, 100, boundary_options);
    var boundary_bottom = Bodies.rectangle(150, 300, 200, 100, boundary_options);
    
    // add all of the bodies to the world
    World.add(engine.world, [
        boundary_left,
      boundary_right,
      boundary_top,
      boundary_bottom,
      ball
      ]);
    
    render.options.height = 300;
    canvas.height = 300;
    Engine.run(engine);
    Render.run(render);
    
    Body.applyForce(ball, { x: 0, y: 0 }, { x: 0.2, y: 0.5 });
    
    2 回复  |  直到 7 年前
        1
  •  4
  •   Danny Cullen    7 年前

    我在图书馆创作者的帮助下解决了这个问题。

    https://jsfiddle.net/8exLLLv6/55/

    Matter.Resolver._restingThresh = 0.1;
    

    请参阅 gibhub

        2
  •  0
  •   Tiefan Ju    7 年前

    计算机中的数字不是实数;他们是知识分子。 “float”表示“类似于float的数字”。 这就是为什么x轴上的速度不会连续减小到0。 在该程序中,x轴上的初始速度小于y轴上的初始速度。 因此,“离散效应”出现在x轴上。 当恢复率接近1时,你会感觉像个真正的球。