2016-03-23 7 views
0

ボールをバウンスしてシミュレーションしたい、そして将来的にボールを作り直してリバウンドさせたいと思います。これは(p5.js、javascriptのための処理ライブラリを使用して)ボールが重力で跳ね返って消えるのを止めてください

var xpos = 200; 
var ypos = 450; 
var vy = 0; 
var gravity = 0.6; 
var bounce = -1.00; 
var diameter = 30; 

function setup() { 
    var myCanvas = createCanvas(windowWidth, windowHeight); 

    stroke(255); 
    noFill(); 
} 

function draw() { 
    background(0); 

    ellipse(xpos, ypos, diameter, diameter); 

    vy += gravity; 
    ypos += vy; 

    if(ypos > (windowHeight - diameter/2)) { 
    vy *= bounce; 
    } 

} 

それがうまく働いているかのように見えますが、バウンスはのは本当に小さな得るとき、それはグリッチを始めると消え、here's a codepen。私のコードです私はそれをちょうど停止とロールまたは何かにする方法がわかりません(xプロパティがない場合は明らかにロールしませんが、バウンス停止後に移動を停止してください)

何か助けていただきありがとうございます。

答えて

2

あなたがしたいです最初に加速を適用し、次に衝突テストを行い、次に衝突の位置を調整します。

払い戻しを希望する場合は、各衝突後にvyに適用してください。

編集:また、オブジェクトがhttp://codepen.io/samirc/pen/RaVGRW?editors=0010それはちょうど落ちるとフリーズし、やった

var xpos = 200; 
var ypos = 0; 
var vy = 0; 
var gravity = 10; 
var bounce = 0.9; // typically represented as a positive normalized value 
var diameter = 30; 
var sleepTolerance = gravity; // this will provide a solid result 

// KA variables 
var windowHeight = height; 
var windowWidth = width; 

frameRate(30); 
var draw = function() { 
    background(0); 

    ellipse(xpos, ypos, diameter, diameter); 

    var asleep = false; 

    if(!asleep){ 
     vy += gravity; 
     ypos += vy; 
    } 

    var heightAboveGround = ypos - (windowHeight - diameter/2); 
    if(heightAboveGround > 0) { // remember y is inverted 
     // position adjusted for reflection after collision 
     // including restitution (resulting from the bounce) 
     ypos -= bounce * heightAboveGround; 

     // apply restitution to subsequent velocity 
     vy *= -bounce; 

     if (heightAboveGround <= sleepTolerance && abs(vy) <= sleepTolerance){ 
      asleep = true; 
      ypos = windowHeight - diameter/2; 
     } 
    } 
}; 
+0

http://codepen.io/samirc/pen/RaVGRW?editors=0010直径を大きくすると、ボールがバウンスを止めるとグリッチが目立つようになります –

+0

私はそれを実現しました。 :)答えを編集中... – Nolo

+0

ありがとうございました:) –

0

私はより密接に2つの調整することによって、バウンドするボールをシミュレートすることができた。ボールは

  • を減衰減少を動かす「床」をタッチしていない場合は、重力を適用しないでください

    1. を大きさは
    十分に小さくなると、各バウンス
  • 速度の大きさが0に速度を設定します。

    更新バウンス:

    // Attenuate velocity by making the magnitude of this value < 1 
    var bounce = -0.9; 
    
    // Give initial vy 
    var vy = 0.1; 
    

    とボールは「空気中」であるときに我々は重力のみを追加確保(「地面の下に沈む」から私たちのボールを防止する):

    function draw() { 
        background(0); 
    
        ellipse(xpos, ypos, diameter, diameter); 
    
        var floor = windowHeight - diameter/2; 
        var inAir = ypos <= floor; 
        var moving = Math.abs(vy) > 0.01; 
    
        if (inAir && moving) { 
         vy += gravity; 
        } 
    
        ypos += vy; 
    
        if(!inAir && vy > 0) { 
         vy *= bounce; 
    
         if (!moving) { 
          vy = 0; 
         } 
        } 
    } 
    
  • +0

    に役立つ「休止」する必要があるかどうかを確認するためにチェックを使用して私は何か間違っている? –

    +0

    これらの問題を修正するように編集しました –

    +0

    最初の問題を修正しましたが、別の問題が発生しました。バウンシングの高さが短いと永遠に跳ね返ります。http://codepen.io/samirc/pen/RaVGRW?editors=0010 –

    関連する問題