网格弹簧质点系统模拟(Spring-Mass System by Euler Integration)
弹簧质点模型是利用牛顿运动定律来模拟物体变形的方法。如下图所示,该模型是一个由m×n个虚拟质点组成的网格,质点之间用无质量的、自然长度不为零的弹簧连接。其连接关系有以下三种:
1.连接质点[i, j]与[i+1,j],[i, j]与[i,j+1]的弹簧,称为“结构弹簧”;
2.连接质点[i, j]与[i+1,j+1],[i+1,j]与[i,j+1]的弹簧,称为“剪切弹簧”;
3.连接质点[i, j]与[i+2,j],[i, j]与[i, j+2]的弹簧,称为“弯曲弹簧”。
这三种弹簧分别用于与结构力(拉力或压力)、剪力和弯矩相关的计算。

弹簧质点运动时受到内力和外力和影响,内力包括弹簧的弹性力和阻尼力,外力包括重力以及空气阻力等。
弹簧的弹性力遵从Hooke定律,质点i和质点j之间的弹性力可以表示为:


其中:
,
,ks表示弹性系数,xi表示质点i的位置,l0表示弹簧的自然长度。
弹簧的阻尼力与质点相对速度在弹簧方向上的分量成正比,可以表示为:


其中:vij = vj – vi,kd表示阻尼系数,vi表示质点i的速度。
牛顿运动定律
是弹簧质点模型的关键,将该二阶微分方程改写成两个一阶微分方程:
(1)
利用显式欧拉积分求解上述微分方程可以得到:
(2)
整个过程的伪代码如下:

显式欧拉积分表示简单,求解快速,但其对积分步长有限制,一旦超过某个临界值T0时,积分结果就会发散。而临界值T0主要与弹簧的弹性系数有关,弹簧的弹性系数越大,临界值T0就越小,对应的步长也越小,这就意味着两个可视帧之间需要更多次的迭代才能使结果稳定。
一种提高积分精度的方法是采用四阶Runge-Kutta积分,其精度能达到O(h4):

整个过程的伪代码如下:

隐式欧拉积分比显式欧拉积分具有更高的稳定性,弹簧质点模型的隐式欧拉积分表达式如下:
(3)
将ft+h一阶泰勒展开
,代入式(3)第一个微分方程得到:

整理得:

两边乘以M:

上式中M是以3×3对角矩阵为子矩阵的对角矩阵,两个Jacobian矩阵
和
都是子矩阵为3×3的对称稀疏矩阵,只有当质点i和质点j之间有弹簧连接时对应的子矩阵才非零(对角线也非零)。隐式欧拉积分需要求解线性方程组来得到下一时刻状态,但是稳定性好,能够取较大的步长进行计算。



