转载:  https://www.cnblogs.com/shushen/p/5311828.html

弹簧质点模型的求解方法包括显式欧拉积分和隐式欧拉积分等方法,其中显式欧拉积分求解快速,但积分步长小,两个可视帧之间需要多次积分,而隐式欧拉积分则需要求解线性方程组,但其稳定性好,能够取较大的积分步长。[Liu et al. 2007]文章提出了一种弹簧质点模型的求解方法,它将隐式欧拉积分方法转变为求解最优化问题,并采用迭代分步优化的方法来达到最优解。相比隐式欧拉积分,该方法计算快速,并且精度在可接受范围内。

  弹簧质点模型的隐式表达方式如下:

(1)

(2)

其中:qnvn分别代表tn时刻质点的位置和速度,f(qn)为tn时刻质点所受到的力,M为质点的质量,h为步长。

  利用式(1)我们可以得到:

(3)

(4)

  将式(3)减式(4)并与式(2)结合得到:

(5)

  记x = qn+1y = 2qnqn-1,式(5)可以变化为:

(6)

  式(6)的解其实对应于如下函数的临界点:

(7)

  于是弹簧质点模型问题可以变化为最优化问题minx g(x),即最小化函数g(x)。

  函数E(x)中最重要的部分是弹簧势能,根据Hooke定律,可以推导得到两个质点间弹簧的势能为:

(8)

其中:k为弹簧的弹性系数,r为弹簧的自然长度。

  因此弹簧质点模型中弹簧的整体势能也可以变化为最优化问题,即最小化如下函数:

(9)

其中:L = A·K·ATJ = A·K,式中A∈Rm×s(m为质点数量,s为弹簧数量),并且Ai1,i=1,Ai2,i= -1,K∈Rm×m为对角矩阵,Ki,i = ki

  如果考虑其他外力(如重力等),那么函数E(x)的表达式为:

(10)

其中:是所有弹簧为自然长度时的方向。

  将函数E(x)的表达式(10)代入式(7),整理后得到最终的优化表达式:

(11)

  对于上述优化问题,可以分两步进行,将前一时刻的质点位置作为初始值x,首先固定x优化d,然后固定d优化x,然后重复上述迭代步骤直到满足设定的迭代步数。

function [X, V] = spring_mass_fast(X0, V0, E, b, bc, R, h)
% This code implements algorithm of the following paper:
% "Fast Simulation of Mass-Spring Systems" m = size(X0,1); % vertex number
s = size(E,1); % spring number if ~exist('R', 'var')
R = normrow(X0(E(:,1),:) - X0(E(:,2),:));
end damping = 0.02;
drag = 1 - damping;
stiffness = 1e1;
K = stiffness*ones(s,1);
mass = 0.01;
M = diag(mass*ones(m,1));
g = [0 0 -9.8];
fext = repmat(mass*g, [m,1]); A = sparse(E,[1:s;1:s]',repmat([1,-1],s,1),m,s); L = A*diag(K)*A';
J = A*diag(K); X = X0;
iter = 0;
max_iter = 10;
while true
% step1: Fix X and find D
D = X(E(:,1),:) - X(E(:,2),:);
D = bsxfun(@times, D, R./normrow(D)); % step2: Fix D and find X
X = solve_equation(M + h^2*L, h^2*(fext + J*D) + M*(X0 + V0*h), b, bc); iter = iter + 1;
if iter == max_iter
break;
end
end
V = drag*(X - X0)/h;
end

相关:

弹簧质点系统(Euler Integration):http://www.cnblogs.com/shushen/p/5473264.html

弹簧质点系统(Verlet Integration):http://www.cnblogs.com/shushen/p/5394431.html

参考文献:

[1] Tiantian Liu, Adam W. Bargteil, James F. O'Brien, and Ladislav Kavan. 2013. Fast simulation of mass-spring systems. ACM Trans. Graph. 32, 6, Article 214 (November 2013), 7 pages.

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

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

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

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

    模拟物体变形最简单的方法就是采用弹簧质点系统(Spring-Mass System),由于模型简单并且实用,它已被广泛应用于服饰.毛发以及弹性固体的动态模拟.对于三角网格而言,弹簧质点系统将网格中的顶 ...

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

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

  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. python基础(30):黏包、socket的其他方法

    1. 黏包 1.1 黏包现象 让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd) 同时执行多条命令之后,得到的结果很可能只有一部分,在执行其他命令的时候又接 ...

  2. Python【day 13】内置函数02

    一.作用域相关-2个 1.locals() 参数是空 返回当前位置作用域的所有变量,返回的是字典 当前位置:函数内,返回局部变量 当前位置:函数外,返回全局变量 2.globals() 参数是空 返回 ...

  3. SpringCloud Gateway拦截器遇到的小坑汇总

    很多朋友在使用SpringCloudGateway的时候可能都碰到过以下几个问题 SpringCloudGateway中如何读取Post请求体 private BodyInserter getBody ...

  4. 挑战常规 -- 为什么不要再用cookie作为储存?

    不要使用cookie当存储 Cookie 是什么? Cookie 由浏览器储存在本地,每次访问目标网址会带上的请求头,服务器可以通过Set-Cookie响应头设置Cookie. Cookie的用途 由 ...

  5. UISlider增加触动区域

    - (CGRect)thumbRectForBounds:(CGRect)bounds trackRect:(CGRect)rect value:(float)value { rect.origin. ...

  6. 【原创】CentOS 7 安装解压版mysql5.7

    1.将mysql压缩包解压至 /usr/local 文件夹下,将其改名为mysql #解压 tar -zxf mysql-5.7.27-el7-x86_64.tar.gz -C /usr/local/ ...

  7. requests---requests发送json数据类型

    我们都知道post请求中的body有4种数据类型,今天我们来写一篇关于requests请求json这种数据类型. 数据类型 我们都知道post和get有个大的区别就是get没有body而post存在b ...

  8. itest(爱测试) 4.1.1 发布,开源BUG 跟踪管理 & 敏捷测试管理软件

    v4.1.1下载地址 :itest下载 itest 简介:查看简介 itest 开源敏捷测试管理,testOps 践行者.可按测试包分配测试用例执行,也可建测试迭代(含任务,测试包,BUG)来组织测试 ...

  9. 无序数组中用 快速排序的分治思想 寻找第k大元素

    #include <stdio.h> int *ga; int galen; void print_a(){ ; i < galen; i++){ printf("%d & ...

  10. centos7虚拟机端口命令

    cat /etc/redhat-release  #  查看centos 版本 Centos7端口常见命令 虚拟机新开了5005端口,系统内部是显示开了的,但是外部不能访问端口. 一些需要用到的命令: ...