弹簧质点模型的求解方法包括显式欧拉积分和隐式欧拉积分等方法,其中显式欧拉积分求解快速,但积分步长小,两个可视帧之间需要多次积分,而隐式欧拉积分则需要求解线性方程组,但其稳定性好,能够取较大的积分步长。[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,); % vertex number
s = size(E,); % spring number if ~exist('R', 'var')
R = normrow(X0(E(:,),:) - X0(E(:,),:));
end damping = 0.02;
drag = - damping;
stiffness = 1e1;
K = stiffness*ones(s,);
mass = 0.01;
M = diag(mass*ones(m,));
g = [ -9.8];
fext = repmat(mass*g, [m,]); A = sparse(E,[:s;:s]',repmat([1,-1],s,1),m,s); L = A*diag(K)*A';
J = A*diag(K); X = X0;
iter = ;
max_iter = ;
while true
% step1: Fix X and find D
D = X(E(:,),:) - X(E(:,),:);
D = bsxfun(@times, D, R./normrow(D)); % step2: Fix D and find X
X = solve_equation(M + h^*L, h^*(fext + J*D) + M*(X0 + V0*h), b, bc); iter = iter + ;
if iter == max_iter
break;
end
end
V = drag*(X - X0)/h;
end

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

相关:

弹簧质点系统(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)附源码(转载)

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

  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. C#的变迁史 - C# 4.0 之线程安全集合篇

    作为多线程和并行计算不得不考虑的问题就是临界资源的访问问题,解决临界资源的访问通常是加锁或者是使用信号量,这个大家应该很熟悉了. 而集合作为一种重要的临界资源,通用性更广,为了让大家更安全的使用它们, ...

  2. 获取form对象

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. 判别或预测方法汇总(判别分析、神经网络、支持向量机SVM等)

    %% [Input]:s_train(输入样本数据,行数为样本数,列为维数):s_group(训练样本类别):s_sample(待判别数据)%% [Output]:Cla(预测类别) function ...

  4. DecoratorPattern(装饰器模式)

    /** * 装饰者模式 * @author TMAC-J * 总的来说,装饰者模式就是继承的应用 */ public class DecoratorPattern { interface Beans{ ...

  5. php中用foreach改变数组的值的问题

    翻到PHP文档的foreach那页这样写道: “foreach 语法结构提供了遍历数组的简单方式.foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误 ...

  6. XSS跨站测试代码大全

    '><script>alert(document.cookie)</script>='><script>alert(document.cookie)&l ...

  7. 用Kotlin开发Android应用(IV):定制视图和Android扩展

    原文标题:Kotlin for Android (IV): Custom Views and Android Extensions 原文链接:http://antonioleiva.com/kotli ...

  8. JAVA模板方法设计模式(从现实生活角度理解代码原理)

    概述: 定义一个功能的框架(骨架),一部分功能是确定的,一部分功能是不确定的,先把确定的部分实现,把不确定的部分延迟到子类中实现. 实现该模式的关键步骤: 第一步:抽象类,实现模板方法,定义功能(确定 ...

  9. ObjectAnimator.start()工作原理

    分析下面一段代码的逻辑 objectAnimator.start(); 他会调用父类的start(),即ValueAnimator,我们分析valueAnimator.start()即可 ValueA ...

  10. Wireshark设置interface 时提示“There are no interfaces on which a capture can be done ”

    Wireshark设置interface 时提示“There are no interfaces on which a capture can be done ” 解决方法: 今天在电脑上安装了WIR ...