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

3

目前我正在使用C#在Unity中创建2D平台游戏,我想知道如何制作类似下面这样的称重器。

enter image description here

简单地说,当一个重的rigidbody2d被放置在其中一个秤上时,另一个秤会上升,反之亦然。如果重量相等,我还希望秤保持平衡。我该如何实现这个功能?是否有组件可以轻松完成这个任务?


你是在询问它的数学/物理方面,还是绘制和渲染2D对象? - Nate Barbettini
实现这个所需的物理学。 - Gazz
1个回答

5

数学计算

首先,我不知道是否有组件可以代替您完成此操作。我们将需要自己进行一些物理计算。如果您不关心数学计算,只想知道应该怎么做,请直接跳到底部。让我们假设有两个箱子,一个在左侧拉力器上,另一个在右侧。我假设带绳的滑轮装置是无摩擦和无质量的。在这种情况下,我们可以像这样绘制出图表:

enter image description here

W1 是左箱的重量,W2 是右箱的重量。 T 是由两个箱引起的绳张力。现在我们只看左箱:

enter image description here

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

现在让我们看右边的箱子:

enter image description here

我们在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);

那应该可行。如果不行请告诉我,我会修复我的答案。

我来晚了。你的数学计算是一个很好的例子,非常有帮助。你知道有没有一种方法可以在不使用每个秤上单个物体的重量的情况下进行计算吗?例如,我想要一个工作秤,可以在上面放置任意数量的物体,或者任何力量都可以推/拉它们。 - Sean256

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接