正如我在评论中提到的,我不熟悉移相器,也不熟悉如何在 Javascript 框架中实际实现它。我在这里的目标可能是给你一些关于不同方法的想法,所以希望你会发现这个答案很有用。
我将尝试回答这个问题:
我想知道如何制作这些类型的身体。...我只能让身体成为一种刚性方形,而不是像我希望的那样可塑和圆形。
鉴于这句话,不一定清楚你想要什么。正如我在评论中指出的那样,我认为你正在寻找的是可塑性,我将描述一种你可以用一些简单的工具“作弊”的方法。
此刻你用“这个身体并不完全是刚性的,当它碰撞和被拖动时有那种弹性的感觉”来描述你身体的运动。目前您的模型是这样工作的:
- 一个点连接到网格中给定的所有其他点。
- 每个时间步,计算每对之间的力。关节(或点)上的总力是所有这些成对力的总和。
- 每个关节都与身体的一部分相关联(即它有一些质量
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:
通过在变形过程中重新划分你的身体来创建一个“可塑”的形状。获得确切的期望物理行为可能很棘手,但应该可以创建看起来“凝胶状”的东西。