11

或者,也许更好,这是什么意思?

单位应该是什么?

如果我试图模拟对“背景”的摩擦,如下所示:

return this
    .velocityDirection
    .mult(mu * this.mass * g)
    .negate();

我希望将 g 用作 9.80665 m/s^2。在 PhysicsJS 之前它就是这样工作的:

var
    frictionForce;
    frictionForce = vec2.create();
    vec2.scale(
        frictionForce,
        vec2.negate(
            frictionForce,
            this.velocityDirection
        ),
        mu * this.mass * g
    );
return frictionForce;

在我的线性代数中使用 glMatrix。

我正在考虑以千克为单位的质量和以牛顿为单位的力(等),但在 PhysicsJS 中它似乎不是这样工作的。(例如:如果我有一个半径为 1 的圆体,那么它是 1 什么?因为当我必须将此值用于其他用途以及将其“转换”为屏幕上的像素时,它会有所不同)

现在我正在使用物理库,我觉得我错过了一些物理......

我希望有人能指出我正确的方向以更好地理解它。我现在正在浏览 API Docs 并学到了很多东西,但我没有找到我想要的答案。

更新

我收到了一个非常直截了当的回答。这只是为了让任何有兴趣的人知道我当时做了什么......

感谢 Jasper 和 dandelany,我开始了解一些 PhysicsJS 是如何工作得更好的。为了实现我在 PhysicsJS 中使用牛顿、米每秒平方(等)输入的“梦想”(并且还具有可配置的每米像素比率),我决定创建另一个积分器。

它只是原始(和默认)verlet 集成器的轻微变化。我在这篇(粗略的)文章中或多或少地解释了物理JS中的米、秒和牛顿

4

3 回答 3

6

距离的单位是像素,时间的单位是毫秒。

所以加速度是0.0004像素/毫秒/毫秒

由于各种原因,使用仪表没有意义。每英寸的像素数因设备而异。此外,即使您进行了转换,9.8 m/s/s 的加速度也会显得非常快,因为通常计算机模拟想要给出从远处看它的外观......所以你不会想要一个屏幕上的仪表对应于模拟中的仪表。

于 2014-05-17T16:25:23.600 回答
5

显然我还不能对帖子发表评论,所以这是 Jasper 回答的后续内容,因为您要求提供有关进行转换的提示:

Jasper 给出的单位为0.0004 px/ms/ms(或 px/ms^2)。了解单位使得使用单位取消可以非常简单地进行这种转换。首先我们将该数字转换为 px/s^2:

0.0004 px/ms^2 * 1000 ms/s * 1000 ms/s = 400 px/s^2

由于我们知道地球上的重力是 ~ 9.8 m/s^2,这意味着默认值是模拟一个比例:

400 px/s^2 * (1/9.8) s^2/m ~= 41 px/m

因此,使用默认设置,PhysicsJS 正在模拟一个米长为 41 像素的世界。如果我们使用您的示例“一个 180 厘米的人是 50 像素高”,那么我们将转换为以下比例:

50px / 0.180m ~= 278px/m

将其转换回 px/ms^2,加速度为 9.8 m/s^2,您将得到:

278 px/m * 9.8 m/s^2 * (1/1000) s/ms * (1/1000) s/ms ~= 0.00272 px/ms^2

因此,要模拟一个 180 厘米的人身高 50 像素的世界,您可以使用0.00272PhysicsJS 的 y 加速度参数。

于 2014-06-06T19:51:41.510 回答
0

来自PhysicsJS 基本用法- 行为

// add some gravity
var gravity = Physics.behavior('constant-acceleration', {
    acc: { x : 0, y: 0.0004 } // this is the default
});

您可以控制重力的工作方式,但它似乎没有提供单位参考。

于 2014-05-16T21:25:16.900 回答