在Box2D中更改方向时如何更新速度?
我正在写一个身体匀速移动的精灵。所以在时间步中是这样的:在Box2D中更改方向时如何更新速度?,box2d,physics-engine,Box2d,Physics Engine,我正在写一个身体匀速移动的精灵。所以在时间步中是这样的: const v = body.getLinearVelocity(); v.normalize(); body.setLinearVelocity(v * speed); 然后我想听听mouseclicked事件,精灵将相应地移动到新的方向 这就是我在mouseclicked事件处理程序中所做的: const point = /* new Point on screen */ const rotation = Math.atan2(p
const v = body.getLinearVelocity();
v.normalize();
body.setLinearVelocity(v * speed);
然后我想听听mouseclicked事件,精灵将相应地移动到新的方向
这就是我在mouseclicked事件处理程序中所做的:
const point = /* new Point on screen */
const rotation = Math.atan2(point.y - player.y, point.x - player.x);
body.setTransform(body.getPosition(), rotation);
但当我点击鼠标时,我的精灵不会转向新方向,而是以相同的恒定速度转向旧方向。我可以看到身体的角度在每一步都会改变。它只是不会走向新的方向
如何在Box2D中旋转精灵并将其移动到新方向?最好使用applyForce和/或applyImpulse,因为这会使身体实际移动。setTransform会将其传送到新的变换,而不会移动
B2D将计算所有的速度,包括角速度,当你使用这些apply*方法时,真实模拟的结果是什么。如果发生不现实的情况,则应使用setTransform或setLinearVelocity等方法
如果你的身体应该像一个真实的身体一样,前后移动,你需要计算使它移动到所需的新位置所需的力,可以通过调用b2Body::SetLinearVelocity方法来定期更新速度。这可能会改变物体速度的大小和/或方向
要仅更改实体的移动方向,请执行以下操作:
获取实体调用b2Body::GetLinearVelocity的当前线性速度。
将返回的b2Vec2的本地副本旋转到新标题。
将新的线速度设置为旋转的b2Vec2调用b2Body::SetLinearVelocity。
但是请注意,在物理世界中。因此,如果你的精灵有质量,那么从物理角度来看,以这种方式改变精灵的速度就不太现实了。如果它有质量,那么正如phillip所解释的,applyForce或applyImpulse是用来提供速度变化的方法,从物理角度来看,这些变化更真实。很抱歉,我仍然不理解你所说的将其发射到新变换的意思。我知道,当我希望它逐渐移动到某个速度时,最好使用applyForce/applyImpulse,但我只希望它以恒定的速度移动,从一开始到永远,不停止或开始。我的问题是如何在保持原有速度的情况下向一个新的方向移动。也许我们不应该说beam,而应该说teleport。setTransform就像拾取实体并将其放置在新位置一样。