c# - 模拟离散房间中的减压

标签 c# algorithm game-physics

我正在尝试构建一个具有可破坏部分的俯视宇宙飞船游戏。我需要模拟船体破裂时的减压过程。

我有一个带有房间分区代码设置的平铺 map : Tiled map

我想做的是建立某种矢量场,它可以确定空气离开减压房间的方式。因此,如果您打破连接吸尘器和房间(与紫色和绿色房间相邻)的瓷砖,您最终会得到这样的矢量图:

Air flow in a depressurized room

我的想法是实现某种标量场(有点类似于势场)来帮助确定气流(基本上用欧氏距离填充网格(考虑到障碍物)到已知的零势点,然后通过考虑当前瓦片具有较低潜在值的所有相邻瓦片来计算向量:

Scalar field and vector calculation

然而,这种方法有一个缺陷,即在某一点上施加到 body 上的力的大小并没有真正考虑到气流瓶颈和距离,所以在真空瓦旁边的瓦上的力应该与以及房间的另一端。

有没有更好的方法来模拟这种行为,或者我认为可以更改算法或多或少地考虑距离和瓶颈?

最佳答案

从评论中收集的算法升级思路:

(...) 你想要在这种情况下对“力”有一种真实的感觉,那么它不应该仅仅基于距离,而是像你说的那样,基于气流。您需要在某种程度上对其进行估计,并注意它的行为类似于电子学中的基尔霍夫规则。假设孔很小 - 那么每秒吸入的空气量很小。第一个最近的瓷砖必须覆盖它,它们每秒损失 X 空气。他们周围的瓷砖也必须转换它 - 他们总共每秒损失 X 空气。还有他们的邻居……等等。它的工作原理类似于 Dijkstra 距离,但在倒计时。

示例:假设没有墙,从 16/秒开始在零点指向地面上的洞,周围 8 个地砖将以 2/秒的速度指向零点地砖。周围 12 个方 block 的下一层将达到 1.33/秒,依此类推。现在改变它,即 (1) 考虑各种初始孔尺寸 (2) 各种大的不可通过的障碍物 (3) 由于小 channel 导致的气流限制 - 这就像新的起点。

另一个示例(来自相关 map ):值为零的图 block 的值为 1000 单位/秒。在它下面的每个都是 500/s,下一个也是 1000/s,连接到它的三个每个都是 333/s。

之后,我们可以将向量的系数基于此标量值的差异,并且由于它考虑了障碍物和距离,它或多或少会在现实中起作用。

关于上面的第 (3) 点,想象一下,除了只有 sure-100%-pass 和 nope-0%-wall 之外,您还有中间选项。除了走廊和墙壁,您还可以拥有 30% 空气通过率的破窗。例如,在 map 上距离为 [0] 的地方,您有一个初始孔,该孔会产生 1000/秒的通量。然而,在距离 [2] 处有一个小通风口或一个带有 30% 气流调节器的破窗。这意味着它将把传入 (2x500=1000) 的数量限制为 0.3x(2x500)=300/秒,现在将进一步流向下一个区域。这将允许您以不同的速度对隔间减压,因此前几 block 瓷砖将很快失去所有空气,而甲板的其余部分将花费更多时间(除非点 [2] 处的 30% 修改器窗口完全破裂,等等)。

关于c# - 模拟离散房间中的减压,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45343472/

相关文章:

c# - ScriptControlDescriptor.AddProperty 和只读属性

java - 如何处理libGDX的Box2D ContactListener中的空指针异常?

java - 如何让入侵者在java中从左向右移动

c - DDA 算法并未为所有坐标值绘制直线

c# - Farseer 3.3 检查未启用的物体是否会在启用时发生碰撞(生成)

c# - 如何在右键单击 WPF DataGrid 时访问 DataGridCell

c# - 分片目录结构算法

c# - 根据参数,以编程方式启动 CLI 应用程序不起作用

algorithm - 图的任意两个顶点之间存在循环

algorithm - UI 虚拟化实现细节。如何实现?