我正在使用 Matter.js 物理来尝试创建柔体。我能够创建这样的主体:
不过我不确定这是否是我想要的“软体”。的确,这个 body 并不是完全刚性的,并且在碰撞和被拖拽时有弹性的感觉。我一直在寻找一种与凝胶有相似之处的 body 。这张图片可能在视觉上有助于解释这个概念:
我想知道如何制造这些类型的物体。它是否与 as matter.js 软体相同但具有非常特殊的属性类型?我只能让 body 变成刚性方形,而不是像我希望的那样可塑和圆形。
我还对通过游戏中的交互来操纵物理体感兴趣,这会增加或减小物理体的大小,这让我再次得出结论,我想要的 body 类型必须是完全可塑的。
matter.js 可以处理这个问题还是我必须更改物理引擎?有解决这个问题的方法吗?
注意:我将 Phaser.js 用于某些游戏内组件,但将 matter.js 物理用于物理操作,因为我相信 Phaser 集成物理无法模拟这种类型的复杂物体。
谢谢
编辑:与此非常相似 Box2d :roll soft body ball .我猜我只需要用一个 js 引擎来做到这一点。有吗?
最佳答案
正如我在评论中提到的,我不熟悉 Phaser 或您如何在 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.
这句话不一定清楚你想要什么。正如我在评论中指出的那样,我认为您正在寻找的是可塑性,我将描述一种您可以使用一些简单的工具来“作弊”的方法。
此刻,您用“的确,这个 body 并不是完全僵硬的,并且在碰撞和被拖拽时有弹性的感觉。”。目前你的模型是这样工作的:
- 一个点连接到网格中给定的所有其他点。
- 每个时间步,计算每对之间的力。关节(或点)上的总力是所有这些成对力的总和。
- 每个关节都与 body 的一部分相关联(即它有一定的质量
m
),你可以用acceleration = force/m
计算它的加速度。从那里开始,我们计算速度
,最后计算位置
。
上述步骤中最有趣的部分是nr 2,因为它会极大地影响整个 body 的运动。一种非常常见的实现方式是作为弹性势,对于两点之间的特定距离
,会产生一些力
。像这样:
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;
}
现在,您的框架中已经内置了上述功能,因此您不必再实现它。我之所以这样描述,是因为它对于理解我们如何创造可塑性至关重要。上面的问题是没有什么会保持变形---弹性势的本质是它有一些静止配置(很可能是你的第一个配置)并且它将始终尝试恢复到该形状。我们希望形状记住它是如何变形的。这就是可塑性。
简单的可塑性
首先请注意,可塑性问题是一个很大的研究课题,在许多情况下远非微不足道。我的想法如下:如果两个连接点之间的距离大于某个阈值,重新网格化当前配置中的点。也就是说,
for each pair(p1, p2):
if distance(p1, p2) > threshold:
recalculate_connection(p1, p2)
如您所见,这是一个非常简单的可塑性模型,很可能在物理上是不正确的。但是,我应该可以通过重新网格化以及您选择的弹性势能获得有趣的行为。
如果您向我提供更多详细信息,我也许可以进一步讨论这个问题,但现在我觉得这个答案已经比应该的要长了。
长话短说: 通过在变形过程中重新网格化您的 body 来创建“可塑”形状。获得确切的所需物理行为可能很棘手,但应该可以创造出看起来“凝胶状”的东西。
关于javascript - 二维软体 : Gelly and moldable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40074482/