如何在 Unity 3D 中处理体重秤?

How to approach weighing scales in Unity 3D?

目前我正在使用 C# 统一创建一个 2d 平台游戏,我想知道我将如何创建一个如下所示的体重秤。

解释一下,我想要这样当一个重物 rigidbody2d 放在其中一个秤上时,另一个秤会向上移动,反之亦然。我也希望它能够在重量相等的情况下保持平衡。我将如何着手解决这个问题?是否有一个组件可以使这很容易完成?

数学

首先,据我所知,没有任何组件可以为您执行此操作。我们只需要自己做一些物理。 如果您不关心数学并且只想看看您应该做什么,请跳到底部。让我们假设有两个盒子,一个在左边的拉杆上,一个在右边。我假设带绳子的滑轮装置是无摩擦且无质量的。那样的话,我们可以画出这样的图:

W1是左框的权值,W2是右框的权值。 T 是由两个盒子引起的绳索张力。我们现在只看左边的框:

x 方向的力总和为 Fx_1 = T - W_1,因为我们选择了正确的方向作为正方向。让我们套用牛顿第二定律,力=质量*加速度:M_1 * a_1 = T - M_1 * gM_1 是盒子的质量,a_1 是盒子的净加速度,g 是重力加速度。让我们将其重写为:T = M_1 * a_1 + M_1 * g.

现在让我们看看右边的方框:

让我们对 x 方向的力求和:Fx_2 = W_2 - T。让我们也重写它:T = W_2 - Fx_2。让我们应用牛顿第二定律:T = M_2 * g - M_2 * a_2。右侧和左侧的盒子的拉力相同,因此我们可以通过设置 T = T:

来合并两个方程
M_1 * a_1 + M_1 * g = M_2 * g - M_2 * a_2
Rewrite: M_1 * a_1 + M_2 * a_2 = M_2 * g - M_1 * g
Rewrite: M_1 * a_1 + M_2 * a_2 = g(M_2 - M_1)

在这种情况下,当您将两个东西放在天平秤或滑轮上时,左右两个盒子的秤以相同的加速度倾斜,对吗?刻度左侧下降的速度与右侧上升的速度相同。所以,a_1a_2 实际上是相同的值。所以我们可以这样重写:

a(M_1 + M_2) = g(M_2 - M_1)
Rewrite: a = g(M_2 - M_1) / (M_1 + M_2)

结论

因此,系统的净加速度向右 g(M_2 - M_1) / (M_1 + M_2)。因此,如果您知道两个盒子的质量,并且知道重力加速度(您可能一开始就设置了这些值),那么这个公式会告诉您右盒子下落的速度和左盒子上升的速度。

如果等式给出负值,这意味着左边的盒子比右边的盒子重。然后公式告诉你左边的盒子下降的速度有多快,右边的盒子上升的速度有多快。

如果质量相等,则系统的净加速度将为 0,两个盒子都不会移动。

如何在 Unity 中执行此操作

你知道你的盒子的质量,你知道两个盒子的加速度,用上面的公式 (a = g(M_2 - M_1) / (M_1 + M_2))。因此,将脚本附加到您要移动的任何东西并编写以下内容:

this.GetComponent<Rigidbody>().AddForce(Vector3.down * MASS_OF_THIS_OBJECT * CALCULATED_ACCELERATION);

应该可以。如果没有,请告诉我,我会修正我的答案。