绳索物理:方法3

绳子可以看作一系列弹簧,每个点都试图接近另一个点。它不允许摆动,但可以用简单的方式表示绳子。这种方法将进行如下表示。

注意:本节中表达的思想也可以用于制作弹簧而不是绳子。

变量和列表

首先,每个绳子接头都需要两个速度变量来跟踪其速度:

  • X速度
  • Y速度

以及一些属性的质量变量:

  • 质量
  • 阻尼
  • 刚度
  • 重力

刚度使绳子更短,更硬。阻尼使力更慢传播。

由于计算原因,还需要一些变量:

  • X力
  • Y力
  • 真实的X力
  • 真实的Y力
  • 制作的绳索关节数量
  • 关节ID

以及一个用于跟踪弹簧关节的列表:

  • 绳索关节

一些背景知识

在弹簧中,弹簧的末端总是试图到达弹簧的顶部。但由于重力或碰到另一个弹簧的部分,它无法到达:

【图1】

在此处,弹簧的顶部将位于(x1,y1),底部将位于(x2,y2)。由于底部试图到达顶部,因此底部所经历的力为:

沿x轴的力= x2-x1


沿y轴的力= y2-y1

由于对象不会自动到达其想要的位置,因此需要一些刚度:

X力=(x2-x1)刚度


Y力=(y2-y1)刚度

由于需要在对象的质量上分配能量,因此需要将其纳入考虑范围:

X力=((x2-x1)刚度)/质量


Y力=((y2-y1)刚度)/质量

然后将其添加到底部弹簧的速度中。需要添加的最后一个因素是摩擦力,这可以通过以下方式完成:

X速度=(X速度+X力)* 阻尼


Y速度=(Y速度+Y力)* 阻尼

编程

创建一个连接到鼠标的两个关节的绳子。首先,需要一个克隆基础:

【图2】

接下来,需要渲染绳子,并将它们添加到绳接头中,以便其他克隆可以查看它们的位置:

【图3】

3(1).png

然后,添加物理效果:

【图4】

4(1).png

最终产品

以下是制作连接到鼠标的两个关节的绳子的代码:

【图5】

5(1).png

5(2).png

基于摆动弹簧的绳子

摆锤弹簧绳索

变量和列表

首先,每个绳接头都需要两个速度变量来跟踪其速度:

  • X速度
  • Y速度

接下来,需要一个列表来跟踪每个绳子:

  • 绳接头

还需要两个变量,以便绳子可以按顺序确定它们的位置:

  • 制作的绳接头
  • 关节ID

以及每个绳段的长度:

  • 段长度

另一个列表将需要用于跟踪创建的绳子质量:

  • ChainCreateList

还需要一个列表来跟踪已删除的绳接头:

  • 删除的绳接头

还需要一个变量来跟踪绳接头是否在绳子的末端:

  • 关节类型

以及重力:

  • 重力

以及几个计算变量:

  • 距离
  • X轴上的差异
  • Y轴上的差异
  • 绳张力
  • X力
  • Y力
  • i
  • 第二个关节点ID

以及用于玩家角色精灵速度的两个变量:

  • 玩家X速度
  • 玩家Y速度

一些背景信息

在这个绳索模拟中,弹簧与基于弹簧的绳索不同,它会指向距离其摆动点的最小距离。这导致了一些类似于摆锤的特性:

【图6】

顶部标记为 x1 和 y1。弹簧的底部(自由部分)标记为 x2 和 y2。首先需要初始化一些变量:

Difference in X = x2 - x1


Difference in Y = y2 - y1


Distance = √((Difference in X)^2 + (Difference in Y)^2)

然后,使用一个中间变量来找到力与绳长的比例:

Rope Tension = (((Distance) - (Segment Length))/(Distance))

然后再倒推找到单个力本身:

ForceX = ((-1) ((Rope Tension) (Difference in X)))


ForceY = ((-1) ((Rope Tension) (Difference in Y)))

编码

ChainCreateList

