games103——作业4

news/2024/11/25 16:28:19/

实验四主要使用 Shallow Wave 模拟流体

完整项目已上传至github。

文章目录

  • Height Feild(高度场)
    • 更新高度场
    • 更新速度场
  • Shallow Wave Equation
    • Discretization(离散化)
      • 一阶导数
      • 二阶导数
    • Discretized Shallow Wave Equation
      • Solution 1
      • Solution 2
      • Pressure(压强)
      • Viscosity(粘滞)
    • 算法
      • 未考虑边界
      • 考虑边界
  • Two-Way Coupling
    • 更新流体的高度场
    • 算法
    • 刚体更新


Height Feild(高度场)

2D 中,高度场是一个高度函数 h ( x ) h(x) h(x),是 1.5D 的。3D 中,就是 2.5D 的。

更新高度场

d h ( x ) d t \frac{dh(x)}{dt} dtdh(x) 表示 h ( x ) h(x) h(x) 随时间的变化; d ( h ( x ) u ( x ) ) = h ( x + d x ) u ( x + d x ) − h ( x ) u ( x ) d(h(x)u(x))=h(x+dx)u(x+dx)-h(x)u(x) d(h(x)u(x))=h(x+dx)u(x+dx)h(x)u(x) 左边项是出来的水,右边项是进来的水,所以相减表示变化的水的量,再除以dx 就是高度的变化

更新速度场

暂时忽略前后两项;速度场的更新与密度有关,密度越大越难推; d u ( x ) d t = a ( x ) = F m = P S ρ V = P ρ x \frac{du(x)}{dt}=a(x)=\frac{F}{m}=\frac{PS}{\rho V}=\frac{P}{\rho x} dtdu(x)=a(x)=mF=ρVPS=ρxP, 这里的 P = − d P ( x ) P = - dP(x) P=dP(x) 因为这里是压强差

d P ( x ) > 0 dP(x)>0 dP(x)>0 表示右边的压强大于左边,所以速度会变小(与正方向相反,这里不是大小)。 d P ( x ) < 0 dP(x) < 0 dP(x)<0 则是右边的压强小于左边,所以速度会变大(与正方向相同)


Shallow Wave Equation

Shallow Wave 方法就是通过忽略 u d u d x u\frac{du}{dx} udxdu 达到只考虑高度场的目的。

Discretization(离散化)

当然,我们不能直接处理连续的函数,因此需要将高度场离散化。

一阶导数

可以利用泰勒展开,求出离散化的前向导数和后向导数(一阶误差)

我们将上下两个泰勒展开求和,可以得出二阶误差的一阶导近似

二阶导数

我们可以通过求出前后 0.5 的一阶导近似,求出当前位置的二阶导近似

同样,我们也可以计算出 d 2 P / d x 2 d^2P/dx^2 d2P/dx2

Discretized Shallow Wave Equation

利用上面的一阶导和二阶导的离散表示,我们可以得到离散化的Shallow Wave Equation

由于所有位置水的总体积和应该是不变的(一个常数),而按照上面离散的Shallow Wave Equation得到的水的体积并不是一个常数。


这里有两种方法解决。

Solution 1

一种方法是,将 h i h_i hi 拆分,因为水是和周围两个格子产生交换。

Solution 2

还有一种更简单的方式,就是将所有的 h i h_i hi 看成是一个常数 H H H,这样最后得到的水的总体积和也是常数

Pressure(压强)

P i = ρ g h i P_i = \rho g h_i Pi=ρghi,带入 Solution 2 的公式,我们可以直接用常数 α \alpha α 替换掉 △ t 2 H g △ x 2 \frac{\triangle t^2 H g}{\triangle x^2} x2t2Hg

Viscosity(粘滞)

和刚体模拟类似,我们要考虑动量衰减,即粘滞

算法

未考虑边界

未考虑边界的算法流程如下

考虑边界

真实情况下,不可能是无边界的。对于边界的处理有两种方式,一种是当做常量 H i + 1 H_{i+1} Hi+1 进行更新(Dirichlet boundary),另一种是认为边界与边界相邻的高度是相同的(Neumann boundary),这样直接消去。

那么使用 Neumann Boudaries 的算法流程如下

也可以扩展到 3D


Two-Way Coupling

Two-Way Coupling 就是解决将一个刚体放入流体中,要如何更新高度场与刚体的速度和位置。解决问题的关键是如何将水从灰色格子区域中排出。

更新流体的高度场

