我试着对一个物体施力。让它以鼠标位置相对于对象产生的Angular 移动。
我有Angular
targetAngle = Matter.Vector.angle(myBody.pos, mouse.position);
现在我需要施加一个力,让物体沿着这个Angular 移动。我应该在下面的applyForce方法的值中输入什么?
// applyForce(body, position, force)
Body.applyForce(myBody, {
x : ??, y : ??
},{
x:??, y: ?? // how do I derive this force??
});
我在这里的x和y值中放什么,才能让身体沿着鼠标和身体之间的Angular 移动。
3条答案
按热度按时间qrjkbowd1#
要施加一个力来移动你的对象在那个方向上,你需要采取的正弦和余弦的Angular 弧度。你只需要传递对象的位置作为第一个向量,而不应用转矩(旋转)。
如果你需要的话,
applyForce()
的文档也在这里。(我知道这个问题很老了,我或多或少是为了那些偶然遇到它的人而做的)
8i9zcol22#
您可以依赖
Matter.Vector
模块,并使用它来减去,归一化和乘以位置向量:1hdlvixo3#
计算振幅:你必须在模拟循环中施加力
重点关注力的幅度/持续时间部分,重要的是要知道您应该在每个模拟步骤中随时间施加一次力,这可以从
beforeUpdate
回调中完成:比如说
下面是一个完整的最小可运行示例,它修改了Matter.js hello world,允许您使用ASDW移动其中一个框:
asdw.html
约束条件
另一种方法是使用约束,它隐式地将力正确地添加到循环中。
特别地,存在用于鼠标用例的鼠标约束帮助器:How to allow only a single body to move using Matter-js Mouse
鼠标约束非常容易使用,您所需要的只是从www.example.com改编的代码https://github.com/liabru/matter-js/blob/0.19.0/examples/constraints.js#L145
这允许你通过点击和拖动任何块来拖动它们。
基于Matter.js hello world的最小可运行示例:
mouse.html