如何在 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 * g
。 M_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_1
和 a_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);
应该可以。如果没有,请告诉我,我会修正我的答案。
目前我正在使用 C# 统一创建一个 2d 平台游戏,我想知道我将如何创建一个如下所示的体重秤。
解释一下,我想要这样当一个重物 rigidbody2d
放在其中一个秤上时,另一个秤会向上移动,反之亦然。我也希望它能够在重量相等的情况下保持平衡。我将如何着手解决这个问题?是否有一个组件可以使这很容易完成?
数学
首先,据我所知,没有任何组件可以为您执行此操作。我们只需要自己做一些物理。 如果您不关心数学并且只想看看您应该做什么,请跳到底部。让我们假设有两个盒子,一个在左边的拉杆上,一个在右边。我假设带绳子的滑轮装置是无摩擦且无质量的。那样的话,我们可以画出这样的图:
W1
是左框的权值,W2
是右框的权值。 T
是由两个盒子引起的绳索张力。我们现在只看左边的框:
x 方向的力总和为 Fx_1 = T - W_1
,因为我们选择了正确的方向作为正方向。让我们套用牛顿第二定律,力=质量*加速度:M_1 * a_1 = T - M_1 * g
。 M_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_1
和 a_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);
应该可以。如果没有,请告诉我,我会修正我的答案。