2017-06-17 12 views
2

paragraph 2.2.1 of this paperのように流体ドラッグモデルを再作成しようとしています。このthis youtube movie(私がこの論文を見つけた場所)に作業バージョンがあります。box2d/matter.jsのモーションの垂直成分と接線成分を見つける

これらの論文では、ソフトボディのエッジの速度の垂直および接線力を計算すると述べています。私はこれらの2つの力の成分にエッジ速度から到達する方法を理解しようとしました。しかし、関数(例えばthis)に基づいてコンポーネントを計算するためのリソースしか見つからないので、それを自分の物理環境に変換するのには苦労しています。この流体抗力モデルを達成する方法は何でしょうか?ここで

は、私の環境を表示するフィドルです: https://jsfiddle.net/Swendude/1nnckp5p/

// module aliases 
var Engine = Matter.Engine, 
    Render = Matter.Render, 
    World = Matter.World, 
    Bodies = Matter.Bodies, 
    Body = Matter.Body, 
    Vector = Matter.Vector, 
    Composite = Matter.Composite, 
    Composites = Matter.Composites, 
    Constraint = Matter.Constraint, 
    Events = Matter.Events; 

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

// create a canvas 
var canvas = document.getElementById("maincanvas"); 

var render = Render.create({ 
    element: document.body, 
    canvas: canvas, 
    engine: engine, 
    options: { 
     background: "#fff", 
     height: 400, 
     width: 400, 
     wireframes: false, 
    } 
}); 

engine.world.gravity = {x:0, y:0}; 

// Create a soft body composite, see 
// http://brm.io/matter-js/docs/classes/Composites.html#method_softBody 
var softbox = Composites.softBody(100,100,2,2,40,40,true,1); 

World.add(engine.world, softbox); 


// This functions makes some constraints move. 

function pulse(composite) { 
    var allcons = Composite.allConstraints(composite); 
    allcons[0].length += 5; 
    allcons[4].length += 5; 

    // Set a timeout to make the constraints short again 
    setTimeout(function (cons) { cons.length -= 5;}, 1000, allcons[0]); 
    setTimeout(function (cons) { cons.length -= 5;}, 1000, allcons[4]); 
} 

setInterval(pulse, 2000, softbox); 

function applyForcesOnEdge() { 
    var allcons = Composite.allConstraints(engine.world); 

    allcons.forEach(function(cons, index) { 
     // Edge speed defined as the average of both connected body's speed. 
     var constraintspeed = Vector.div(Vector.add(cons.bodyA.velocity, cons.bodyA.velocity),2); 
     if (constraintspeed.x != 0 && constraintspeed.y != 0) { 
      console.log(constraintspeed); // How to get the tangential and normal components from this? 
     } 
    }); 
} 

Events.on(engine, 'beforeUpdate', function() { 
    applyForcesOnEdge(); 
}) 


Engine.run(engine); 

Render.run(render); 

そのほとんどはmatter.js定型で、興味深い部分は関数です:pulse()applyForcesOnEdge()

私はmatter.jsを使用していますしかし、同じ質問がbox2d環境に当てはまるかもしれないと思います。

答えて

1

制約の両側にあるオブジェクトの位置の差を取るだけです。コードで詳しく説明されています:

allcons.forEach(function(cons, index) { 
    // Edge speed defined as the average of both connected body's speed. 
    var constraintspeed = Vector.div(
     Vector.add(
      cons.bodyA.velocity, 
      cons.bodyB.velocity), 
     2); 
    var constraintpos = Vector.div(
     Vector.add(
      cons.bodyA.position, 
      cons.bodyB.position), 
     2); 
    var tangent = Vector.normalise(
     cons.bodyB.position - 
     cons.bodyA.position); 
    var normal = Vector.perp(tangent); 
    var v_T = Vector.dot(constraintspeed, tangent); 
    var v_N = Vector.dot(constraintspeed, normal); 
    var F_T = - lambda_T * Math.sign(v_T) * v_T * v_T; 
    var F_N = - lambda_N * Math.sign(v_N) * v_N * v_N; 
    var F = Vector.add(
     Vector.mult(tangent, F_T), 
     Vector.mult(normal, F_N)); 
    Body.applyForce(cons.bodyA, constraintpos, F); 
    Body.applyForce(cons.bodyB, constraintpos, F); 
}); 
+0

これは正解と思われます。私が今抱えている唯一の問題は、現実的な振る舞いを得るために値を調整し、ページ全体をバグアウトさせないことです。どのように私がそれを使用したかについては、 このフィドルを参照してください - > https://jsfiddle.net/Swendude/1nnckp5p/5/。 (注意してください、クラッシュする傾向があります)。ありがとう! – SwenMulderij

+0

奇妙なことに、私の携帯電話(iOS 10.3.2、Safari)で問題なく動作しているようです。 – cdo256

+0

値を変更してみてください。 (この論文では、通常の成分は接線のサイズの約50倍である) – SwenMulderij

関連する問題