使用opengl / c ++进行基于物理的断裂模拟

时间:2011-11-27 22:23:05

标签: c++ opengl

我正在尝试实施本文中用于建模骨折的想法: http://graphics.berkeley.edu/papers/Obrien-GMA-1999-08/index.html

我陷入困境(主要是第4页......)并且非常感谢任何帮助。我坚持的部分涉及四面体的变形(使用FEM)。

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

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

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

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

  • V:为每个节点中的(x,y,z)提供一些初始速度,因此为3x4 基质

  • delta:基本上是一个单位矩阵,{{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)得到弹力。这只是一个很大的总结。

然后我使用显式积分来更新真实世界坐标P.这个想法是速度更新涉及四面体节点上的力,因此会影响真实坐标位置,使对象变形。

然而,问题是力量非常小... x 10 ^ -19等等。因此,c ++通常会舍入到0.我已经完成了计算,无法找出原因。

我知道我在这里遗漏了什么,只是无法弄清楚是什么。什么更新我做得不对?

2 个答案:

答案 0 :(得分:1)

力小的常见原因是杨氏模量(λ)太小。如果使用的是米的比例,则宏观尺度对象可能具有10 ^ 5个年轻的modlus和.3到.4泊松比。

听起来可能发生的事情是你的tet仍处于其余配置状态。在没有变形的情况下,应变将为零,因此应力和力也将大约为零。您可以通过各种方式扰动顶点,并确保正确计算应变(epsilon)。一个简单的测试是关于质心的比例为2,这应该给你一个正应变。如果你按质量缩放0.5,就会产生负面应变。如果均匀地平移顶点,则不会发生应变变化(常见的FEM不变量)。如果你旋转它们你可能会得到一个改变,但是一个共同旋转的本构模型不会。

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

对于本文中的示例,您绝对不需要使用任意精度算术。实际上,浮点数通常足以用于这些类型的模拟。

答案 1 :(得分:0)

我可能会弄错,但是c ++加倍只能达到15位小数,(至少这是我的std :: numeric_limits所说的)。所以你的精确度已经不合时宜了。

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

相关问题