2017-07-20 8 views
0

J'essaie de simuler une balle qui rebondit autour d'une table de billard et qui a rencontré un problème. (La vue est en bas sur la table d'en haut).corps ne respectant pas la loi de la réflexion à des vitesses plus faibles

Je veux toujours que la balle rebondisse sur les limites selon la loi de la réflexion. Angle of incidence = angle of reflection

enter image description here

A la fin de la simulation à la limite droite, la balle semble rouler sur elle. Pourquoi ne suit-il pas la loi de la réflexion?

Exemple: 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 }); 

Répondre

0

Les chiffres dans l'ordinateur ne sont pas des nombres réels; ce sont des inteters. Le 'float' signifie 'nombre comme float'. C'est la raison pour laquelle la vitesse sur l'axe des abscisses n'est pas réduite à 0 en continu. Dans le code, la vitesse initiale en axe des abscisses est inférieure à une en ordonnée. L'effet 'Discrete' apparaît donc sur l'axe des x. Vous pouvez vous sentir comme une vraie balle quand la restitution est presque à 1. Merci. J'ai résolu le problème avec l'aide du créateur de la bibliothèque.

+0

Je suis désolé d'avoir changé la 'restitution' à 1, mais je reçois toujours l'effet de ce roulement de la frontière? Pourriez-vous me donner un exemple? –

+0

Je suggère frictionAir: 0.00. –

+0

Oui, cela me donne une réflexion parfaite, mais je veux que la balle finisse par s'arrêter. –