果冻物理学 3D

5

我想咨询一下果冻物理(http://www.youtube.com/watch?v=I74rJFB_W1k ),我该在哪里找到一个好的起点来制作类似的东西?我想模拟汽车碰撞,并使用这种果冻物理,但我找不到太多相关信息。我不想使用现有的物理引擎,我想编写自己的。

5个回答

6

您在链接视频中看到的东西可以用质点弹簧系统实现。但是,如果您改变质点和弹簧的数量,同时保持弹簧常数不变,结果会大相径庭。简而言之,质点弹簧系统不能很好地近似物质的连续体。

通常,这些类型的动画使用所谓的有限元法(FEM)创建。 FEM 确实收敛于连续体,这很好。虽然它需要比质点弹簧系统更多的专业知识,但实际上并不太难。从连续介质力学的研究中得出的基本思想可以这样表达:

  1. 将对象的体积分成许多小块(元素),通常使用tetrahedra。我们称这些元素的整个集合为网格。您实际上需要制作两个此网格的副本。一个标记为“rest”网格,另一个标记为“world”网格。我会告诉你下一步的原因。

  2. 对于世界网格中的每个四面体,测量其相对于其相应的rest四面体的变形程度。它的变形程度的度量被称为“应变”。这通常是通过首先测量所谓的变形梯度(通常表示为F)来完成的。有几篇 好的 论文 描述了如何做到这一点。一旦您有了F,定义应变(e)的一种非常典型的方法是: e= 1/2(F^T * F) - I。这被称为Green应变。它对旋转不变,这使得它非常方便。

  3. 使用您尝试模拟的材料的属性(明胶、橡胶、钢等),并使用您在上一步中测量的应变,导出每个四面体的“应力”。

  4. 对于每个四面体,访问共享该节点的三个三角形面的面积加权法线向量(在rest状态下)。将四面体的应力乘以该平均向量,即为由于该四面体的应力而作用于该节点的弹性力。当然,每个节点可能属于多个四面体,因此您需要能够总结这些力。

  5. 整合!有易于实现和困难的方法。无论哪种方式,您都需要循环遍历世界网格中的每个节点,并将其力除以其质量以确定其加速度。从这里开始,简单的方法是:

    • 将其加速度乘以一些小时间值dt。这给你一个速度变化dv
    • dv添加到节点的当前速度中以获得新的总速度。
    • 将该速度乘以dt以获得位置变化dx
    • dx添加到节点的当前位置中以获得新位置。

    此方法称为显式向前欧拉积分。您将不得不使用非常小的dt值才能使其正常工作,但它非常容易实现,因此作为起点效果很好。

  6. 重复步骤2到5,直到您想要结束。

我省略了很多细节和花哨的额外内容,但希望你能推断出我所省略的大部分。这里是一个链接,指向我第一次尝试这个操作时使用的一些说明。该网页包含一些有用的伪代码,以及一些相关材料的链接。

http://sealab.cs.utah.edu/Courses/CS6967-F08/Project-2/

以下链接也非常有用:

http://sealab.cs.utah.edu/Courses/CS6967-F08/FE-notes.pdf

这是一个非常有趣的话题,我祝你好运!如果你遇到困难,只需在评论中留言。


+1 非常清晰!你在四面体应变方面使用什么指标?是对角线之间的距离吗? - Rob Agar
好问题!很抱歉我漏掉了那个。我已经编辑了我的答案(特别是第二步)并添加了更多信息。简短的回答是,你需要一些关于应变的三维测量,但距离是一维的,所以这样做行不通。 - Stephen

2
那个滚动的果冻方块视频是使用Blender制作的,它使用了Bullet物理引擎来进行软体模拟。Bullet的文档普遍很少,而对于软体动力学几乎没有任何说明。你最好的选择是阅读源代码。

然后编写自己的版本;)


1

这里有一些非常好的教程页面。你可能正在寻找的是(反向)运动学质量&弹簧模型部分。

提示:果冻可以被看作是一个三维布料;-)

此外,尝试查看弹簧压力软体模型的搜索结果 - 它们可能会让你朝着正确的方向前进:-)


1

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接