问题 为什么PhysicsJS中的重力加速度为0.0004?


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

单位应该是什么?

如果我试图模拟与“背景”的摩擦,像这样:

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并学习很多但不是我找到了我想要的答案。

UPDATE

我收到了一个非常简单的答案。这只是为了让任何有兴趣知道我做了什么的人......

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

它只是原始(和默认)verlet积分器的略微变化。 我或多或少地在这篇(粗略的)文章中解释它 PhysicsJS中的米,秒和牛顿


11732
2018-05-16 21:04


起源

可能只是一个“有效”的价值。将像素视为真实世界单位是棘手的,尤其是在游戏中。想象一下“1像素= 1英尺” - 这个重力常数必须以像素/秒为单位在合理的时间内下降一定距离?更容易尝试不同的值,直到看起来正确:-) - usr2564301
@Jongware哇...我真的不想相信它。 = P以前我自己处理这个动作并且正在“使用”通常的单位(至少相对于彼此)。我只设置1米等于50像素,一切都很好。但在任何时候我都可以手动调整这种关系。然后我可以用真实的价值来模拟真实的力量。正如Burak Kanber所做的那样(burakkanber.com/blog/...)...我还没有放弃。 =) - slacktracer


答案:


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

所以加速度是 0.0004 像素/ MS / MS

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


6
2018-05-17 16:25



加速度与观察加速物体的距离有什么关系? - Bergi
当然,我不希望屏幕上的仪表是模拟仪表上的仪表。我只想选择一米多少像素。如果我能够考虑通常的单位(牛顿,米,秒,米,每秒平方等),我的模拟就像“真实世界”我只需要选择:有多少像素是米(它将占据我所看到的“距离”。说,从“这里”一个180厘米的人是50像素高(例如),其他一切都会跟着......我真的错过了一些明显的东西使它不合适或不可行? - slacktracer
你可以根据需要进行转换,但它会高度依赖于屏幕分辨率,而且看起来也很奇怪。看起来您将对象放在屏幕顶部。它们会迅速下降。通常,大多数应用程序都希望创建一个场景,就好像从远处看它一样。不是在你眼前。这是一个透视问题。 - Jasper
我真的不明白,@贾斯珀。对我来说,这种转变是透视。首先我说这个一米高的盒子将有50个像素,然后我的相机,我的视角缩小,现在它有10个像素。我的模拟并不重要。如果盒子向右移动每秒2米,它将继续向右移动每秒2米,现在它意味着右边每秒20像素(好吧,我在正方形中思考)。无论如何。我现在有了答案。还有新问题。如果您有关于转换的任何提示我真的很感激。非常感谢你。 - slacktracer
抱歉坚持。我想我希望被理解。 = P最后的话。诺言。一切都转化为像素是一个渲染问题,而不是物理问题......再次感谢你。再见。 - slacktracer


显然我还不能对帖子发表评论,所以这里是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.00272 对于PhysicsJS y加速度参数。


5
2018-06-06 19:51



是啊。 =)我想了几天,并得出了类似的理解(你的更彻底)。我还浏览了源代码并找到了一种方法,不仅可以使用我喜欢的单位,还可以配置每米像素的比例。看起来放大和缩小的好方法,等等。下周我将有时间再次处理它,并打算写几行并进行一些演示。我会更新我的问题...非常感谢你!每一点都让我的想法更加清晰。 - slacktracer
嘿,我写了“几行”: coderwall.com/p/ntb6bg 如果您有时间查看,我很乐意听取您的见解! - slacktracer


PhysicsJS基本用法  - 行为

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

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


0
2018-05-16 21:25



但为什么? 0.0004什么? - slacktracer
这是你的世界;我相信这是由你决定的。 - adamdc78
这不可能是正确的。 =)如果我想模拟一些特定的拖拽,我需要特定和一致的单位。 return this.velocityDirection.mult(-0.5 * rho, this.dragCoefficient * this.area * this.body.state.vel.clone().normSq());  如果我的面积是米平方(就像它)和我的速度像素每毫秒(看起来像),我会有问题。不幸的是,大问题。 - slacktracer
在这种情况下,你想要将你的区域转换为像素平方(不知道你是如何做到这一点来考虑缩放和显示分辨率),然后再将它传递给方法,不是吗?我实际上并没有使用过该库,但这就是我要做的。我希望我能更有用。 - adamdc78
无论如何,谢谢你,@ adamdc78。 =)我没有想到转换为像素...我不知道。我将尝试围绕它...将看看是否有一种有效的方法来完成所有转换并保持PhysicsJS的灵活性...... - slacktracer