Flux流体运算
Flux流体运算

Flux流体运算

M_Sim_Calc_Height_3_5 是连续性方程的高度更新步,M_Sim_Calc_Velocity_3_5 是动量/速度更新步,整体结构和 hfFluid 的浅水迭代框架一致(论文:https://matthias-research.github.io/pages/publications/hfFluid.pdf)。

Height 材质(高度迭代)

  1. 主更新在 Custom_3,代码是典型迎风通量离散:先按速度符号选上风高度,再算 x/y 通量散度,最后 h += source + dt*dhdt。见 .codex_tmp/material_t3d_aki/Game__Aki__Render__RuntimeBP__PCG__WaterSim__Mat__M_Sim_Calc_Height_3_5.t3d:615。
  2. 输入映射很清晰:中心/邻居高度来自 MF_SimulationInfo 的 Volume 输出,速度来自 Velocity 输出拆分,dx/dt 来自参数。见 .codex_tmp/material_t3d_aki/Game__Aki__Render__RuntimeBP__PCG__WaterSim__Mat__M_Sim_Calc_Height_3_5.t3d:619。
  3. 输出打包为 (velocity.xy, newHeight):AppendVector_3 + Multiply_5(乘了 Custom_4=1,等效直通)。见 .codex_tmp/material_t3d_aki/Game__Aki__Render__RuntimeBP__PCG__WaterSim__Mat__M_Sim_Calc_Height_3_5.t3d:336、 .codex_tmp/material_t3d_aki/Game__Aki__Render__RuntimeBP__PCG__WaterSim__Mat__M_Sim_Calc_Height_3_5.t3d:1285、Docs/MaterialGraph_Aki/M_Sim_Calc_Height_3_5/expanded/material_graph_expanded.json:603。

Velocity 材质(速度迭代)

  1. 主链路是:压力坡度/重力加速 -> 湿区掩码 -> 摩擦/阻尼 -> 限幅 -> 边界清零。
  2. 加速项:由中心和邻域水面差构建梯度,再乘 Gravity*DeltaTime,并用 MF_ClampMax2(AccelerationClamp) 限制。见 .codex_tmp/material_t3d_aki/Game__Aki__Render__RuntimeBP__PCG__WaterSim__Mat__M_Sim_Calc_Velocity_3_5.t3d:300、 .codex_tmp/material_t3d_aki/Game__Aki__Render__RuntimeBP__PCG__WaterSim__Mat__M_Sim_Calc_Velocity_3_5.t3d:1360、 .codex_tmp/material_t3d_aki/Game__Aki__Render__RuntimeBP__PCG__WaterSim__Mat__M_Sim_Calc_Velocity_3_5.t3d:907。
  3. 湿区判定:MF_FluxRemoveFluid 按坡度符号选 W0/W1,再和 MinWater 比较输出 0/1 掩码。见 .codex_tmp/material_t3d_aki/Game__Aki__Render__RuntimeBP__PCG__WaterSim__Mat__M_Sim_Calc_Velocity_3_5.t3d:1150、Docs/MaterialGraph_Aki/M_Sim_Calc_Velocity_3_5/functions/Game__Aki__Render__RuntimeBP__PCG__WaterSim__Mat_Function__MF_FluxRemoveFluid.MF_FluxRemoveFluid.t3d:112。
  4. 干区清零:Custom_1 做 if (x>0) return v else 0。见 .codex_tmp/material_t3d_aki/Game__Aki__Render__RuntimeBP__PCG__WaterSim__Mat__M_Sim_Calc_Velocity_3_5.t3d:690。
  5. 边界清零:Step_1 + TextureProperty 形成边界掩码后乘到速度上。见 .codex_tmp/material_t3d_aki/Game__Aki__Render__RuntimeBP__PCG__WaterSim__Mat__M_Sim_Calc_Velocity_3_5.t3d:1600。
  6. 输出打包:AppendVector_5=(newVel.xy, volume) 写到 Emissive;Opacity 取 Foam。见 .codex_tmp/material_t3d_aki/Game__Aki__Render__RuntimeBP__PCG__WaterSim__Mat__M_Sim_Calc_Velocity_3_5.t3d:422、 .codex_tmp/material_t3d_aki/Game__Aki__Render__RuntimeBP__PCG__WaterSim__Mat__M_Sim_Calc_Velocity_3_5.t3d:1687。

SWE浅水方程:

高度迭代

论文主式:

image.png

离散后本质是“通量差分”,再显式欧拉:

image.png

image.png

M_Sim_Calc_Velocity_3_5 对应的是 hfFluid 的速度更新部分(Sec 2.1.3):

  1. 论文主公式(对应 Eq.(8)(9))

image.png

image.png

再做边界/干湿门控后输出。

  1. 每一项含义和节点对应
    • g:重力,Gravity 参数,见 Docs/MaterialGraph_Aki/M_Sim_Calc_Velocity_3_5/material_graph.json:700。

    • \Delta t:时间步长,DeltaTime 参数(多个分支各自使用),见 Docs/MaterialGraph_Aki/M_Sim_Calc_Velocity_3_5/material_graph.json:221。

    • \eta 与邻域采样:来自 MF_SimulationInfo(Offset 输入 + Height/WaterHeight/Velocity 输出),见 Docs/MaterialGraph_Aki/M_Sim_Calc_Velocity_3_5/functions/Game__Aki__Render__RuntimeBP__PCG__WaterSim__Mat_Function__MF_SimulationInfo.MF_SimulationInfo.t3d:122、Docs/MaterialGraph_Aki/M_Sim_Calc_Velocity_3_5/functions/Game__Aki__Render__RuntimeBP__PCG__WaterSim__Mat_Function__MF_SimulationInfo.MF_SimulationInfo.t3d:194、Docs/MaterialGraph_Aki/M_Sim_Calc_Velocity_3_5/functions/Game__Aki__Render__RuntimeBP__PCG__WaterSim__Mat_Function__MF_SimulationInfo.MF_SimulationInfo.t3d:216。

    • \nabla\eta(坡度/梯度):由当前+邻域采样差分链路(MaterialFunctionCall_22/28/29 + Add/Subtract/Divide)构造,见函数调用位置 Docs/MaterialGraph_Aki/M_Sim_Calc_Velocity_3_5/material_graph.json:396、Docs/MaterialGraph_Aki/M_Sim_Calc_Velocity_3_5/material_graph.json:415、Docs/MaterialGraph_Aki/M_Sim_Calc_Velocity_3_5/material_graph.json:464。

    • a_{max}:AccelerationClamp,通过 MF_ClampMax2 限幅,见 Docs/MaterialGraph_Aki/M_Sim_Calc_Velocity_3_5/material_graph.json:658、Docs/MaterialGraph_Aki/M_Sim_Calc_Velocity_3_5/material_graph.json:668。

    • VelocityClamp:速度上限,通过另一个 MF_ClampMax2,见 Docs/MaterialGraph_Aki/M_Sim_Calc_Velocity_3_5/material_graph.json:169、Docs/MaterialGraph_Aki/M_Sim_Calc_Velocity_3_5/material_graph.json:179。

    • s_{wet}:干湿缩放(无水时抑制速度),由 MF_FluxRemoveFluid 输出 Scale,见 Docs/MaterialGraph_Aki/M_Sim_Calc_Velocity_3_5/material_graph.json:552、Docs/MaterialGraph_Aki/M_Sim_Calc_Velocity_3_5/material_graph.json:639,函数定义见 Docs/MaterialGraph_Aki/M_Sim_Calc_Velocity_3_5/functions/Game__Aki__Render__RuntimeBP__PCG__WaterSim__Mat_Function__MF_FluxRemoveFluid.MF_FluxRemoveFluid.t3d:70、Docs/MaterialGraph_Aki/M_Sim_Calc_Velocity_3_5/functions/Game__Aki__Render__RuntimeBP__PCG__WaterSim__Mat_Function__MF_FluxRemoveFluid.MF_FluxRemoveFluid.t3d:102。

    • Friction:与速度模长组成非线性衰减,见 Docs/MaterialGraph_Aki/M_Sim_Calc_Velocity_3_5/material_graph.json:494。

    • Damping:线性阻尼项 1−DampingΔ_t_,见 Docs/MaterialGraph_Aki/M_Sim_Calc_Velocity_3_5/material_graph.json:221。

      1−DampingΔt

    • if (x>0) return v else 0:最终水量门控(Custom_1),见 Docs/MaterialGraph_Aki/M_Sim_Calc_Velocity_3_5/material_graph.json:160。

  2. 两个关键函数在数学上做了什么
    • MF_ClampMax2:vv⋅min(1,∣vMax),即向量模长限幅。定义见 Docs/MaterialGraph_Aki/M_Sim_Calc_Velocity_3_5/functions/Game__Aki__Render__RuntimeBP__PCG__WaterSim__Mat_Function__MF_ClampMax2.MF_ClampMax2.t3d:63、Docs/MaterialGraph_Aki/M_Sim_Calc_Velocity_3_5/functions/Game__Aki__Render__RuntimeBP__PCG__WaterSim__Mat_Function__MF_ClampMax2.MF_ClampMax2.t3d:74。

      v←v⋅min⁡(1,Max∣v∣)

    • MF_FluxRemoveFluid:根据 Slope 选 W0/W1,再与 MinWater 比较输出 0/1 缩放。定义见 Docs/MaterialGraph_Aki/M_Sim_Calc_Velocity_3_5/functions/Game__Aki__Render__RuntimeBP__PCG__WaterSim__Mat_Function__MF_FluxRemoveFluid.MF_FluxRemoveFluid.t3d:70、Docs/MaterialGraph_Aki/M_Sim_Calc_Velocity_3_5/functions/Game__Aki__Render__RuntimeBP__PCG__WaterSim__Mat_Function__MF_FluxRemoveFluid.MF_FluxRemoveFluid.t3d:81、Docs/MaterialGraph_Aki/M_Sim_Calc_Velocity_3_5/functions/Game__Aki__Render__RuntimeBP__PCG__WaterSim__Mat_Function__MF_FluxRemoveFluid.MF_FluxRemoveFluid.t3d:92。

MAC 网格。

vy(i,j+1/2)
        ↑
 ┌─────────────┐
 │             │
 │   h(i,j)    │ → vx(i+1/2,j)
 │             │
 └─────────────┘
        ↓
      vy(i,j-1/2)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注