模拟物体变形最简单的方法就是采用弹簧质点系统(Spring-Mass System),由于模型简单并且实用,它已被广泛应用于服饰、毛发以及弹性固体的动态模拟。对于三角网格而言,弹簧质点系统将网格中的顶点看作系统中的质点,而网格的边则是连接这些质点的弹簧。这样,弹簧质点系统模型就将物体简化成由弹簧和质点组成的系统,并利用弹簧质点的运动规律来描述物体的弹性变形过程。

  Verlet积分是求解牛顿运动方程的数值方法,原理简单描述如下:首先将系统t+dt时刻的位置x(t+dt)以及系统t-dt时刻的位置x(t-dt)用泰勒公式展开:

  上面两式相加后得到:

  进一步变化得到:

  因此通过上式可以根据系统前两时刻的状态求解系统的当前状态,这与”基于网格的波动方程模拟“一文中的求解过程有些类似。

  为了真实模拟物体变形效果,需要对弹簧质点系统进行受力分析:1. 每个质点有自身重力的影响;2. 每个质点受到与它相连的弹簧弹力影响,弹簧弹力遵守胡克定律;3. 质点运动时受到与其速度成正比的阻尼约束;4. 质点会受到其他外力的影响,由于施加的外力在每个三角面片上有一个法向分量,我们只需对每个质点周围三角片上的这些分量相加即可。

% constrains option
wind = false;
ball = true;
pins = false; figure('Position', [, , , ]);
fh = drawMesh(V,F,'facecolor','y','edgecolor','none');
if ball
center = [ -];
radius = ;
drawSphere([center radius], 'facecolor','r', 'nPhi',, 'nTheta',);
end
if pins
plot3([-;], [;], [;], 'k-', 'linewidth',);
end
view([- ])
axis equal
axis off
axis([- - - ]);
camlight
lighting gouraud set(gca, 'position', [ ]); % initial condition
x_pre = V;
x_cur = V; % rest length
E = edges(F);
l0 = vectorNorm3d(V(E(:,),:) - V(E(:,),:)); nV = size(V,);
draw_t = ;
tic;
while true
% spring force
Fs = stiffness * (vectorNorm3d(x_cur(E(:,),:) - x_cur(E(:,),:)) - l0);
dir = normalizeVector3d(x_cur(E(:,),:) - x_cur(E(:,),:)); M1 = sparse(E, E, [Fs.*dir(:,);-Fs.*dir(:,)]);
M2 = sparse(E, E, [Fs.*dir(:,);-Fs.*dir(:,)]);
M3 = sparse(E, E, [Fs.*dir(:,);-Fs.*dir(:,)]);
as = [diag(M1), diag(M2), diag(M3)] ./ m; % wind force
aw = zeros(nV,);
if wind
N = normalizeVector3d(normals(x_cur,F));
Fw = N * wind_force(i/)' .* wind_strength; M1 = sparse(F, F, repmat(Fw.*N(:,),,));
M2 = sparse(F, F, repmat(Fw.*N(:,),,));
M3 = sparse(F, F, repmat(Fw.*N(:,),,));
aw = [diag(M1), diag(M2), diag(M3)] ./ m;
end % verlet integration with a simple damping model
x_new = drag*(x_cur - x_pre) + x_cur + bsxfun(@plus, as+aw, g)*dt*dt; x_pre = x_cur;
x_cur = x_new; % ball constrains
if ball
diff = bsxfun(@minus, x_cur, center);
index = vectorNorm3d(diff) < radius+;
x_cur(index,:) = bsxfun(@plus, center, bsxfun(@times, normalizeVector3d(diff(index,:)), radius+));
end % pin constrains
if pins
x_pre(pin_idx,:) = V(pin_idx,:);
x_cur(pin_idx,:) = V(pin_idx,:);
end % updata figure
if toc > 0.033
set(fh, 'Vertices', x_cur);
drawnow;
tic;
end
end

本文为原创,转载请注明出处:http://www.cnblogs.com/shushen

