games103——作业4

news2024/12/23 2:04:07

实验四主要使用 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.coloradmin.cn/o/560535.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

​性能测试基础——性能测试方案

前面所说的测试分析等准备工作实际上最终目的是制定测试方案&#xff0c;测试方案一般包括&#xff1a; 项目的简要说明、项目系统结构、项目的业务结构、以及项目的性能需求、测试环境数据以及测试策略方法、测试案例、测试人员进度安排以及测试风险预估等等。 下面是一个一般…

FreeRTOS创建静态任务教程及所遇到的问题解决方法

静态任务和动态任务的区别 相对于动态任务&#xff0c;静态任务不需要动态分配内存&#xff0c;而是手动指定一个静态内存缓冲区&#xff0c;并在任务生命周期中一直使用该缓冲区。这可以避免动态内存分配时可能出现的内存碎片和内存泄漏问题&#xff0c;提高了系统的稳定性。…

【Python lxml、BeautifulSoup和html.parser区别介绍】零基础也能轻松掌握的学习路线与参考资料

区别介绍 &#xff08;1&#xff09;lxml lxml是Python的一个XML解析库&#xff0c;它基于libxml2和libxslt库构建&#xff0c;可以读取、操作和输出XML文档。lxml具有很强的性能和稳定性&#xff0c;在处理较大的XML文件时表现尤佳&#xff0c;并且支持XPath、CSS选择器等高…

PHP复习资料(未完待续)

&#xff08;未完待续&#xff0c;请持续关注此板块&#xff09; 【计科三四】雪课堂PHP期末模拟题&#xff1a;https://ks.wjx.top/vm/tUAmjxq.aspx# 【计科一二】PHP第一章练习题 https://ks.wjx.top/vm/QnjHad4.aspx# 【计科一二】PHP第二章练习题 https://ks.wjx.top/vm/h2…

ggplot绘制带误差棒、置信区间的柱状图,并调整颜色为渐变

ggplot绘制带误差棒、置信区间的柱状图,并调整颜色为渐变 简单绘制柱状图控制柱状宽度,间距调整颜色渐变简单绘制柱状图 要在ggplot中绘制带有置信区间的柱状图,你可以使用geom_bar和geom_errorbar函数来完成。下面是一个示例代码: library(ggplot2)# 创建一个示例数据集…

【LeetCode热题100】打卡第1天:两数之和

文章目录 两数之和⛅前言&#x1f512;题目&#x1f511;题解 两数之和 ⛅前言 大家好&#xff0c;我是知识汲取者&#xff0c;欢迎来到我们的LeetCode热题100刷题专栏&#xff01; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的题目&#xff0c;适合初识算法与…

《操作系统》期末最全复习题及解释答案

文章目录 选择题填空题简答题程序题综合题1.银行家算法2.页面置换算法3.进程调度算法4.磁盘调度算法5.求物理/逻辑地址6.分页存储管理7.可变分区分配算法 选择题 若信号量S的初值为2&#xff0c;且有3个进程共享此信号量&#xff0c;则S的取值范围是&#xff08;B &#xff09;…

Downie 4 4.6.17 MAC上最新最好用的一款视频下载工具

Downie for Mac 简介 Downie是Mac下一个简单的下载管理器&#xff0c;可以让您快速将不同的视频网站上的视频下载并保存到电脑磁盘里然后使用您的默认媒体播放器观看它们。 Downie 4 下载 Downie 4 for Mac Downie 4 for Mac软件特点 支持许多站点 -当前支持1000多个不同的…

Linux学习笔记 --- Linux基础命令

一. Linux的目录结构 目标&#xff1a;1. 掌握Linux系统的目录结构 2. 掌握Linux系统的路径表达形式 1.1 Linux系统的目录结构 我们知道&#xff0c;在操作系统中&#xff0c;文件系统的目录结构一般都是树形结构。Linux的目录结构是一个树型结构Windows 系统可以拥有多…

学习【菜鸟教程】【C++ 类 对象】【C++ 类的静态成员】

