我的博客和笔记我的博客和笔记
首页
文章
  • TurboLink
  • TinyEncrypt
  • UnrealStyleGuide
  • AxTrace
  • Cyclone
  • 数学相关
  • 图形学
  • 密码学
  • 编程语言
关于
GitHub
首页
文章
  • TurboLink
  • TinyEncrypt
  • UnrealStyleGuide
  • AxTrace
  • Cyclone
  • 数学相关
  • 图形学
  • 密码学
  • 编程语言
关于
GitHub
  • 我的文章

    • 从抛币协议到智能合约

      • Part1
      • Part2
    • JPEG算法解密

      • Part1
      • Part2
      • Part3
      • Part4
      • Part5
      • Github
    • SPH算法简介

      • Part1
      • Part2
      • Part3
      • Part4
      • Github
    • 赌博中的数学:Martingle策略
    • 如何生成一个随机的圆形
    • 一个简单的DH密钥协商算法的实现
    • 如何计算线段和圆的交点
    • 一道数学趣题
    • 斐波那契数列和1/89
    • 匀速贝塞尔曲线运动的实现

      • Part1
      • Part2
  • 开源项目

    • TurboLink
    • TinyEncrypt
    • UnrealStyleGuide
    • AxTrace
    • Cyclone
  • 学习笔记

    • 数学相关

      • 常用数学符号
      • 群
      • 数论(一)
      • 数论(二)
      • 数论(三)
      • 概率
    • 密码学

      • RSA
      • 抛币协议
      • 智能扑克协议
    • 图形学

      • 数学基础

        • 矢量
        • 矩阵
        • 立体角
        • 几何变换(一)
        • 几何变换(二)
        • 法线变换
        • 摄像机变换
      • 光照模型

        • 传统光照模型
        • 光度学
        • 双向反射分布函数(BRDF)
        • 微平面理论(一)
        • 微平面理论(二)
        • 微平面理论(三)
        • 光照方程
      • 环境光渲染

        • 环境光渲染(一)
        • 环境光渲染(二)
    • 编程语言

      • JavaScript

        • 环境搭建
        • 基本语法
        • 函数
        • 对象和类

SPH算法简介(一): 数学基础

SPH(Smoothed Particle Hydrodynamics)算法是一种流体模拟算法,他的特点是简单快速,可以用在例如游戏这样的实时的交互软件中。SPH算法虽然简单,但要完全搞明白其中的原理和实现方法,也不是易事,写这个系列希望能全面介绍一下相关的内容,如果你搜索到这里,可以仔细看一下这个系列,希望能帮到你。
烟雾、海浪、水滴…,这些司空见怪的自然现象其实有着非常复杂的数学规律,对于流体的研究,有两种完全不同的视角,分别是欧拉视角和拉格朗日视角。欧拉视角的坐标系是固定的,如同站在河边观察河水的流动一样,用这种视角分析流体需要建立网格单元,还会涉及到有限元等复杂的工程方法,一般用在离线的应用中。而拉格朗日视角则将流体视为流动的单元,例如将一片羽毛放入风中,那么羽毛的轨迹可以帮我们指示空气的流动规律。

欧拉视角 和 拉格朗日视角

SPH算法是典型的拉格朗日视角,它的基本原理就是通过粒子模拟流体的运动规律,然后再转换成网格进行流体渲染。

→

→


在正式开始之前,需要把SPH算法涉及到的相关数学概念介绍一下,这些概念基本上都是大学数学中的内容,所以不用紧张,翻翻书就能想起来。

标量场和矢量场

如果空间区域内一点M,都有一个确定的数量fM,则称这个空间区域内确定了一个标量场,如果空间区域内任意一点M,都有一个确定的向量FM→,则称这空间区域内确定了一个矢量场。例如,液体中的密度,就是标量场,而速度,就是矢量场

偏导数

对于多元函数z=f(x,y),定义z在(x0,y0)处相对于x的偏导数为

(1.1)∂z∂x=lim△x→0f(x0+△x,y0)−f(x0,y0)△x

例如,定义z=x2+2xy+y3,那么∂z/∂x=2x+2y,∂z/∂y=2x+3y2

哈密顿算子

哈密顿算子∇在流体力学中是如此重要,以至于很多地方将这个符号作为流体力学的标志,所以这里要着重介绍一下,所谓“算子”,就是那种不能单独存在,必须和其他符号放在一起的一种数学符号,例如微分中的那个“d”。哈密顿算子的定义如下:

(1.2)∇≡x→∂∂x+y→∂∂y+z→∂∂z

哈密顿算子有很多有趣的特性,它本身虽然并不是一个矢量,但很多运算确实可以把它视为一个矢量,例如把它作用在一个标量场A=f(x,y,z)上,那么

(1.3)∇A=x→∂f∂x+y→∂f∂y+z→∂f∂z

这个运算可以视为一个矢量和标量的乘法,得到的∇A是一个矢量场,称为A的“梯度”,顾名思义,梯度的含义就是标量场A在某处变化快慢和方向,比如一个标量场H(x,y)是一座高山在(x,y)处的高度,则H的梯度是该高山在某处陡峭的程度,并且方向指向高处。

上面两个图中,标量场是黑白的,黑色表示大的数值,而其相应的梯度用蓝色箭头表示

而如果把哈密顿算子作用在一个矢量场A→上,得到的∇⋅A→称为矢量场A的“散度”,散度的计算和矢量的点积运算相似,得到的是一个标量场。

(1.4)∇⋅A→=(x→∂∂x+y→∂∂y+z→∂∂z)⋅(x→Ax+y→Ay+z→Az)=∂Ax∂x+∂Ay∂y+∂Az∂z

散度的意义也很明显,就是描述一个矢量场“发散”的程度,例如下面的两个矢量场,左边的有很大的散度,而右边的散度为0

两个散度差别很大的矢量场

拉普拉辛算子

拉普拉辛算子∇2是二阶微分算子,有时也可写作Δ或者∇⋅∇

(1.5)∇2≡∂2∂x2+∂2∂y2+∂2∂z2

例如对于A=f(x,y,z)

(1.6)∇2A=∂2A∂x2+∂2A∂y2+∂2A∂z2
Next
Part2