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