二维软体:凝胶状和可塑性?
2D soft bodies: Gelly and moldable?
我正在使用 Matter.js 物理学来尝试创建软体。我能够像这样创建 body:
不过我不确定这是否是我想要的"soft body"。的确,这个 body 并不是完全刚性的,并且在碰撞和被拖动时具有弹性的感觉。我一直在寻找与凝胶有相似之处的 body。这张图片可能在视觉上有助于解释这个概念:
我想知道如何制作这些类型的身体。它与 as matter.js soft body 相同但具有非常特定类型的属性吗?我只能让 body 变得有点 rigid-squared 而不是像我希望的那样可塑和圆形。
我也对通过 in-game 相互作用来操纵物理 body 感兴趣,这会增加或减小物理 body 的大小,这让我再次得出结论body我想要的一定是可塑的。
matter.js 可以解决这个问题还是我必须更改物理引擎?有解决这个问题的方法吗?
注意:我对某些 in-game 组件使用 Phaser.js,但对物理操作使用 matter.js 物理,因为我相信 Phaser 集成物理无法模拟这种类型的复杂 body.
谢谢
编辑:它与此非常相似Box2d :roll soft body ball。我猜我只需要用一个 js 引擎来做到这一点。有没有?
正如我在评论中提到的,我不熟悉移相器,也不熟悉如何在 Javascript 框架内实际实现它。我的目标可能是为您提供一些关于不同方法的想法,希望您会发现这个答案有用。
我会尽量回答这个问题:
I was wondering how these type of bodies can be made. ... I can only get the body to be kind of rigid-squared and not as moldable and circular as I would like it to be.
这句话不一定清楚你想要什么。正如我在评论中指出的那样,我认为 你正在寻找的是 可塑性 ,我将描述一种你可能 "cheat" ] 用一些简单的工具看起来。
目前你用“描述你的 body 的运动是真的,这个 body 并不是完全刚性的,并且在碰撞和获得时有弹性的感觉拖了。”。目前您的模型是这样工作的:
- 一个点连接到网格中给定的所有其他点。
- 每个时间步,计算每对之间的力。关节(或点)上的总力是所有这些成对力的总和。
- 每个关节都与 body 的一部分相关联(即它有一定的质量
m
),你可以用 acceleration = force/m
计算它的加速度。从那里我们计算 velocity
最后 position
.
上述步骤中最有趣的部分是nr 2,因为它会极大地影响整体的运动body。一个非常常见的实现方式是作为一个 弹性势能 ,对于两点之间的某个 distance
给出一些 force
。像这样:
function elasticPotential(p1, p2) {
// Given two positions p1 and p2 we calculate a force between them
distance = sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2) + pow(p1.z - p2.z, 2));
force = force_given_distance(distance); // A popular choice here is for example a spring force
return force;
}
现在,您的框架中已经内置了上述功能,因此您不必再实现它。我之所以这样描述,是因为它对于理解我们如何创造可塑性至关重要。上面的问题是没有什么会保持变形---弹性势的本质是它有一些静止配置(很可能你的第一个配置),它总是会尝试回到那个形状。我们希望形状 记住 它是如何 mis-shaped 的。这就是可塑性。
简单可塑性
首先请注意,可塑性问题是一个很大的研究课题,在许多情况下远非微不足道。我的想法是:如果两个连接点之间的距离大于某个阈值,重新网格化当前配置中的点。也就是说,
for each pair(p1, p2):
if distance(p1, p2) > threshold:
recalculate_connection(p1, p2)
如您所见,这是一个非常简单的可塑性模型,很可能在物理上不正确。但是,我应该可以通过重新网格化以及您选择的弹性势能获得有趣的行为。
如果您提供更多详细信息,我也许可以进一步讨论这个问题,但现在我觉得这个答案已经比应该的要长了。
长话短说:
通过在变形期间重新划分 body 的网格来创建 "moldable" 形状。获得确切的所需物理行为可能很棘手,但应该可以创建看起来 "gelly-like".
的东西
我正在使用 Matter.js 物理学来尝试创建软体。我能够像这样创建 body:
不过我不确定这是否是我想要的"soft body"。的确,这个 body 并不是完全刚性的,并且在碰撞和被拖动时具有弹性的感觉。我一直在寻找与凝胶有相似之处的 body。这张图片可能在视觉上有助于解释这个概念:
我想知道如何制作这些类型的身体。它与 as matter.js soft body 相同但具有非常特定类型的属性吗?我只能让 body 变得有点 rigid-squared 而不是像我希望的那样可塑和圆形。
我也对通过 in-game 相互作用来操纵物理 body 感兴趣,这会增加或减小物理 body 的大小,这让我再次得出结论body我想要的一定是可塑的。
matter.js 可以解决这个问题还是我必须更改物理引擎?有解决这个问题的方法吗?
注意:我对某些 in-game 组件使用 Phaser.js,但对物理操作使用 matter.js 物理,因为我相信 Phaser 集成物理无法模拟这种类型的复杂 body.
谢谢
编辑:它与此非常相似Box2d :roll soft body ball。我猜我只需要用一个 js 引擎来做到这一点。有没有?
正如我在评论中提到的,我不熟悉移相器,也不熟悉如何在 Javascript 框架内实际实现它。我的目标可能是为您提供一些关于不同方法的想法,希望您会发现这个答案有用。
我会尽量回答这个问题:
I was wondering how these type of bodies can be made. ... I can only get the body to be kind of rigid-squared and not as moldable and circular as I would like it to be.
这句话不一定清楚你想要什么。正如我在评论中指出的那样,我认为 你正在寻找的是 可塑性 ,我将描述一种你可能 "cheat" ] 用一些简单的工具看起来。
目前你用“描述你的 body 的运动是真的,这个 body 并不是完全刚性的,并且在碰撞和获得时有弹性的感觉拖了。”。目前您的模型是这样工作的:
- 一个点连接到网格中给定的所有其他点。
- 每个时间步,计算每对之间的力。关节(或点)上的总力是所有这些成对力的总和。
- 每个关节都与 body 的一部分相关联(即它有一定的质量
m
),你可以用acceleration = force/m
计算它的加速度。从那里我们计算velocity
最后position
.
上述步骤中最有趣的部分是nr 2,因为它会极大地影响整体的运动body。一个非常常见的实现方式是作为一个 弹性势能 ,对于两点之间的某个 distance
给出一些 force
。像这样:
function elasticPotential(p1, p2) {
// Given two positions p1 and p2 we calculate a force between them
distance = sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2) + pow(p1.z - p2.z, 2));
force = force_given_distance(distance); // A popular choice here is for example a spring force
return force;
}
现在,您的框架中已经内置了上述功能,因此您不必再实现它。我之所以这样描述,是因为它对于理解我们如何创造可塑性至关重要。上面的问题是没有什么会保持变形---弹性势的本质是它有一些静止配置(很可能你的第一个配置),它总是会尝试回到那个形状。我们希望形状 记住 它是如何 mis-shaped 的。这就是可塑性。
简单可塑性
首先请注意,可塑性问题是一个很大的研究课题,在许多情况下远非微不足道。我的想法是:如果两个连接点之间的距离大于某个阈值,重新网格化当前配置中的点。也就是说,
for each pair(p1, p2):
if distance(p1, p2) > threshold:
recalculate_connection(p1, p2)
如您所见,这是一个非常简单的可塑性模型,很可能在物理上不正确。但是,我应该可以通过重新网格化以及您选择的弹性势能获得有趣的行为。
如果您提供更多详细信息,我也许可以进一步讨论这个问题,但现在我觉得这个答案已经比应该的要长了。
长话短说: 通过在变形期间重新划分 body 的网格来创建 "moldable" 形状。获得确切的所需物理行为可能很棘手,但应该可以创建看起来 "gelly-like".
的东西