反应扩散原理与参数手册
回到 实时演化画布 →
两种物质在一张纸上互相反应、同时各自扩散。只要扩散速度不一样, 原本均匀的一锅汤就会自己失稳,长出稳定的空间花纹。 这套机制叫图灵不稳定性,Gray-Scott 是它最简洁的一个可计算模型。
设 A 是「原料」,B 是「生成物」,二者浓度都归一化到 0–1:
∂A/∂t = D_A ∇²A − A·B² + F·(1 − A)∂B/∂t = D_B ∇²B + A·B² − (F + k)·B逐项读:
| 项 | 含义 |
|---|---|
D_A ∇²A / D_B ∇²B |
扩散。本站取 D_A = 1.0、D_B = 0.5,即 A 的扩散速度是 B 的两倍 |
A·B² |
自催化反应 A + 2B → 3B。B 越多,吃 A 变 B 越快——这是「局部自我放大」 |
F·(1 − A) |
补料。以速率 F 把 A 补回 1 |
(F + k)·B |
清除。以速率 F+k 把 B 移走 |
关键在 D_A > D_B:放大效应(B 自催化)扩散得慢,抑制效应(A 被消耗、周围缺料)扩散得快。 「近处激活、远处抑制」,这正是 Turing 在 1952 年那篇论文里给出的成花纹条件。
为什么只有一小片参数是活的
Section titled “为什么只有一小片参数是活的”把方程的空间项去掉,求均匀定态 A·B² = F(1−A)、A·B² = (F+k)B,
非平凡解存在的条件是:
F ≥ 4·(F + k)² 等价于 k ≤ √F / 2 − F站上参数地图里那条蓝色曲线画的就是 k = √F/2 − F。
但要注意一件事——「能长出花纹」并不等于「曲线下方」,这是个很容易写错的结论。 本站在真实运行的模拟上扫了一遍参数空间,结果是:
| 位置 | 实测结果 |
|---|---|
| 曲线下方较深处(如 F=0.020, k=0.045,低于曲线 0.006) | B 铺满整个平面,糊成均匀一片,没有花纹 |
| 紧贴曲线下侧(约 −0.004 以内) | 铺满型花纹:迷宫、指纹、蠕虫、珊瑚 |
| 紧贴曲线上侧(约 +0.006 以内) | 孤子型花纹:斑点阵列、孔洞、U-Skate |
| 曲线上方更远处(如 F=0.030, k=0.066,高于曲线 0.009) | 几秒内归于空白 |
曲线上方之所以还能有花纹,是因为那里虽然没有非平凡的均匀定态, 却存在被有限扰动激发出来的局部自持结构——自复制斑点、孤子。 这正是 Gray-Scott 最有名的那一类行为。
把本站九组预设逐个代进 k − (√F/2 − F) 算一遍,结果全部落在 −0.004 到 +0.006 之间。
换句话说:整个花纹世界挤在这条曲线上下不到 0.01 的一条缝里。
这也是为什么这个模型这么迷人——参数挪 0.001,花纹种类就整个换掉。
九组预设参数
Section titled “九组预设参数”下表是本站预设按钮里的九组值,每一组我都在这个站上实际跑过并截图确认过形态。 分类命名沿用 Pearson (1993) 及后续文献中的通行叫法。
| 名称 | F | k | 离曲线 | 形态 |
|---|---|---|---|---|
| 珊瑚生长 | 0.0545 | 0.0620 | −0.0002 | 枝状网络不断分叉外扩,末端带球头 |
| 迷宫 | 0.0290 | 0.0570 | +0.0009 | 等宽长通道填满整个平面,像大脑沟回 |
| 细胞分裂 | 0.0367 | 0.0649 | +0.0058 | 亮斑长到临界尺寸就一分为二,向空白区推进 |
| 蠕虫 | 0.0780 | 0.0610 | −0.0006 | 一条条粗虫状条纹,端点圆钝、缓慢蠕动 |
| 孔洞 | 0.0390 | 0.0580 | −0.0017 | 反相图案:实心底面被啃出密排圆洞 |
| 指纹 | 0.0380 | 0.0610 | +0.0015 | 平行细密沟纹,跟人的指纹几乎一模一样 |
| 大理石流纹 | 0.0260 | 0.0510 | −0.0036 | 大块纹路持续翻涌,永不收敛 |
| 孤子 | 0.0220 | 0.0550 | +0.0028 | 稀疏亮斑各自游走、分裂、碰撞 |
| U-Skate | 0.0620 | 0.0609 | −0.0016 | 暗点粒子在多边形胞壁间滑行 |
「离曲线」= k − (√F/2 − F),负值在曲线下侧、正值在上侧。
上表对应的是本站的 D_A=1.0, D_B=0.5, Δt=1.0, 9 点拉普拉斯算子,
初始条件为随机撒 26 个圆斑 + 幅度 0.06 的白噪声。
关于网上流传的参数表:不少资料里给的「波纹 F=0.014, k=0.045」「移动斑点 F=0.014, k=0.054」 在本站这套系数下跑出来是全黑——F 太低时 B 的净增长跟不上,直接归于空白。 所以这两组已经换成实测能出效果的「指纹」和「孤子」。 这也说明:参数表必须配着具体的 D_A/D_B/Δt/拉普拉斯算子一起给才有意义,单独抄数字很容易踩空。
本站是怎么算的
Section titled “本站是怎么算的”- 双缓冲浮点纹理:两张
RGBA32F纹理(设备不支持则退RGBA16F)来回读写, R 通道存 A 的浓度,G 通道存 B 的浓度。一次 draw call = 一步迭代。 - 9 点拉普拉斯算子:直角邻居权重 0.2,对角邻居 0.05,中心 −1。 比 5 点算子各向异性小得多,花纹不会沿着网格轴向拉扯。
- 网格分辨率:长边 512(窄屏 384),短边按画布比例取,保证每个格子是正方形。
- 每帧迭代多步:默认 16 步/帧,60fps 下约每秒 960 步,所以花纹能在几秒内长开。
- 四边环绕相接:纹理 wrap 设为
REPEAT,所以存下来的图可以无缝平铺当壁纸。 - 浮雕光照:把 B 的浓度梯度当法线,加一盏斜上方的灯,让平面图案有厚度感。
- 涂抹注入:迭代着色器里直接叠一个笔刷项,指针位置半径内把 B 拉到 1、A 压到 0.15。
- 原项目:keijiro/RDSystem —— Keijiro Takahashi 用 Unity CustomRenderTexture 实现的反应扩散系统,324 star / 28 fork(2026-08 数据), 以 Unlicense(公共领域)释出。法律上不要求署名,本站照样署名。 原项目必须装 Unity 编辑器才能看到花纹演化;本站把同一个模型搬进浏览器。
- A. M. Turing (1952), The Chemical Basis of Morphogenesis, Philosophical Transactions of the Royal Society B, 237(641), 37–72.
- P. Gray & S. K. Scott (1983, 1984), 连续搅拌槽反应器中自催化反应的自持振荡与多稳态, Chemical Engineering Science —— 本模型的化学原型。
- J. E. Pearson (1993), Complex Patterns in a Simple System, Science, 261(5118), 189–192 —— 第一次系统给出 F–k 参数平面上的图案分类。
模型本身是公开的成熟算法,不存在版权归属;本站代码以 MIT 释出。