我可以通过改变物体的状态.pos和状态.old.pos将其移动到特定的点。但它似乎失去了速度(我想还有加速度)。
这样做:
ship.body.state.pos.x = -context.width / 2 - ship.radius;
ship.body.state.old.pos.x = -context.width / 2 - ship.radius;
有更好的方法吗?我如何才能改变它的位置并保持其他一切不变?
文档中有关于它的内容吗?我找不到它。
您正在将两个位置移动到同一固定位置。因此,速度被设置为零。
您应该将两个位置移动相同的距离,以便保留它们之间的距离。
我找到了一个解决方案。我没有浏览所有的源代码,但之前有一些Physicsjs集成商的经验(https://coderwall.com/p/ntb6bg/metres-seconds-and-newtons-in-physicsjs)我开始认为它们可能是我问题的根源。
因此,显然,对于Physicsjs模拟,verlet积分器是默认的。我以前用过,非常棒。但是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);