OpenGL进阶(十五) - 弹簧质点系统(Mass Spring Systems)

发布时间:2020-07-16 18:11:20 作者:拳四郎
来源:网络 阅读:1299

简介

OpenGL进阶(十五) - 弹簧质点系统(Mass Spring Systems)

      一个模拟变形物体最简单额方法就是将其表示为弹簧质点系统(Mass Spring Systems),因为方法简单,这个框架对于学习物理模拟和时间积分的各种技术都比较理想。一个弹簧质点包含了一系列由多个弹簧连接起来的质点,这样的系统的物理属性非常直接,模拟程序也很容易编写。

      但是简单是有代价了:

1.物体的行为依赖于弹簧系统的设置方法;

2.很难通过调整弹簧系数来得到想要的结果;

3.弹簧质点网格不能直接获取体效果。

      在很多的应用中这些缺点可以忽略,在这种场合下,弹簧质点网格是最好的选择,因为够快够简单。

      今天首先说明一下Mass Spring Systems的理论基础,然后来实现绳子的real-time模拟。


物理模型

      假设有N个质点,质量为mi,位置为xi,速度为vi , 1<i<N.

      这些质点由一组弹簧S连接,弹簧参数为(i,  j, lo, ks, kd). i,j 为连接的弹簧质点,lo为弹簧完全放松时的长度,ks为弹簧弹性系数,kd为阻尼系数,由胡科定律知弹簧施加在两顶点上的力可以表示为:

OpenGL进阶(十五) - 弹簧质点系统(Mass Spring Systems)

         由受力守恒知 fi+fj = 0. fi和fj的大小和弹簧伸长成正比关系。

        对于阻尼的计算,

OpenGL进阶(十五) - 弹簧质点系统(Mass Spring Systems)

          大小和速度成正比,并且符合力守恒,则对于一个质点,其受力方程为:

OpenGL进阶(十五) - 弹簧质点系统(Mass Spring Systems)


模拟

在模拟算法中,牛顿第二定律是关键,f = ma。在已知质量和外力的情况下,通过 a=f/m 可以得到加速度,将二阶常微分方程写成两个一阶方程:

OpenGL进阶(十五) - 弹簧质点系统(Mass Spring Systems)

可以得到解析解:

OpenGL进阶(十五) - 弹簧质点系统(Mass Spring Systems)


初始状态为 v(to) = vo, x(to)=xo.

积分将时间t内所有的变化加和,模拟的过程就是从 to 开始不断地计算 x(t) 和 v(t),然后更新质点的位置。

最简单的数值解法就是利用有限的差分近似微分:

OpenGL进阶(十五) - 弹簧质点系统(Mass Spring Systems)

其中delta t 是为时间步长,t为帧号,带入之前的公式得:

OpenGL进阶(十五) - 弹簧质点系统(Mass Spring Systems)


这个就是显式的欧拉解法,下一时刻的状态完全由当前状态决定。

整个过程的伪代码如下:

// initialization  forall particles i          initialize xi , vi and mi  endfor // simulation loop  loop         forall particles i                fi ← fg + fcoll + ∑ f(xi , vi , x j , v j )         endfor         forall particles i              vi ← vi + 
													
推荐阅读:
  1. 用C语言做的 一个整人的小程序
  2. 二叉树的先序、中序、后序遍历等基本操作c++实现

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++ opengl sys%

上一篇:oc的oop介绍,以及类的基本介绍

下一篇:AD-查看密码策略Get-ADDefaultDomainPasswordPolicy

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》