
本文详解如何使用 p5.js 创建类似生物组织蠕动、细胞蔓延的「液态文字」效果,核心基于 metaballs(元球)原理,并结合 texttopoints 高效采样文字轮廓,实现可交互、可扩展的有机变形文本动画。
本文详解如何使用 p5.js 创建类似生物组织蠕动、细胞蔓延的「液态文字」效果,核心基于 metaballs(元球)原理,并结合 texttopoints 高效采样文字轮廓,实现可交互、可扩展的有机变形文本动画。
你看到的 Yale 和 Martin Groch 等设计师作品中那种文字如霉菌生长、细胞分裂般「呼吸、蔓延、融合」的视觉效果,专业术语称为 Metaballs(元球)——一种基于势场叠加的隐式建模技术。它不依赖网格或像素检测,而是通过数学函数(如反平方衰减或高斯核)定义每个粒子的影响范围,当多个粒子势场叠加超过阈值时,便自然形成平滑连通的有机形变区域,完美模拟黏液、菌落或软组织的动态边界。
✅ 推荐实现路径:textToPoints + Metaballs 渲染
原始代码使用 graphics.loadPixels() 扫描文字位图来判断粒子起始位置,效率低且易受抗锯齿干扰。更优雅的方式是利用 p5.js 内置的 textToPoints() 方法,直接获取文字轮廓上的精确采样点:
let font;
let points = [];
function preload() {
font = loadFont('https://fonts.googleapis.com/css2?family=Inter&display=swap'); // 或本地字体文件
}
function setup() {
createCanvas(1000, 600);
colorMode(HSB, 360, 100, 100, 1);
noStroke();
// 生成文字轮廓点集(高精度采样)
points = font.textToPoints('METABALLS', 100, 300, {
sampleFactor: 0.1, // 值越小点越密(0.05~0.2 推荐)
simplify: 0.5 // 简化冗余点(0~1)
});
}
function draw() {
background(220, 15, 95);
// 动态渲染 Metaballs 效果
for (let y = 0; y 0.8) {
fill(200, 80, 90, 0.7);
rect(x, y, 2, 2);
}
}
}
}
? 关键说明:sum > 0.8 是等值面阈值(isovalue),调高则形态更紧凑,调低则更“融化”。radius 引入 Perlin noise 实现有机脉动,使每个点具备独立生命周期感。
⚠️ 注意事项与优化建议
-
性能瓶颈:嵌套循环遍历全画布 + 所有点 → O(W×H×N) 复杂度。生产环境建议:
Json Schema Toolkit下载使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
- 使用 createGraphics() 缓存静态背景;
- 限制 points 数量(textToPoints(...).slice(0, 200));
- 改用 WebGL 模式(createCanvas(w,h,WEBGL))配合 shader 加速(参考 Metaballs GLSL 实现)。
字体兼容性:textToPoints() 仅支持已加载的 p5.Font 对象,务必在 preload() 中加载;系统字体需转为 .woff 并托管。
交互增强:可绑定 mousePressed() 动态添加新点,或用 lerp() 平滑过渡不同文字形状,实现“文字生长”叙事效果。
风格延伸:若追求更抽象的“蔓延感”,可将 points 替换为扩散的粒子系统(如细菌趋化模型),再以 Metaballs 渲染其密度场——这正是链接中 CodePen 示例的核心逻辑。
掌握 Metaballs 不仅能复刻此类艺术效果,更是理解计算美学中「涌现」「连续性」「软边界」等概念的绝佳入口。从一行 textToPoints() 开始,让文字真正活起来。










