跳转到内容

反应扩散原理与参数手册

回到 实时演化画布 →

两种物质在一张纸上互相反应、同时各自扩散。只要扩散速度不一样, 原本均匀的一锅汤就会自己失稳,长出稳定的空间花纹。 这套机制叫图灵不稳定性,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.0D_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 年那篇论文里给出的成花纹条件。

把方程的空间项去掉,求均匀定态 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,花纹种类就整个换掉。

下表是本站预设按钮里的九组值,每一组我都在这个站上实际跑过并截图确认过形态。 分类命名沿用 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/拉普拉斯算子一起给才有意义,单独抄数字很容易踩空。

  • 双缓冲浮点纹理:两张 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 释出。