想法是使用一个虚拟高度 v i v_i vi,而 h i r e a l n e w = h i − e i h^{real_new}_{i}=h_i - e_i hirealnew=hiei e i e_i ei 是由刚体陷入水中的位置得到。因为要把水排出,其实可以想象成有一个更高的水柱,要向周围排水。

由此可以得到一个 Poisson’s Equation,可以求解出 v i v_i vi v i + 1 v_{i+1} vi+1,然后代入更新高度场。

可以把 v i − 1 v_{i-1} vi1 v i + 2 v_{i+2} vi+2 加上,我的理解是这样使得矩阵对称正定,更容易求解。

算法

下面是加上虚拟高度的Shallow Wave Simulator,这里 Poisson’s equation 使用共轭梯度法求解。乘上系数 γ \gamma γ 的目的是,目前算法是显式积分,所以存在不稳定性。

刚体更新

刚体受到一个向上的浮力,其力大小如下图所示,之后按照刚体模拟的方式更新其速度和位置即可。


http://www.ppmy.cn/news/94648.html

相关文章

深度探索:使用FFmpeg实现视频Logo的添加与移除

深度探索&#xff1a;使用FFmpeg实现视频Logo的添加与移除 前言一、FFmpeg简介&#xff08;Introduction to FFmpeg&#xff09;1.1 FFmpeg的定义&#xff08;Definition of FFmpeg&#xff09;1.2 FFmpeg的功能&#xff08;Functions of FFmpeg&#xff09;1.3 FFmpeg的安装&a…

ESP8266基于Lua开发使用U8g2模块驱动 i2c ssd1306 OLED显示

ESP8266基于Lua开发使用U8g2模块驱动 i2c ssd1306 OLED显示 &#x1f4cd;相关篇《ESP8266基于Lua开发点灯示例》 &#x1f4d6;U8g2对应的API接口函数&#xff1a;https://nodemcu.readthedocs.io/en/release/modules/u8g2/ &#x1f4fa;驱动显示效果&#xff1a; &#…

从月薪8k到月薪30k,自动化测试究竟该怎样学...

绝大多数测试工程师都是从功能测试做起的&#xff0c;工作忙忙碌碌&#xff0c;每天在各种业务需求学习和点点中度过&#xff0c;过了好多年发现自己还只是一个功能测试工程师。 随着移动互联网的发展&#xff0c;从业人员能力的整体进步&#xff0c;软件测试需要具备的能力要…

微星 B460M 迫击炮 intel i5 10500 电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件配置 硬件型号驱动情况 主板微星 B460M 迫击炮 处理器intel i5 10500 comet lake已驱动 内存SK Hynix 32 GB (2x16) 2400 MHz DDR4已驱动 硬盘MTFDHBA512TDV-1AZ1…

K8s环境部署Triton实现云端模型推理

前置条件&#xff1a;K8集群、helm 1、以模型名作为目录名&#xff0c;创建目录 mkdir resnet50_pytorch 2、将模型文件、配置文件&#xff08;输入、输出等&#xff09;存到刚创建的目录下&#xff0c;resnet50_pytorch目录下文件层级结构如下 model-respository/ └── …

Android系统的JNI原理分析(7)- Android中JNI的高级用法

声明 前阶段在项目中使用了Android的JNI技术,在此文中做些技术知识总结。此篇参考一些博客和书籍,不方便逐一列出,仅供学习、知识分享,代码基于Android 7.1.1。Android JNI函数参考:‘Raw’ JNI interface to Android Dalvik (Java) VM from Mono (CS/JS)本章Demo下载:De…

开源网安亮相粤港澳大湾区CIO高峰论坛,保障企业数字化安全转型

近日&#xff0c;由深圳市工业化与信息化局、深圳市科学技术协会指导&#xff0c;深圳市CIO协会主办的“2023中国(深圳)数字化转型大会暨粤港澳大湾区CIO高峰论坛”圆满完成。开源网安作为拥有软件安全领域全链条产品的厂商&#xff0c;携多年来打造的国产化软件安全替代方案&a…

vivo软件开发马拉松大赛学习总结

vivo软件开发马拉松大赛学习总结 后端技术部署使用到的docker镜像MySQL部署后端项目部署jenkinsfile swagger配置跨域解决 其他 后端技术 部署 后端部分是使用docker来进行部署的&#xff0c;部署在服务器的/home/vivo-backend/目录下 使用到的docker镜像 MySQL:5.7基于open…