注:此为项目报告,个人报告请移步docs文件夹。
本项目是一个基于物理的模拟游戏(Simflow)。我们将从描述现实世界的物理定律出发,比如流体方程、热方程等等,提供一个可交互的物理环境,达到寓教于乐的效果。
玩家可以向环境中任意地添加各种物质,其表现形式为1像素大小的粒子。物质的种类主要为粉尘、固体、液体;最终我们在各个类别下各添加了一种比较典型物质,分别是沙、铁、水。同时,物质之间可以产生相互作用,主要为物理上的交互(碰撞、传热等),我们尽可能地还原其在现实中的行为,比如气体、液体的运动遵循流体方程,物质间传热遵循温度方程等。
总得来说,本项目即为游戏化的科学计算,其计算内容、计算方式与科学计算大体相似。但正因为是游戏,需要追求实时性,因此会有相应的妥协与权衡。
-
本项目基于C++17
-
本项目使用了ImGui框架、OpenGL来呈现界面与图形
-
整体架构基于MVVM
-
使用Travis-CI实现持续集成
本项目的复杂度主要集中在Model层。考虑到这个特性,我们安排两人进行Model层、ViewModel层的开发,一人进行View层的开发。
-
第一轮迭代由陈婉仪负责开发View层以显示粒子,钟嘉农负责搭建ViewModel层、Model层处理粒子的基本逻辑,上官越负责实现对接NS方程的求解器(用于模拟空气流动的效果)。
-
第二轮迭代由陈婉仪负责开发View层的操作面板,上官越负责Model层碰撞逻辑的优化,钟嘉农负责液体模拟的实现。
-
第三轮迭代由钟嘉农负责开发View层的数据可视化图,上官越负责Model层的计算并行化,陈婉仪负责温度模拟的实现。
如下图,我们在空中释放了一堆沙子(黄),它们飘落到了固体(白)上,形成沙丘。
如下图,我们在画布中添加了一些水(浅蓝)。这些粒子之所以形成这个形状,是因为气流的作用。
注意到右下角的气压图,红色为正压区,蓝色为负压区。大堆下落粒子的下方,空气受挤压,呈正压(红色);而下落粒子带动空气流动,在两侧形成环流,环流中心呈负压(蓝色)。这是解算NS方程的结果。
如下图,我们先用固体构建了一个容器,再在右上方添加了一些水。水顺容器壁留下,最终形成了稳定的液面。
如下图,我们添加了一块固体,并加热了它的左上角。
观察程序右下方的温度图,红色为高温,蓝色为低温。我们加热了这块固体的左上角,此时温度正在向其他部分传播,呈现出了温度梯度。这是解算温度方程的结果。
-
钟嘉农(组长)
-
陈婉仪
-
上官越