【问题标题】:Move a body by changing its position using PhysicsJS通过使用 PhysicsJS 更改其位置来移动身体
【发布时间】:2015-12-22 04:21:18
【问题描述】:

我可以通过改变它的 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;

有没有更好的方法呢?我怎样才能改变它的位置并保持其他一切不变?

文档中有关于它的内容吗?我找不到它。

【问题讨论】:

    标签: physicsjs


    【解决方案1】:

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

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

    【讨论】:

    • 有趣的拍摄。我会仔细看看的。谢谢。
    【解决方案2】:

    我找到了解决方案。我没有仔细研究所有来源,但之前有一些使用 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);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      相关资源
      最近更新 更多