2017-07-18 5 views
3

J'ai une boule et deux surfaces verticales droites dans mon monde.Pourquoi mon cercle rebondit-il sur une surface droite inclinée?

Lorsque j'applique une force à la balle, je m'attends à ce qu'elle reste en ligne droite, mais elle semble rebondir en formant un angle.

violon: https://jsfiddle.net/zvjvvzeL/11/

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_0 = Bodies.circle(100, 150, 11, { 
     density: 0.04, 
     frictionAir: 0.06, 
     restitution: 0.8, 
     friction: 0.3 
    }); 

    var cushion_left = Bodies.rectangle(34, 160, 100, 208, { isStatic: true }); 
    var cushion_right = Bodies.rectangle(492, 160, 100, 208, { isStatic: true }); 

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

    render.options.height = 300; 
    canvas.height = 300; 
    Engine.run(engine); 
    Render.run(render); 

    Body.applyForce(ball_0, { x: 0, y: 0 }, { x: 0.5, y: 0 }); 
+1

Désactiver le frottement sur la boule le fixe. –

+0

Est-ce que la balle a une rotation? –

+0

pas de spin j'essaie de simuler une balle de billard, je voulais une friction entre le tissu et la table. –

Répondre

4

Pas trop familier avec MatterJS, mais il semble que la balle a une rotation angulaire appliquée par défaut. Je pense que cela n'affecte qu'un système fermé comme celui que vous avez construit.

Peut-être que vous voulez sur le long terme, mais pour l'instant vous pouvez définir intertia : Infinity

var ball_0 = Bodies.circle(100, 150, 11, { 
    density: 0.04, 
    frictionAir: 0.06, 
    restitution: 0.8, 
    friction: 0.3, 
    inertia : Infinity 
}); 

Mais maintenant, vous avez aussi d'appliquer un peu plus de force pour obtenir le ballon toucher le mur. Je l'ai juste tourné vers .6

Body.applyForce(ball_0, { x: 0, y: 0 }, { x: .6, y: 0 }); 
+0

Malédiction vous pour laisser le zéro de tête le .6! : P –

+2

intertia vs inertie –

+0

il rebondit toujours à un angle étrange avec intertia mis à l'infini - https://jsfiddle.net/zvjvvzeL/22/ –