【问题标题】:Why gravity acceleration is 0.0004 in PhysicsJS?为什么 PhysicsJS 中的重力加速度为 0.0004?
【发布时间】:2014-06-12 05:39:17
【问题描述】:

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

单位应该是什么?

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

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 文档并学到了很多东西,但我没有找到我想要的答案。

更新

我收到了一个非常直接的答案。这只是为了让有兴趣的人知道我当时做了什么……

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

这只是原始(和默认)verlet 集成器的轻微变化。 我在这篇(粗略的)文章Metres, Seconds and Newtons in PhysicsJS

中或多或少地解释了它

【问题讨论】:

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

标签: javascript physics physicsjs


【解决方案1】:

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

所以加速度是0.0004pixels/ms/ms

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

【讨论】:

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

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

【讨论】:

  • 是的。 =)我想了几天,得出了类似的理解(你的更彻底)。我还浏览了源代码并找到了一种方法,不仅可以使用我喜欢的单位,而且可以配置每米像素比率。除其他外,这似乎是放大和缩小的好方法。下周有时间再处理,打算写几行,做几个demo。那我会更新我的问题......非常感谢!每一点都让我的想法更清晰。
  • 嘿,我写了“几行”:coderwall.com/p/ntb6bg如果您有时间查看它,我很想听听您的见解!
【解决方案3】:

来自PhysicsJS Basic Usage - 行为

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

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

【讨论】:

  • 但是为什么呢? 0.0004 什么?
  • 这是你的世界;我相信这由你来决定。
  • 这不可能。 =) 如果我想模拟一些特定的阻力,我需要特定且一致的单位。 return this.velocityDirection.mult(-0.5 * rho, this.dragCoefficient * this.area * this.body.state.vel.clone().normSq()); 如果我的面积是平方米(实际上),而我的速度是每毫秒像素的速度(看起来是这样),我会遇到问题。不幸的是,大问题。
  • 在这种情况下,您希望在将其传递给方法之前将您的区域转换为像素平方(不知道如何做到这一点以考虑缩放和显示分辨率),不会你?我实际上并没有使用过这个库,但这就是我会做的。我希望我能更有用。
  • 谢谢你,@adamdc78。 =) 我还没有考虑过转换为像素...我不知道。我会试着绕开它……看看是否有一种有效的方法来进行所有转换并保持 PhysicsJS 的灵活性……
猜你喜欢
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 2012-01-06
相关资源
最近更新 更多