zoukankan      html  css  js  c++  java
  • Games201-拉格朗日视角和欧拉视角

    pep8代码格式化 可以使用yapf

    导出gif文件

    Lagrangian View

    节点随着材质一起动,每个节点是一个sensor

    一般是粒子

    Eulerian View

    每个节点都是固定不动的,是still sensor that never move

    穿过我的材料速度是多少

    欧拉里的格点的位置是不用记的,而欧拉的点位置要记录

    Mass-Spring System

    stiffness 硬度 对抗变形的能力,胡克定律的k

    damping 阻尼 小了会不停的晃动 一般是给弹簧加damping

    胡克定律 + 牛顿第二定律

    常微分方程

    计算机的积分,时间是离散的,需要取一个dt ,大一点算的快但是会有不稳定的问题

    dt内速度和质量都是常数,前两个的区别是预测位移时使用的速度不一样,后者有一些守恒的性质

    back Euler+牛顿方法 得到隐式欧拉

    1、计算力和速度

    2、处理碰撞

    3、处理位移

    显式积分和隐式积分

    显式积分的未来只取决于过去,

    易于实现,容易爆炸(对dt),对比较硬的材料不是很适合

    爆炸:计算误差无法随时间衰减,而是随时间爆炸性增长

    有数值稳定性的约束

    后向欧拉 隐式时间积分,未来取决于过去和未来,鸡蛋问题,每一个timestep变昂贵,难实现,难优化,timestep可以更大

    有好处也有坏处

    f(x)一般是非线性的,如果有非线性方程就比较难解,转换成线性的方程

    线性化用到了一阶泰勒展开

    解线性系统

    • jacobi 迭代 最简单

    • gauss-seidel 迭代 更快

    • 共轭梯度

    最后一个错了 B = 1

    求矩阵的逆是非常昂贵的操作,大的矩阵不推荐求逆

    有非常多的粒子怎么办?

    • 稀疏矩阵
    • 共轭梯度
    • 预条件
    • 基于位置的运动学

    拉格朗日解流体粒子方法 SPH

    一堆粒子携带物理量,使用核函数近似一个连续的场

    在x这一点,物理场的值用核函数去求周围的粒子的作用,接近这个粒子的贡献的多,远离这个粒子的贡献少

    速度、density、pressure

    一开始是用来模拟天体物理

    优点:不需要mesh,自由表面(水和空气的有明确的表面,烟雾是分散于空气中的没有明确的表面),每一个粒子是一滴水,然后被其他水滴作用

    WCSPH weekly compressible SPH 可压缩的流体模拟(入门)

    Dv称为材料倒数,跟着粒子动的倒数,和小d不同

    压强梯度除密度为内力,g为外力,v就是速度了

    压强的表示,状态方程

    B:bulk modulus ( ho_0)是一个理想密度,密度很大压强就很大,压强很高就会尝试推着周围的粒子离开自己

    [p =B((frac{ ho}{ ho_0})^gamma - 1) ]

    粒子的( ho)是就算周围的粒子的质量加权来算的

    A计算每一个粒子的所在位置的物理量的多少,任意的粒子物理属性,一个加权平均,应该把它看做一条公式

    算梯度的多方法,sph做的不是很好

    计算通用属性的公式:

    SPH也可以比较方便的加表面张力加粘度

    SPH计算:

    1、对每个粒子计算它所在位置的密度

    2、对每个粒子计算它的压强梯度,进而得到它的Dv/Dt

    3、Symplectic Euler Step

    有很多的变种

    PCI - SPH 有隐式的SPH,但不完全是隐式的,有预测的做法,不断的校正

    Position-based fluid PBF 实时的PBD + SPH 的模拟流体的方法

    Divergence-free SPH 指的是速度场无分离,接近一种不可压缩流体的方法

    显示时间积分的条件

    CFL condition

    从材料刚度有考虑时间步长限制

    从粒子运动速度来考虑时间步长限制

    各模拟都要遵循这个条件,我们要取这个Cmax

    需要加速SPH,时间复杂度O(n^2)n可能达到百万

    实际中我们会使用一些特殊的数据结构(voxel grid)来加速对相邻的粒子的search达到复杂度O(n)

    对每一个粒子要精确的找到和他比较近的所有粒子 只要loop比较近的粒子,维护一个grid,每一个格子维护自己内部有哪些粒子,每次我们要寻找周围的粒子时先找自己格子和自己周围一定距离格子,然后遍历这些格子维护的粒子

    还有很多其他的加速方法

    SPH论文:

    R. A. Gingold and J. J. Monaghan (1977). “Smoothed particle hydrodynamics: theory and application to non-spherical stars”. In: Monthly notices of the royal astronomical society 181.3, pp. 375–389.

    J. J. Monaghan (1994). “Simulating free surface flows with SPH”. In: Journal of computational physics 110.2, pp. 399–406.

    其他的粒子法:

    DEM discrete element method 每一个粒子都是一个刚体小球,可以模拟沙子

    MPS moveing particle semi-implicit

    PP power particle

    导出gif

    https://taichi.readthedocs.io/en/latest/export_results.html#export-your-results

    流固耦合

    解线性系统联立求解就是强耦合

    先解流体然后把流体作为刚体的边界条件解刚体,然后把解出来的刚体作为边界条件解流体

    SPH有一个很好模拟各种介质的耦合,流体、弹性物体、刚体

    从粒子生成表面的mesh

    marching cube

    队伍格子上面的点去算一下他的密度,然后尝试画出他的值为0的一个等势面,等势面就是用三角网格去近似的

    有很多种情况,这里给了14种

    marching cube 有 很多的预处理 smooth操作

    openVDB 有smooth operator

    先把粒子光栅化到一个背景网格上,然后背景网格上做一个根据距离场的圆滑或者尖锐,得到一个density field然后就可以使用marching cube

    实时应用:屏幕空间渲染,一种近似,但镜头动的比较大就比较麻烦

  • 相关阅读:
    PHP中使用CURL实现GET和POST请求
    PHP 正则表达式匹配函数 preg_match 与 preg_match_all
    微信跳转黑科技:微信跳转技术让微信电商从此不缺流量
    PHP通过get方法获得form表单数据方法总结
    php获取微信基础接口凭证Access_token
    PHP命名空间与自动加载类详解
    PHP如何搭建百度Ueditor富文本编辑器
    PHP调用微博接口实现微博登录的方法示例
    PHP常用日期加减计算方法实例
    微信公众平台---带参数二维码生成和扫描事件
  • 原文地址:https://www.cnblogs.com/FlyingZiming/p/14055918.html
Copyright © 2011-2022 走看看