simulation - 果冻物理 3d

标签 simulation physics

我想问一下关于果冻物理学 (http://www.youtube.com/watch?v=I74rJFB_W1k),我在哪里可以找到一些好的地方开始制作这样的东西?我想模拟汽车碰撞,我想使用这种果冻物理学,但我找不到很多关于它们的信息。我不想使用现有的物理引擎,我想编写自己的 :)

最佳答案

类似于您在链接到的视频中看到的内容,可以使用质量 Spring 系统来完成。但是,当您改变质量和 Spring 的数量时,保持 Spring 常数不变,您会得到非常不同的结果。简而言之,质量 Spring 系统不是物质连续体的良好近似。

通常,这些类型的动画是使用所谓的 Finite Element Method 创建的。 (有限元)。 FEM 确实收敛到一个连续体,这很好。尽管它确实需要比质量 Spring 系统更多的专业知识,但它确实还不错。基本思想,来源于对continuum mechanics的研究,可以这样写:

  • 将对象的体积分成许多小块(元素),通常是 tetrahedra .让我们将这些元素的整个集合称为网格。您实际上需要制作此网格的两个副本。将一个标记为“休息”网格,另一个标记为“世界”网格。我接下来会告诉你为什么。
  • 对于世界网格中的每个四面体,测量它相对于对应的静止四面体的变形程度。其变形程度的量度称为“应变”。这通常通过首先测量所谓的变形梯度(通常表示为 F )来实现。有several good papers描述如何做到这一点。一旦您拥有 传真 ,定义应变 (e) 的一种非常典型的方法是:
    e = 1/2( F ^T * F ) - .这被称为格林应变。它对旋转是不变的,这使得它非常方便。
  • 使用您尝试模拟的 Material (明胶、橡胶、钢等)的属性,并使用您在上述步骤中测量的应变,推导出每个四面体的“stress”。
  • 对于每个四面体,访问每个节点(顶点、角、点(这些都意味着相同的事情))并平均共享该节点的三个三角形面的面积加权法向量(在其余形状中)。将四面体的应力乘以该平均向量,由于该四面体的应力,弹性力作用在该节点上。当然,每个节点都可能属于多个四面体,因此您需要能够总结这些力。
  • Integrate !有简单的方法可以做到这一点,也有困难的方法。无论哪种方式,您都需要遍历世界网格中的每个节点并将其力除以其质量来确定其加速度。从这里开始的简单方法是:
  • 将其加速度乘以某个小的时间值 dt。这使您可以改变速度 dv。
  • 将 dv 添加到节点的当前速度以获得新的总速度。
  • 将该速度乘以 dt 以获得位置变化 dx。
  • 将 dx 添加到节点的当前位置以获得新位置。

  • 这种方法被称为 explicit forward Euler integration .您将不得不使用非常小的 dt 值才能使其正常工作而不会爆炸,但它非常容易实现,因此可以很好地作为起点。
  • 根据需要重复步骤 2 到 5。

  • 我遗漏了很多细节和花哨的额外内容,但希望你能推断出我遗漏的很多东西。 Here is a link我第一次使用的一些说明。该网页包含一些有用的伪代码,以及一些相关 Material 的链接。

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

    以下链接也非常有用:

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

    这是一个非常有趣的话题,祝你好运!如果您遇到困难,请给我留言。

    关于simulation - 果冻物理 3d,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4613987/

    相关文章:

    javascript - Canvas 圆圈碰撞,如何计算出碰撞后圆圈应该移动到哪里?

    r - 如何对数据集进行分层采样,使用 Caret 进行统计分析并在 r 中重复?

    simulation - 是否可以使用 OpenMDAO 进行控制系统仿真?如果是这样,如何?

    java - n-body Simulation 预期性能 barnes hut

    algorithm - CUDA 粒子中的最近邻

    javascript - Spring 物理平衡总是向左移动

    r - R中索引矩阵的快速(er)方法

    c - 为什么我的生产者 - 消费者模式有意外的输出?

    c++ - 寻找 3D 速度 vector

    python - 如何在 Python 中将测量的发射线数据与高斯函数拟合? (原子光谱)