Javascript 在box2d/matter.js中查找运动的法线和切线分量

Javascript 在box2d/matter.js中查找运动的法线和切线分量,javascript,box2d,physics-engine,fluid-dynamics,matter.js,Javascript,Box2d,Physics Engine,Fluid Dynamics,Matter.js,我正在尝试重新创建流体阻力模型,如中所示 . 在这里(我找到论文的地方)可以看到一个有效的版本 在论文中,他们指出他们计算了软体边缘速度的法向力和切向力。我试图理解如何从边缘速度到这两个力分量。然而,我只能找到关于基于函数(例如)计算组件的资源,我正在努力将其转换到我的物理环境中。实现这种流体阻力模型的方法是什么 下面是一把小提琴,展示我的环境: 大部分都是matter.js样板,有趣的部分是函数:pulse()和applyforceonedge() 我正在使用,但我可以想象同样的问题可能适用

我正在尝试重新创建流体阻力模型,如中所示 . 在这里(我找到论文的地方)可以看到一个有效的版本

在论文中,他们指出他们计算了软体边缘速度的法向力和切向力。我试图理解如何从边缘速度到这两个力分量。然而,我只能找到关于基于函数(例如)计算组件的资源,我正在努力将其转换到我的物理环境中。实现这种流体阻力模型的方法是什么

下面是一把小提琴,展示我的环境:

大部分都是matter.js样板,有趣的部分是函数:
pulse()
applyforceonedge()


我正在使用,但我可以想象同样的问题可能适用于box2d环境

只需获取约束两侧对象位置之间的差异即可。最好用代码来解释:

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

这似乎是正确的答案。我现在唯一的问题是调整值以获得真实的行为,而不是破坏整个页面。看看这把小提琴,了解我是如何使用它的->。(小心点,它容易崩溃)。谢谢奇怪的是,它在我的手机(iOS 10.3.2,Safari)上运行正常。尝试更改值。(在本文中,法向分量约为切线大小的50倍)
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);
});