# 彩色流体实验台（MiniMax M3.1 Flash / max）

## 原始提示词

见 [完整原始输入](prompt.md)。该输入与主题提示词 v1 正文一致。

## 实现说明

单文件 `index.html`，HTML / CSS / JavaScript / GLSL 全部内联，无后端、无 CDN、无构建步骤。

### 求解流程（GPU 上真实数值求解）

每帧按顺序执行：

1. **涡量与卷曲增强**：由速度场求涡量，再沿涡量梯度方向注入约束力，让流体产生卷曲与混合。
2. **散度**：计算速度场散度。
3. **压力迭代**：对压力做 Jacobi 迭代（次数由滑块控制，1–60），上一帧压力按 0.8 衰减。
4. **速度投影**：从速度场中减去压力梯度，使速度场近似无散。
5. **速度场自平流**。
6. **染料平流**：染料作为被动标量随速度场平流，并按消散系数衰减。

全部步骤在浮点纹理上用片元着色器完成，速度场、压力场、散度场、染料场均为双缓冲 FBO。速度场与压力场使用 `RGBA16F`（WebGL 2）或 `OES_texture_float`（WebGL 1）纹理；不满足条件时给出明确的中文提示，不会留下空白页。

### 交互与参数

- 鼠标 / 触摸拖动注入染料与动量，拖动方向决定流动方向，快速拖动会自动插值补点。
- 染料颜色、注入力度、染料消散、压力迭代次数、模拟分辨率、卷曲强度六个滑块全部实时生效。
- 暂停 / 继续、清空流体、重置参数、保存 PNG 截图。
- 设备像素比上限为 2；窗口尺寸变化时按新宽高比重建全部纹理，旧纹理与 FBO 显式释放，触摸坐标按画布实际尺寸换算。

### 上下文丢失处理

浏览器可能因显卡驱动重置等原因回收 WebGL 上下文。实现监听 `webglcontextlost`，暂停渲染循环、替换画布并重建着色器与纹理后继续运行（见下方 `changes`）。

## 运行与验证

Playwright + Chromium 自动化校验（模型生成的实现，均通过）：

- WebGL 2 上下文创建成功，`EXT_color_buffer_float` 可用，模拟纹理 310 × 192、染料纹理 619 × 384 已创建。
- 注入后画面出现染料（像素和 0 → 2868），继续演化后像素分布改变（2868 → 2117）。
- 向右拖动：右半区像素和 2458、左半区 68；向左拖动：左半区 2470、右半区 68，方向确实影响流动。
- 暂停后 500ms 内像素和完全不变；继续后重新演化。
- 清空后像素和归零。
- 参数面板改动立即反映到求解设置（迭代 45、消散 3.0、模拟分辨率 128 → 纹理高度 128）。
- PNG 截图返回有效 `data:image/png;base64`。
- 390px 视口无水平溢出；触摸点击可注入染料；控制台无错误。
- 已知限制：测试环境为软件渲染（SwiftShader），帧率偏低；真实 GPU 上可稳定接近 60FPS。

<!-- archive:start -->
## 当前归档信息（自动生成）

- 实验 ID：`fluid-simulation--minimax-m3-1-flash-max-r01`
- 模型：MiniMax M3.1 Flash；推理档位：max
- 类型：single-html；预览：static；网络：offline
- [完整原始输入快照](prompt.md) · [主题与其他版本](../../../../topic.html?id=fluid-simulation)
- 输入记录：完整原始输入快照，与主题提示词 v1 正文一致（任务正文本身即原始输入）。
- 工具：Claude Code CLI（当前会话，模型 MiniMax-M3.1-Flash，档位 max）。单会话直接实现，未使用子代理；本地用 Playwright/Chromium 以 file:// 与 390px 视口做自动化校验。
- 运行方式：浏览器直接打开本目录入口；CDN/外部素材需要联网。
- 费用记录：MiniMax 批次合计 金额未记录（11 个案例；批次 minimax-m3-1-flash-max-2026-10-19；未记录单案例费用）
- [流体实验台主页面](../../../../demos/fluid-simulation/runs/minimax-m3-1-flash-max-r01/index.html)

### 部署适配记录

- 实现中加入了 WebGL 上下文丢失后的自动重建：无头/受限环境可能回收首个 WebGL 上下文，此时会替换画布并重新初始化着色器与纹理，避免留下空白画面。
- 迁移来源：F:\dev\ai-coding-demo-test 的 experiment/minimax-m3-1-flash-max 分支，提交 871beb18e0e85d6dd542cadca398e67aa4ff1247；保留该提交中的任务输入、实现源码和原有说明。
- 维护者于 2026-10-20 按本仓库统计规则为网页入口引用公共 assets/analytics.js；原始任务输入未改动。
- 维护者于 2026-10-20 在本仓库本地 HTTP 预览中补拍真实桌面截图，并按案例评分规则 v2 逐项复核。
- 维护者于 2026-10-20 按用户要求重新逐图评分，原始 PNG、输入及实现不变；旧分、新分、逐项观察和规则快照保存在 catalog/score-reviews/2026-10-20-minimax-m3-1-flash-max-v2.json。
- 维护者于 2026-10-22 按 v3 对本轮桌面、手机及补充状态逐图重评并绑定 captures 证据；旧截图和 v2 评分见 catalog/score-reviews/2026-10-21-v3-source.json。未重跑模型或改写实验源码，截图不证明完整功能、算法、手势或性能。
<!-- archive:end -->
