如何在 Unity 3D 中使用称重秤?

Posted

技术标签:

【中文标题】如何在 Unity 3D 中使用称重秤?【英文标题】:How to approach weighing scales in Unity 3D? 【发布时间】:2016-08-10 16:52:23 【问题描述】:

目前我正在使用 C# 创建一个统一的 2d 平台游戏,我想知道如何创建一个像下面这样的秤。

解释一下,我想要这样当一个沉重的rigidbody2d 放在其中一个秤上时,另一个秤会向上移动,反之亦然。我也想要它,这样如果重量相等,天平就可以平衡。我将如何解决这个问题?有没有一个组件可以让这很容易完成?

【问题讨论】:

您是在询问它的数学/物理,还是绘制和渲染 2D 对象? 完成此任务所需的物理学。 【参考方案1】:

数学

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

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);

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

【讨论】:

我在这里参加聚会真的很晚了。你的数学是如何做到这一点的一个很好的例子,它真的很有帮助。你知道不用每个秤上单个物体的重量来计算这个的方法吗?例如,我想要一个工作秤,可以在秤上放置任意数量的物体,或者任何力都可以推/拉它们。

以上是关于如何在 Unity 3D 中使用称重秤?的主要内容,如果未能解决你的问题,请参考以下文章

秤砝码

在 python 中通过 RS232 到 USB 电缆读取秤数据

如何在 Unity 3D 中使用 goto 属性?

如何在 Unity 中从 3D 对象中获取 2D 视图/纹理

如何在 Unity 3d 中使用 JSON Web Token (JWT)?

如何在 Unity3D 中使用 NVIDIA FleX 制作软体果冻球?