码迷,mamicode.com
首页 > 其他好文 > 详细

基本实现蒙皮模拟

时间:2015-02-04 20:09:53      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:

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

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

这次牛顿法能够模拟,但是同之前不带权重的模拟算法一样,模拟过程中无法收敛到全局极值点。
出问题的是这根棒。
技术分享
控制这根棒的参数有两个,一个是弯曲大小,另一个是弯曲方向。
当强制令弯曲方向不起作用是,能够正常模拟,结果如上图。
当让弯曲方向参数起作用时,结果如下,模型不弯曲。 
技术分享
检查原因,发现牛顿法模拟的过程中,首步的梯度、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. }
然后模拟成功了,如图……
技术分享





 

基本实现蒙皮模拟

标签:

原文地址:http://www.cnblogs.com/dydx/p/4272999.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!