网格弹簧质点系统模拟(Spring-Mass System by Verlet Integration)附源码的更多相关文章

  1. 网格弹簧质点系统模拟(Spring-Mass System by Euler Integration)

    弹簧质点模型是利用牛顿运动定律来模拟物体变形的方法.如下图所示,该模型是一个由m×n个虚拟质点组成的网格,质点之间用无质量的.自然长度不为零的弹簧连接.其连接关系有以下三种: 1.连接质点[i, j] ...

  2. 网格弹簧质点系统模拟(Spring-Mass System by Fast Method)附源码

    弹簧质点模型的求解方法包括显式欧拉积分和隐式欧拉积分等方法,其中显式欧拉积分求解快速,但积分步长小,两个可视帧之间需要多次积分,而隐式欧拉积分则需要求解线性方程组,但其稳定性好,能够取较大的积分步长. ...

  3. 网格弹簧质点系统模拟(Spring-Mass System by Fast Method)附源码(转载)

    转载:  https://www.cnblogs.com/shushen/p/5311828.html 弹簧质点模型的求解方法包括显式欧拉积分和隐式欧拉积分等方法,其中显式欧拉积分求解快速,但积分步长 ...

  4. Spring AOP实现方式三【附源码】

    注解AOP实现 源码结构: 1.首先我们新建一个接口,love 谈恋爱接口. package com.spring.aop; /** * 谈恋爱接口 * * @author Administrator ...

  5. Spring AOP实现方式二【附源码】

    自动代理模式[和我们说的方式一 配置 和 测试调用不一样哦~~~]  纯POJO切面 源码结构: 1.首先我们新建一个接口,love 谈恋爱接口. package com.spring.aop; /* ...

  6. Spring AOP实现方式一【附源码】

    基本代理模式  纯POJO切面 源码结构: 1.首先我们新建一个接口,love 谈恋爱接口. package com.spring.aop; /** * 谈恋爱接口 * * @author Admin ...

  7. 快速开发架构Spring Boot 从入门到精通 附源码

    导读 篇幅较长,干货十足,阅读需花费点时间.珍惜原创,转载请注明出处,谢谢! Spring Boot基础 Spring Boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计 ...

  8. Java Web开发框架Spring+Hibernate整合效果介绍(附源码)

    最近花了一些时间整合了一个SpringMVC+springAOP+spring security+Hibernate的一套框架,之前只专注于.NET的软件架构设计,并没有接触过Java EE,好在有经 ...

  9. Java Web开发框架Spring+Hibernate整合效果介绍(附源码)(已过期,有更好的)

    最近花了一些时间整合了一个SpringMVC+springAOP+spring security+Hibernate的一套框架,之前只专注于.NET的软件架构设计,并没有接触过Java EE,好在有经 ...

随机推荐

  1. 百度地图API使用方法详解

    最近做了个项目,其中项目中有个需求需要用到百度地图进行导航,通过查阅相关资料参考百度地图api完成了一个例子. API地址:http://developer.baidu.com/map/jsdemo. ...

  2. 总结CSS3新特性(颜色篇)

    颜色: CSS3新增加了hsl(), hsla(), rgb(),rgba()四个函数来创建color值; hsl(): hsl函数:h(色调),s(饱和度),l(亮度); 色调:为0-360之间的数 ...

  3. 判断scrollview是否滚动到了底部

    调用函数判断如下:if(getScrollY() + getHeight() >=  computeVerticalScrollRange()){        Log.d(TAG," ...

  4. Activity源码简要分析总结

    Activity源码简要分析总结 摘自参考书籍,只列一下结论: 1. Activity的顶层View是DecorView,而我们在onCreate()方法中通过setContentView()设置的V ...

  5. 一文让你彻底了解iOS字体相关知识

    写本文的契机主要是把自己整理的关于iOS字体方面的知识不断更新写在这篇博文中,用来自己以后查阅. 一.iOS原生字体展示 在label中选择字体的font,并把font由system改成custom后 ...

  6. 关于iOS和OS X废弃的API知识点

    今天在查看苹果接口文档时,突然对于接口的声明知识点比较感兴趣,再网络找到下面这个比较不错的文章,记录一下并分享: 如你所知,已废弃(Deprecated)的API指的是那些已经过时的并且在将来某个时间 ...

  7. 开启Apache mod_rewrite模块完全解答

    启用mod_rewrite模块 在conf目录的httpd.conf文件中找到 LoadModule rewrite_module modules/mod_rewrite.so 将这一行前面的#去掉. ...

  8. Real-Time Rendering读书辩疑琐记

    At Page 707,5th paragrah.it write:If a normal vector is stored as three 32-bit floats,it has enough ...

  9. MvcPager 概述 MvcPager 分页示例 — 标准Ajax分页 对SEO进行优化的ajax分页 (支持asp.net mvc)

    该示例演示如何使用MvcPager最基本的Ajax分页模式. 使用AjaxHelper的Pager扩展方法来实现Ajax分页,使用Ajax分页模式时,必须至少指定MvcAjaxOptions的Upda ...

  10. jQuery设置disabled属性

    先比较下readOnly和disabled: readOnly 只针对input(text/ password)和textarea有效: disabled 对于所有的表单元素都有效,包括select, ...