使用PhysicsJS通过改变其位置来移动身体

时间:2015-12-14 18:15:27

标签: physicsjs

我可以通过更改state.pos和state.old.pos来将身体移动到特定点。但它似乎失去了它的速度(我认为加速度)。

这样做:

ship.body.state.pos.x = -context.width / 2 - ship.radius;
ship.body.state.old.pos.x = -context.width / 2 - ship.radius;

有更好的方法吗?我怎样才能改变其立场并保持其他一切?

文档中有什么内容吗?我无法找到它。

2 个答案:

答案 0 :(得分:1)

您正在将两个位置移动到相同的固定位置。因此速度设置为零。

您应该将两个位置移动相同的距离,以便保持它们之间的距离。

答案 1 :(得分:-1)

我找到了解决方案。我没有通过所有的资料来源,但有一些以前使用Physicsjs集成商的经验(https://coderwall.com/p/ntb6bg/metres-seconds-and-newtons-in-physicsjs)我开始认为它们可能是我问题的根源。

因此,显然,一个verlet积分器是Physicsjs模拟的默认值。我以前用过它很棒。但是,verlet积分器使用先前的位置来计算下一个位置(不仅仅是位置,它比那更复杂),所以手动更改它会搞砸。我不知道如何“修复”,或者甚至可能。但还有另一种方式。

在我的情况下,我所拥有的是一个简单的牛顿模拟,没有花哨的东西或疯狂的价值(我在这里使用技术术语......)所以欧拉积分器工作得很好,因为它没有使用先前的位置来计算接下来,完美地“远程传输”我的物体而不会失去速度,方向等。

请记住加载集成商:

void function (define) { 'use strict'; define( [ 'physicsjs', 'physicsjs/behaviors/attractor', 'physicsjs/behaviors/body-collision-detection', 'physicsjs/behaviors/sweep-prune', 'physicsjs/bodies/circle', 'physicsjs/integrators/improved-euler' ], physicsModule ); // function physicsModule(physics) { return physics; } }(define);

请记住将积分器添加到模拟中:

void function (define) { 'use strict'; define( [ 'physics' ], simulationModule ); // function simulationModule(physics) { var simulation = physics(); simulation.add(physics.behavior('body-collision-detection')); simulation.add(physics.behavior('sweep-prune')); simulation.add(physics.integrator('improved-euler')); return simulation; } }(define);