【问题标题】:How to find the velocity of 2 colliding rigid bodies?如何找到2个碰撞刚体的速度?
【发布时间】:2015-10-31 04:36:38
【问题描述】:

所以我进入了一个物理引擎。现在的对撞机是球体和平面。我发现碰撞的深度和接触点的法线很容易,但是对于我的一生,我无法理解能量的分布。

身体包含一个碰撞器、一个质量、一个力向量(速度 * 质量)、一个弹性值(0 没有反弹,1 完全反弹)和一个摩擦值(0 滑香肠,1 动量吸血鬼)我用谷歌搜索到地狱又回来,一切都出现了 1D 和 2D 的简化,但我根本无法将它们适应 3D。

编辑:我尝试关注此页面: http://www.plasmaphysics.org.uk/collision3d.htm。看起来很简单,但由于某种原因,我仍然没有弹性为 1 的反弹。

我的实现如下:

var v = new vec3(
    (body.force.x + other.force.x) / totalMass,
    (body.force.y + other.force.y) / totalMass,
    (body.force.z + other.force.z) / totalMass
    );
body.force.set(
    ((velA.x - v.x) * elasticity + v.x) * body.mass,
    ((velA.y - v.y) * elasticity + v.y) * body.mass,
    ((velA.z - v.z) * elasticity + v.z) * body.mass
    );
other.force.set(
    ((velB.x - v.x) * elasticity + v.x) * other.mass,
    ((velB.y - v.y) * elasticity + v.y) * other.mass,
    ((velB.z - v.z) * elasticity + v.z) * other.mass
    );

对于弹性,我尝试将两个物体的弹性相乘并取它们的平均值;没有变化。

【问题讨论】:

    标签: physics rigid-bodies elasticity


    【解决方案1】:

    所以睡了一夜,从 N+ 物理解释页面获得了一些思考和很大的帮助我已尽我所能发表评论。

        //we have detected a collision between A) body B) other
            //note: for the sake of making things easier to think about,
            //      anything moving into or along the collision normal is
            //      referred to as vertical, anything perpendicular to
            //      the collision normal, is referred to as horizontal.
        //minimum translation required to resolve the collision
    var mta = collision.normal.clone().multiplyScalar(collision.length);
        //the total mass involved in the collision
    var totalMass = body.mass + other.mass;
        //the ratio of the mass belonging to body
    var ratioA = body.mass / totalMass;
        //the ratio of the mass belonging to other
    var ratioB = other.mass / totalMass;
        //the average elasticity of the collision
    var elasticity = (body.elasticity + other.elasticity) / 2.0;
        //the friction of the collision
            //note: average works, but low values have strong effects,
            //      it is easier to work with if they are multiplied
    var friction = body.friction * other.friction;
        //the vertical force of body
    var vertA = -body.force.clone().normalize().dot(collision.normal);
        //the horizontal force of body
    var horrA = 1.0 - Math.abs(vertA);
        //the vertical force of other
    var vertB = -other.force.clone().normalize().dot(collision.normal);
        //the horizontal force of other
    var horrB = 1.0 - Math.abs(vertB);
        //the amount of force applied on body
    var forceA = body.force.length();
        //the amount of force applied on other
    var forceB = other.force.length();
        //the amount of vertical force applied on body
    var vForceA = forceA * vertA;
        //the amount of vertical force applied on other
    var vForceB = forceB * vertB;
        //the amount of horizontal force applied on body
    var hForceA = forceA * horrA;
        //the amount of horizontal force applied on other
    var hForceB = forceB * horrB;
        //the total vertical force of the collision
    var verticalForce = (vForceA + vForceB) * elasticity;
        //remove all vertical force from body
        //resulting in a horizontal force vector
    body.force.add(collision.normal.clone().multiplyScalar(forceA * vertA));
        //apply friction to the horizontal force vector of body
    body.force.add(body.force.clone().normalize().multiplyScalar(-friction * hForceA * body.imass));
        //apply the new vertical force to body
    body.force.add(collision.normal.clone().multiplyScalar(verticalForce * ratioA));
        //remove all vertical force from other
        //resulting in a horizontal force vector
    other.force.add(collision.normal.clone().multiplyScalar(-forceB * vertB));
        //apply friction to the horizontal force vector of other
    other.force.add(other.force.clone().normalize().multiplyScalar(-friction * hForceB * other.imass));
        //apply the new vertical force to other
    other.force.add(collision.normal.clone().multiplyScalar(-verticalForce * ratioB));
        //resolve collision taking into consideration mass
    body.transform.position.sub(mta.clone().multiplyScalar(ratioA));
    other.transform.position.add(mta.clone().multiplyScalar(ratioB));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多