为了编写代码,将有三种绳索连接点类型:

  • 1 - 具有上方和下方绳索连接点的绳索连接点。
  • 0 - 连接到对象的绳索连接点。对于本教程,它将连接到玩家角色。
  • -1 - 仅连接到另一个绳索连接点的绳索连接点。

例如,以下绳索可以由以下绳索连接点构建:

1, 1, 1, 0

这根绳索有四个长度,并且玩家连接在末尾。

同时,ChainCreateList 将按照以下顺序进行排列:

  • Rope Joint 1 的 X 位置
  • Rope Joint 1 的 Y 位置
  • Rope Joint 1 的类型
  • Rope Joint 2 的 X 位置
  • Rope Joint 2 的 Y 位置
  • Rope Joint 2 的类型
  • 以此类推。

绳索创建(自定义块)

为了创建绳索,需要使用两个自定义块。一个自定义块记录创建的每个绳索关节的信息,另一个自定义块实际上创建绳索。如下所示:

【图7】

创建绳索关节

为了简化处理,每个绳索关节都将是 Ropes 的克隆。应将以下脚本添加到 Ropes:

【图8】

8(1).png

8(2).png

永远块内的代码实际上非常简单。它只由两个自定义块和两个列表块组成,以更新(Rope Joints)中绳索关节的位置。填写了永远块后,代码如下所示:

【图9】

9(1).png

9(2).png

向绳索关节添加物理

物理的前半部分就像上面称为“一些背景”的部分一样。

【图10】

10(1).png

10(2).png

这种物理模型的问题在于,如果整个绳索完全静止,但其末端疯狂地扭动,则只会影响绳索的末端。实际上,部分扭曲的末端力会沿着绳索传播。为了解决这个问题,脚本将重新应用物理,但是绳索关节不再尝试到其上方的关节,而是尝试到其下方的关节。之所以这样做是因为重力总是将绳索关节保持在段长度的阈值以下。

【图11】

11(1).png

11(2).png

绘制绳索

绘制绳索非常简单。它在两个绳索关节之间绘制一条线,并在每个绳索关节处添加一个点以看起来像一个结。

【图12】

删除绳索

删除绳索需要三个脚本。前两个脚本从列表(Rope Joints)中删除所有删除的绳索数据,另一个脚本用于删除这些绳索关节的克隆,并在需要时更改其他绳索关节的数据。前两个脚本如下所示。

自定义块的变量(Joint Point ID)应是 3 的倍数,不会取任何其他值。

此外,请记住,列表 Removed Rope Joints 用于跟踪已删除的绳索关节的(Clone ID)。

【图13】

13(1).png

如上所述,第三个脚本仅删除已删除的绳索关节克隆,并更改其他绳索关节克隆的数据,使它们指向(Rope Joints)中的正确位置。

【图14】

14(1).png

杂项

要删除所有绳索,需要在 Ropes 中使用下一个脚本:

【图15】

要测试是否已正确复制代码,可以制作一个摆动的绳索,末端连接一个玩家。请注意,它需要一个名为(X Acceleration)和另一个名为(j)的变量。

【图16】

16(1).png

16(2).png

玩家精灵

像普通的平台游戏一样,玩家精灵需要不断运行以下脚本

  • 重力
  • 一个脚本来通过(Player X Velocity)改变x值
  • 一个脚本来通过(Player Y Velocity)改变y值
  • 一个脚本来减小(Player X Velocity)因为摩擦力。将(Player X Velocity)乘以0.65很好。
  • 一个脚本来减小(Player Y Velocity)因为摩擦力。将(Player Y Velocity)乘以0.65很好。

最终成品

忽略玩家精灵和测试代码,所有必需的代码如下所示。

【图17】

下面的两个脚本可以放在任何精灵中:

【图18】

18(1).png

标签: Scratch, Scratch编程, Scratch中国, 少儿编程, Scratch社区, Scratch编程社区, Scratch编程课程, Scratch编程教程