基于opengl/c++的物理裂缝模拟

Physically-based fracture simulation with opengl/c++

本文关键字:裂缝 模拟 opengl c++ 基于      更新时间:2023-10-16

我正在尝试实现本文的骨折建模思路:http://graphics.berkeley.edu/papers/obrien - gma - 1999 08/index.html

我被困在一个点(基本上是第4页…),并将非常感谢任何帮助。我卡住的部分涉及四面体的变形(使用FEM)。

我有一个由四个节点定义的单一四面体(每个节点都有x, y, z位置),我在其中计算以下矩阵:

  • u:每一列是一个包含材料坐标(x, y, z,1)对于每个节点(总共4列),一个4x4矩阵

  • B:逆(u),他称之为基矩阵,一个4x4矩阵

  • p:每一列都是一个包含真实世界坐标(x, y,z)对于每个节点,我设P最初等于u,因为对象是静止状态下不变形,3x4矩阵

  • V:给出每个节点(x, y, z)的初始速度,所以是3x4矩阵

  • δ:基本上是一个单位矩阵,{{1, 0, 0}, {0, 1, 0}, {0, 0, 1}, {0, 0, 0}}

我得到x(u) = P*B*uv(u) = V*B*u,但不确定在哪里使用这些…

还有dx = P*B*deltadv = V*B*delta

然后通过格林应变张量epsilon = 1/2(dx+transpose(dx)) - Identity_3x3 得到应变

然后是应力sigma = lambda*trace(epsilon)*Identity_3x3 + 2*mu*epsilon

我通过论文第4页的式(24)得到弹性力。这只是一个大的求和。

I然后使用显式积分来更新现实世界的坐标p。其思想是,速度更新涉及到四面体节点上的力,因此影响现实世界的坐标位置,使物体变形。

然而,问题是这个力非常小……x 10的-19次方,等等。因此,c++通常舍入为0。我已经算过了,但还是不知道为什么。

我知道我遗漏了什么,只是不知道是什么。我做错了什么更新?

力小的常见原因是你的杨氏模量(lambda)太小。如果你使用米的尺度,一个宏观尺度的物体可能有10^5的杨氏模量和0.3到0.4的泊松比。

听起来可能发生的事情是您的tet仍然处于rest配置。在没有变形的情况下,应变将为零,因此反过来应力和力也将大约为零。你可以用不同的方法扰动顶点,并确保你的应变(epsilon)得到正确的计算。一个简单的测试是将质心的大小乘以2,得到一个正的应变。如果你在质心周围缩放0.5就会得到负应变。如果你均匀地平移顶点,你将不会得到应变的变化(一个常见的FEM不变量)。如果你旋转它们,你可能会得到一个变化,但共旋本构模型不会。

注意,你可能会认为重力会导致变形,但除非其中一个顶点受到约束,否则所有顶点上的均匀力将导致均匀的平移,这不会改变应变为零。

对于论文中的例子,你绝对不需要使用任意精度的算法。实际上,对于这些类型的模拟,浮点数通常已经足够了。

我可能搞错了,但是c++的双精度值只能到小数点后15位(至少我的std::numeric_limits是这么说的)。所以你的精确度太低了。

因此,您可能最终需要一个库来实现任意精度的算术,例如http://gmplib.org/