基本实现蒙皮模拟

今天把蒙皮模拟算法实现了。

具体方法是加载此前算出的权重矩阵,每个内部点都是表面点的加权平均。
于是求解的时候唯一的未知数就是参数p了。

这次牛顿法能够模拟,但是同之前不带权重的模拟算法一样,模拟过程中无法收敛到全局极值点。
出问题的是这根棒。
rod.gif
控制这根棒的参数有两个,一个是弯曲大小,另一个是弯曲方向。
当强制令弯曲方向不起作用是,能够正常模拟,结果如上图。
当让弯曲方向参数起作用时,结果如下,模型不弯曲。 
rodStatic.gif
检查原因,发现牛顿法模拟的过程中,首步的梯度、Hessian、以及求出的参数增量如下:

梯度Hessian参数增量
有方向参数
G=[21319.284966 ;0.000000 ;];
H=[
1734695.368102 7.202621 ;
7.202621 0.000000 ;
];
x=1.0e+03 *
[0 2.9599]

没有方向参数G=[21319.284966 ;0.000000 ;];
H=[
1734695.368102 0.000000 ;
0.000000 0.000000 ;
];
x=[0.0123 0]

准备在应用牛顿法前使用其他方法,例如沿梯度下降。
加了一个很简单的梯度下降算法
  1. for (int ithIter = 0; ithIter < 5; ++ithIter)
  2. {
  3. double f;
  4. isSucceed &= m_fem->computeValueAndGrad(p, tVec, &f, &G);
  5. p -= G * 1e-6;
  6. if(G.norm() < m_minGradSize)
  7. break;
  8. }
然后模拟成功了,如图……
rodGrad.gif





 

posted @ 2015-02-04 17:59  dydx  阅读(285)  评论(0编辑  收藏  举报