Famo.us 物理引擎:力和墙的行为不符合预期

Famo.us physics engine: forces and walls not behaving as expected

我正在尝试使用著名的物理引擎创建粒子网格。我认为如果将 25 个粒子放置在 4 个边界墙之间(形成一个正方形)并且它们彼此之间都具有相等的排斥力,它们自然会形成一个网格 - 即。考虑到他们的世界的局限性,他们都将尽可能远离彼此。我希望这能起作用,即使只是在没有初始位置的情况下添加粒子。然而,即使我给他们一个初始位置,他们也不会保持原位,除非力非常小。

此外,我认为如果一堵墙的恢复为 0,那么粒子会在与它碰撞时停止。当我 运行 下面的代码时,我可以看到粒子从墙上反弹。笔在: http://codepen.io/timsig/pen/pJJrOa

我没领会什么? - 提前致谢

define('main', function (require, exports, module) {
     // import dependencies
    var Engine = require('famous/core/Engine');
    var Surface = require('famous/core/Surface')
    var Modifier = require('famous/core/Modifier');
    var PhysicsEngine = require('famous/physics/PhysicsEngine');
    var Particle = require('famous/physics/bodies/Particle');
    var Drag = require('famous/physics/forces/Drag');
    var RepulsionForce = require('famous/physics/forces/Repulsion');
    var Wall            = require('famous/physics/constraints/Wall');

    var gridItems = [];

    var positionsArray = [-140,-70,0,70,140];

    var context = Engine.createContext();

    var physics = new PhysicsEngine();




    var gridR = new RepulsionForce({
        strength: 0.015
    });

    //physics.addBody(planetParticle);
  var leftWall    = new Wall({normal : [1,0,0],  distance : 140, restitution : 0});
    var rightWall   = new Wall({normal : [-1,0,0], distance : 140, restitution : 0});
    var topWall     = new Wall({normal : [0,1,0],  distance : 140, restitution : 0});
    var bottomWall  = new Wall({normal : [0,-1,0], distance : 140, restitution : 0});



    function gridItemTrans() {
         return this.particle.getTransform();
    }

    function addGridRepulsion(){
      var sq1, sq2;
      for (var i = 0; i < gridItems.length; i += 1){
        sq1 = gridItems[i].particle;
        physics.attach([leftWall, rightWall, topWall, bottomWall], sq1);
          if ((i + 1) < gridItems.length){
            for (var j = i + 1; j < gridItems.length; j += 1){
              sq2 = gridItems[j].particle;
              physics.attach(gridR, sq1, sq2);
            }
            }
        }
      }

    function addBodies(){
      gridItems.forEach(function(ele){
        physics.addBody(ele.particle);
      });
    }

    for (var rows = 0; rows < 5; rows += 1){

        for (var cols = 0; cols < 5; cols += 1){

          var gridItem = new Surface({
            properties: {
                backgroundColor: '#23AD23'
            }
            }); 

           gridItem.particle = new Particle({
            position: [positionsArray[rows], positionsArray[cols], 0]
           });

           //physics.addBody(gridItem.particle);
           //physics.attach(centralG, gridItemParticle[rows][cols], planetParticle);

           gridItem.modifier = new Modifier({
            size: [50,50],
            align: [0.5, 0.5],
            origin: [0.5, 0.5],
            transform: gridItemTrans.bind(gridItem)
           });

           context.add(gridItem.modifier).add(gridItem);
           gridItems.push(gridItem);
        }
    }
  addBodies();
  addGridRepulsion();



});

为了澄清你的理解,我们先看看所施加的斥力。

默认情况下,Famo.us 中的 Repulsion 衰减函数是一个 gravity 函数(距离平方反比衰减函数)。重力根据质量和距离衰减。

var gridR = new RepulsionForce({
  strength: 1,
  decayFunction : RepulsionForce.DECAY_FUNCTIONS.GRAVITY
});

您可以将 linear 函数应用于排斥衰减,您将创建您正在寻找的效果。

var gridR = new RepulsionForce({
  strength: 1,
  decayFunction : RepulsionForce.DECAY_FUNCTIONS.LINEAR
});

如果引力线性衰减而不是二次衰减,则需要无穷大的动能才能逃离引力场。就像生活在 2D space.

回答问题的第二部分:墙壁没有恢复原状,但粒子仍然响应其他粒子的力。