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.
回答问题的第二部分:墙壁没有恢复原状,但粒子仍然响应其他粒子的力。
我正在尝试使用著名的物理引擎创建粒子网格。我认为如果将 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.
回答问题的第二部分:墙壁没有恢复原状,但粒子仍然响应其他粒子的力。