参考文献:
[1] David Baraff and Andrew Witkin. 1998. Large steps in cloth simulation. In Proceedings of the 25th annual conference on Computer graphics and interactive techniques (SIGGRAPH '98). ACM, New York, NY, USA, 43-54.
[2] Matthias Müller, Jos Stam, Doug James, and Nils Thürey. 2008. Real time physics: class notes. In ACM SIGGRAPH 2008 classes (SIGGRAPH '08). ACM, New York, NY, USA, , Article 88 , 90 pages.
附录
标量函数对向量的导数:
,其中:x∈Rn。
向量函数对向量的导数(雅克比矩阵):
,其中:f: Rn→Rm,x∈Rn。
向量模对向量的导数:
,其中:
。
单位向量对向量的导数:

利用上述公式可以推导出隐式欧拉积分中Jacobian矩阵中子矩阵的表达式:




参考:
http://blog.mmacklin.com/2012/05/04/implicitsprings
本文为原创,转载请注明出处:http://www.cnblogs.com/shushen。
网格弹簧质点系统模拟(Spring-Mass System by Euler Integration)的更多相关文章
- 网格弹簧质点系统模拟(Spring-Mass System by Verlet Integration)附源码
模拟物体变形最简单的方法就是采用弹簧质点系统(Spring-Mass System),由于模型简单并且实用,它已被广泛应用于服饰.毛发以及弹性固体的动态模拟.对于三角网格而言,弹簧质点系统将网格中的顶 ...
- 网格弹簧质点系统模拟(Spring-Mass System by Fast Method)附源码
弹簧质点模型的求解方法包括显式欧拉积分和隐式欧拉积分等方法,其中显式欧拉积分求解快速,但积分步长小,两个可视帧之间需要多次积分,而隐式欧拉积分则需要求解线性方程组,但其稳定性好,能够取较大的积分步长. ...
- 网格弹簧质点系统模拟(Spring-Mass System by Fast Method)附源码(转载)
转载: https://www.cnblogs.com/shushen/p/5311828.html 弹簧质点模型的求解方法包括显式欧拉积分和隐式欧拉积分等方法,其中显式欧拉积分求解快速,但积分步长 ...
- Unity下实现弹簧骨骼(Spring Bone)
关于这个效果的名称,我一直没找到一个比较正式的说法.Spring Bone这个说法是来自于Anima2D这个插件中的一个演示用的脚本,我直接译成弹簧骨骼. 一般常见于对人物的头发的模拟上. 当然也可以 ...
- Spring之Enterprise JavaBeans (EJB) integration
原文地址:需要FQ https://translate.google.com/translate?hl=zh-CN&sl=zh-CN&tl=zh-CN&u=http%3A%2F ...
- spring boot application.properties 属性详解
2019年3月21日17:09:59 英文原版: https://docs.spring.io/spring-boot/docs/current/reference/html/common-appli ...
- Spring Boot属性文件配置文档(全部)
This sample file is meant as a guide only. Do not copy/paste the entire content into your applicatio ...
- Spring Boot SSL
转载 https://howtodoinjava.com/spring-boot/spring-boot-ssl-https-example/ Spring Boot SSL 学习如何将Web应用程 ...
- Fluent动网格【13】:网格光顺总结及实例
光顺(Smoothing)方法是最基本的网格节点更新方法.Fluent提供了三种光顺方法: Spring弹簧光顺 Diffusion扩散光顺 Linearly Elastic Solid光顺 三种方法 ...
随机推荐
- Pexels Videos – 可以免费商业使用的短视频
Pexels 是一个巨大的平台,提供免费的精美照片,很多设计师和博客每天用它来寻找他们的个人和商业项目的照片.现在我们想介绍 Pexels 视频,他是用来帮助你找到免费的视频.所有的 Pexels 视 ...
- word开发遇到的问题
1.系统不能安装多个office word版本,建议只安装一个2003版本,越完整越好. 2.安装时候ghost系统会遇到问题,由于很多组件没有完整的安装,因此缺少了很多安装时文件保护要进行提醒的dl ...
- Python学习02 列表 List
Python学习02 列表 List Python列表 List Python中的列表(List)用逗号分隔,方括号包围(comma-separated values (items) between ...
- 线程安全、数据同步之 synchronized 与 Lock
本文Demo下载传送门 写在前面 本篇文章讲的东西都是Android开源网络框架NoHttp的核心点,当然线程.多线程.数据安全这是Java中就有的,为了运行快我们用一个Java项目来讲解. 为什么要 ...
- 工作中碰到的js问题(disabled表单元素不能提交到服务器)
今天碰到一个奇葩的问题,asp页面表单提交后,有一个文本框<input type="text" name="phone" id="phone&q ...
- MVC的优点及不足之处
1. MVC的优点 (1) 可以为一个模型在运行时同时建立和使用多个视图.变化-传播机制可以确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步. (2) 视图与控制器的可 ...
- iOS中的事件传递和响应者链条
本文转自:http://www.linuxidc.com/Linux/2015-08/121270.htm 首先我们来看看ios中事件的产生和传递过程 1.发生触摸事件后,系统会将事件加入到一个由UI ...
- windows svn 上传后 自动部署 到web目录下
第一步 把web目录设置为工作目录 "D:\Program Files (x86)\VisualSVN Server\bin\svn.exe" upgrade "D:\y ...
- (转) 一步一步学习ASP.NET 5 (一)- 基本概念和环境配置
转发:微软MVP 卢建晖 的文章,希望对大家有帮助. 编者语:时代在变,在csdn开博一年就发了那么的两篇文章,无论是什么原因都觉得有愧了.但是今年重心都会在这里发表一些文章,和大家谈谈.NET, 移 ...
- 随便选择两个城市作为预选旅游目标。实现两个独立的线程分别显示10次城市名,每次显示后休眠一段随机时间(1000ms以内),哪个先显示完毕,就决定去哪个城市。分别用Runnable接口和Thread类实现。
public class Testlvyou extends Thread{ @Override public void run() { test(); } private void test() { ...