链接 1. 教程 可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成员为静态时&#xff0c;这意味着无论创建多少个类的对象&#xff0c;静态成员都只有一个副本。 静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句&#xff0c;在创建第一个对象时…

用Lua或c调用go的库

用Lua或c调用go编写的库或函数 背景思路操作golua代码汇总 参考文章 又好久没有更新了&#xff0c;这次肯定又是遇上了什么问题&#xff0c;但又解决了的&#xff0c;才跑过来更新的。我也是翻遍了全网都没找到lua去调go代码的&#xff0c;于是干脆自己写一个 背景 作为提供统…

堆结构与堆排序

二叉树的概念 满二叉树&#xff1a;二叉树的每一层的节点数都达到最大值 完全二叉树&#xff1a;满二叉树或是从左往右依次变满的树 二叉树的数组表示 01234567 堆结构&#xff08;优先级队列结构&#xff09; 完全二叉树 大根堆&#xff1…

图数据库评估难?一篇教你搞定图数据库产品评估

随着数字经济时代全面开启&#xff0c;数据作为重要的生产要素&#xff0c;赋能作用日渐凸显&#xff0c;企业逐渐开始关注自身数字化水平和数据资产价值。而当各企业数智水平提升&#xff0c;其业务环境和计算场景呈现数据间关系交错复杂的特点。在面对需要深度挖掘数据间复杂…

C语言——存储类型

目录 1. auto 自动型2. static 静态2.1 修饰变量要知道&#x1f447;&#xff08;数据在Linux内核中的分配图&#xff09; 2.2 static 的特点⭐⭐⭐⭐⭐&#xff1a;2.2 修饰函数 3. extern4. register 寄存器类型 存储类型 存储类型有&#xff1a;auto static extern register…

2023最全selenium面试题及答案,测试员没有碰到算我输.....

一、前言 Selenium&#xff0c;是一个开源的框架&#xff0c;主要用于做HTML页面的UI自动化测试。不过&#xff0c;selenium IDE在去年官方已宣告放弃维护了。官网上放着一句话&#xff0c;selenium IDE is Dead。Selenium IDE是火狐浏览器的一个插件&#xff0c;是Selenium的…

上午面了个腾讯拿 38K 出来的,让我见识到了基础的天花板

今年的校招基本已经进入大规模的开奖季了&#xff0c;很多小伙伴收获不错&#xff0c;拿到了心仪的 offer。 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的面试题和八股文&#xff0c;为此咱这里也统一做一次大整理和大归类&#xff0c;这也算是划重点了。 俗话说得好…

低功耗IC后端培训 | 盘点Power Switch Cell在实际项目中应用注意事项

下面直接进入今天的技术干货分享——全面盘点power gating cell在数字IC后端实现中的各种注意事项。 什么是Power Gating? 随着工艺制程越做越小和芯片规模越来越大&#xff0c;芯片的leakage的比重越来越高&#xff0c;数字后端实现时就得考虑leakage的优化。而leakage优化…

交通标志识别系统-卷积神经网络

介绍 使用Python作为主要开发语言&#xff0c;基于深度学习TensorFlow框架&#xff0c;搭建卷积神经网络算法。并通过对数据集进行训练&#xff0c;最后得到一个识别精度较高的模型。并基于Django框架&#xff0c;开发网页端操作平台&#xff0c;实现用户上传一张图片识别其名…

Linux 软件包管理工具

rpm命令管理软件包 1.学会看rpm包&#xff0c;通过rpm包的名字来了解这个软件包的一些基础信息xfsprogs-4.19.0-2.el8.x86_64.rpm xfsprogs 软件名字 4.19.0 版本号 2 发行次数 el8 适用于哪个操作系统&#xff08;rel8&#xff09; x86_64 软…

Streamlit应用程序使用Streamlit-Authenticator进行用户的安全身份验证实践(解决升级问题)

在Streamlit官方文档中&#xff0c;没有提供提供安全身份验证组件。目前&#xff0c;第三方streamlit-authenticator提供此功能&#xff0c;详见引用我原来的博文&#xff0c;在《Streamlit应用程序使用Streamlit-Authenticator进行用户的安全身份验证实践》文中&#xff0c;原…