基于opengl/c++的物理裂缝模拟
Physically-based fracture simulation with opengl/c++
我正在尝试实现本文的骨折建模思路: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*u
和v(u) = V*B*u
,但不确定在哪里使用这些…
还有dx = P*B*delta
和dv = 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/
- 如何使用Google Mock来模拟gettimeofday()
- G锁定铸造到基础上会释放模拟行为
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 落砂模拟碰撞检测C++和SFML
- 在gtest.中使用fff.h模拟系统API
- 谷歌模拟和覆盖关键字
- 用C#中的并集模拟C++嵌套结构
- 在同一模拟中使用静脉和静脉_ inet内容时出现运行时错误
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 我写了一个C++程序来模拟Enigma机器.我没有得到输出
- 如何模拟不同边数的骰子滚动?
- 模拟持久按键
- 使用SIR模型的疾病爆发模拟
- 在 c++ 中模拟输入并在 JAVA 中读取它?
- 转发变量参数列表以模拟 std::thread
- 如何在谷歌模拟中匹配 C 样式数组
- 如何使用兰德随机化模拟点击
- 模拟GPS数据,以便使用Qt与Traccar一起使用
- QKeyPress - 在Qt中模拟按键
- 基于opengl/c++的物理裂缝模拟