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環境に当てはまるかもしれないと思います。
これは正解と思われます。私が今抱えている唯一の問題は、現実的な振る舞いを得るために値を調整し、ページ全体をバグアウトさせないことです。どのように私がそれを使用したかについては、 このフィドルを参照してください - > https://jsfiddle.net/Swendude/1nnckp5p/5/。 (注意してください、クラッシュする傾向があります)。ありがとう! – SwenMulderij
奇妙なことに、私の携帯電話(iOS 10.3.2、Safari)で問題なく動作しているようです。 – cdo256
値を変更してみてください。 (この論文では、通常の成分は接線のサイズの約50倍である) – SwenMulderij