Scratch编程教程-绳索物理:方法3

绳索物理:方法3
绳子可以看作一系列弹簧,每个点都试图接近另一个点。它不允许摆动,但可以用简单的方式表示绳子。这种方法将进行如下表示。
注意:本节中表达的思想也可以用于制作弹簧而不是绳子。
变量和列表
首先,每个绳子接头都需要两个速度变量来跟踪其速度:
- X速度
- Y速度
以及一些属性的质量变量:
- 质量
- 阻尼
- 刚度
- 重力
刚度使绳子更短,更硬。阻尼使力更慢传播。
由于计算原因,还需要一些变量:
- X力
- Y力
- 真实的X力
- 真实的Y力
- 制作的绳索关节数量
- 关节ID
以及一个用于跟踪弹簧关节的列表:
- 绳索关节
一些背景知识
在弹簧中,弹簧的末端总是试图到达弹簧的顶部。但由于重力或碰到另一个弹簧的部分,它无法到达:
在此处,弹簧的顶部将位于(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力)* 阻尼
编程
创建一个连接到鼠标的两个关节的绳子。首先,需要一个克隆基础:
接下来,需要渲染绳子,并将它们添加到绳接头中,以便其他克隆可以查看它们的位置:
然后,添加物理效果:
最终产品
以下是制作连接到鼠标的两个关节的绳子的代码:
基于摆动弹簧的绳子
摆锤弹簧绳索
变量和列表
首先,每个绳接头都需要两个速度变量来跟踪其速度:
- X速度
- Y速度
接下来,需要一个列表来跟踪每个绳子:
- 绳接头
还需要两个变量,以便绳子可以按顺序确定它们的位置:
- 制作的绳接头
- 关节ID
以及每个绳段的长度:
- 段长度
另一个列表将需要用于跟踪创建的绳子质量:
- ChainCreateList
还需要一个列表来跟踪已删除的绳接头:
- 删除的绳接头
还需要一个变量来跟踪绳接头是否在绳子的末端:
- 关节类型
以及重力:
- 重力
以及几个计算变量:
- 距离
- X轴上的差异
- Y轴上的差异
- 绳张力
- X力
- Y力
- i
- 第二个关节点ID
以及用于玩家角色精灵速度的两个变量:
- 玩家X速度
- 玩家Y速度
一些背景信息
在这个绳索模拟中,弹簧与基于弹簧的绳索不同,它会指向距离其摆动点的最小距离。这导致了一些类似于摆锤的特性:
顶部标记为 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 的类型
- 以此类推。
绳索创建(自定义块)
为了创建绳索,需要使用两个自定义块。一个自定义块记录创建的每个绳索关节的信息,另一个自定义块实际上创建绳索。如下所示:
创建绳索关节
为了简化处理,每个绳索关节都将是 Ropes 的克隆。应将以下脚本添加到 Ropes:
永远块内的代码实际上非常简单。它只由两个自定义块和两个列表块组成,以更新(Rope Joints)中绳索关节的位置。填写了永远块后,代码如下所示:
向绳索关节添加物理
物理的前半部分就像上面称为“一些背景”的部分一样。
这种物理模型的问题在于,如果整个绳索完全静止,但其末端疯狂地扭动,则只会影响绳索的末端。实际上,部分扭曲的末端力会沿着绳索传播。为了解决这个问题,脚本将重新应用物理,但是绳索关节不再尝试到其上方的关节,而是尝试到其下方的关节。之所以这样做是因为重力总是将绳索关节保持在段长度的阈值以下。
绘制绳索
绘制绳索非常简单。它在两个绳索关节之间绘制一条线,并在每个绳索关节处添加一个点以看起来像一个结。
删除绳索
删除绳索需要三个脚本。前两个脚本从列表(Rope Joints)中删除所有删除的绳索数据,另一个脚本用于删除这些绳索关节的克隆,并在需要时更改其他绳索关节的数据。前两个脚本如下所示。
自定义块的变量(Joint Point ID)应是 3 的倍数,不会取任何其他值。
此外,请记住,列表 Removed Rope Joints 用于跟踪已删除的绳索关节的(Clone ID)。
如上所述,第三个脚本仅删除已删除的绳索关节克隆,并更改其他绳索关节克隆的数据,使它们指向(Rope Joints)中的正确位置。
杂项
要删除所有绳索,需要在 Ropes 中使用下一个脚本:
要测试是否已正确复制代码,可以制作一个摆动的绳索,末端连接一个玩家。请注意,它需要一个名为(X Acceleration)和另一个名为(j)的变量。
玩家精灵
像普通的平台游戏一样,玩家精灵需要不断运行以下脚本
- 重力
- 一个脚本来通过(Player X Velocity)改变x值
- 一个脚本来通过(Player Y Velocity)改变y值
- 一个脚本来减小(Player X Velocity)因为摩擦力。将(Player X Velocity)乘以0.65很好。
- 一个脚本来减小(Player Y Velocity)因为摩擦力。将(Player Y Velocity)乘以0.65很好。
最终成品
忽略玩家精灵和测试代码,所有必需的代码如下所示。
下面的两个脚本可以放在任何精灵中: