famo.us物理学设定粒子速度的大小独立于x-y分量

时间:2014-11-02 21:57:10

标签: famo.us

在famo.us物理引擎中,是否可以在不改变x / y分量的情况下设置粒子速度的大小?我想能够设置球对象的速度,与其与其他对象的交互无关,类似于

ball.particle.setVelocity([1,1,0]);

但仅影响速度的大小。

我想这个问题的更一般的版本是,矢量可以根据幅度和角度来操纵,而不是根据x和y坐标来操纵吗?

2 个答案:

答案 0 :(得分:0)

矢量的角度和大小是根据Famo.us中的x和y和z坐标计算的。

了解Magnitude将在这里帮到你。幅度是使用坐标计算的矢量的度量导数。幅度是矢量的长度。您可以了解卡恩学院的规模。基于知道幅度,无法知道矢量值。

使用Famo.us返回您想要完成的任务。

粒子的基本解释

Famo.us中的粒子基于它的速度,位置和力。因此,我们必须知道角度的矢量来设置Famo.us中粒子的速度。目前还没有一种能够传递角度并设置速度的方法。

创建在Famo.us中具有恒定幅度的示例

<强> Working Example Code on jsBin

设置原始Vector

  var impulse = 0.01;
  var vector = new Vector(1,1,0);
  // Setup our maximum Magnitude to the magnitude of our vector
  var maxMagnitude = vector.norm();

将力设置为粒子上的脉冲以使其保持运动。将我们的速度设置为最大幅度以控制我们的恒定速度。

注意:Famo.us中粒子的大小为particle.norm()。不知道为什么他们没有称之为量级。

  function setForce() {
    // Apply an impulse to the current vector keep it in motion
    this.applyImpulse(this.velocity.cap(impulse));
    // set the velocity speed to be a max in units
    this.setVelocity(this.velocity.cap(maxMagnitude));
    // Return the particles transform value
    return this.getTransform();
  }

从粒子变换转换

var physicsEngine = new PhysicsEngine();

var particle = new Particle({
  mass: 1,
  position: [100, 100, 0]
});

var modifier = new Modifier();
modifier.transformFrom(setForce.bind(particle));

var surface = new new ImageSurface({
  content: 'http://code.famo.us/assets/famous_logo.svg',
  size: [radius * 2, radius * 2],
  properties: {
    borderRadius: (radius * 2) + 'px'
  }
});

physicsEngine.addBody(particle);

context.add(modifier).add(surface);

//Start the particle in motion
particle.setVelocity([vector.x, vector.y, 0]);

答案 1 :(得分:0)

这将允许任意设置幅度和幅度。方向(以标准方向的度数)。

function setMagAndDir(particle, magnitude, angle) {
  angle = angle * (Math.PI / 180);
  var xComp = magnitude * Math.cos(angle);
  var yComp = -1 * magnitude * Math.sin(angle);
  particle.setVelocity([xComp,yComp,0]);
};

唯一的缺点是两者都必须同时设置。要单独设置,请通过下面的一个getter。

function readMagnitude(particle) {
  return Math.sqrt( ((particle.getVelocity()[0]) * (particle.getVelocity()[0])) + ((particle.getVelocity()[1]) * (particle.getVelocity()[1])) );
};

function readDirection(particle) {
  var direction = Math.atan2((-1 * particle.getVelocity()[1]),particle.getVelocity()[0]);
  direction = direction * (180 / Math.PI);
  if (particle.getVelocity()[1] > 0) {
    direction = direction + 360;
  }
  return direction;
};