在famo.us物理引擎中,是否可以在不改变x / y分量的情况下设置粒子速度的大小?我想能够设置球对象的速度,与其与其他对象的交互无关,类似于
ball.particle.setVelocity([1,1,0]);
但仅影响速度的大小。
我想这个问题的更一般的版本是,矢量可以根据幅度和角度来操纵,而不是根据x和y坐标来操纵吗?
答案 0 :(得分:0)
矢量的角度和大小是根据Famo.us中的x和y和z坐标计算的。
了解Magnitude将在这里帮到你。幅度是使用坐标计算的矢量的度量导数。幅度是矢量的长度。您可以了解卡恩学院的规模。基于知道幅度,无法知道矢量值。
使用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;
};