🌨️ 一、项目简介:用程序做一场雪
在自然界里,雪花从空中飘落,触地后逐渐堆积成雪层。
而在 TouchDesigner 里,我们也可以用图像计算的方式重现这种现象。
Paka12 的做法很巧妙:
他用两张纹理(Texture)来分工:
| 名称 | 作用 |
|---|---|
| Falling Texture | 表示正在下落的雪花 |
| Deposit Texture | 表示已经堆积在地面的雪层 |
这两个图层在每一帧中相互作用,逐渐生成逼真的雪花堆积效果。
🧱 二、核心思路:两个纹理的对话
整个系统其实是一种「像素级物理模拟」。
简化后可以理解为以下逻辑:
-
生成一些雪花点(白色像素)
-
让这些点向下移动(重力效果)
-
检查它们是否“碰到”地面或雪堆
-
碰到后停下,并更新雪层
这个过程通过 反馈(Feedback) 持续进行,像一个不断刷新的世界。
⚙️ 三、实现步骤(TouchDesigner 操作)
1️⃣ 建立基础分辨率
创建一个 Constant TOP,设置:
-
分辨率:128 × 128
-
颜色:全黑(初始积雪为空)
这相当于我们的“世界背景”。
2️⃣ 生成下落雪花(Noise + Threshold)
创建一个 Noise TOP:
-
尺寸:32 × 32
-
输出:单通道(Monochrome)
-
打开 Random GPU 提高变化性
再接上 Threshold TOP(阈值):
-
设定阈值 0.9
→ 只保留接近白色的像素(即雪花)
🔹 这样我们就得到了「随机飘落的雪点」。
3️⃣ 模拟下落(Transform + Time)
接着给雪花添加“重力”:
添加 Transform TOP,在 Translate Y 中输入:
或简化为:
每帧下降 1 像素。
并将 Extend Mode 设为 Repeat,
让画面循环滚动,就像雪从上方不断飘进来。
4️⃣ 引入 Feedback 实现“堆积记忆”
真实世界的雪会“留在地上”,不会消失。
在 TouchDesigner 里,我们用 Feedback TOP 来实现这种“记忆”。
步骤:
-
创建
Feedback TOP -
输入为积雪纹理(Deposit)
-
输出回到自己(形成循环)
-
加入
Keyboard In TOP,按键可重置场景
反馈机制的作用是:
保留上一帧的积雪状态,并在下一帧继续叠加。
5️⃣ 检测雪花是否触地(Composite Multiply)
为了判断雪花是否接触地面,我们需要一个“地面检测”:
-
用
Rectangle TOP在底部生成一条白线。 -
使用
Composite TOP,模式设为 Multiply(相乘),
将「雪花图」与「地面图」相乘。
这样得到的结果是:
只有两者都为白的像素(雪花碰到地面)才会显示为白。
🧮 数学解释:像素检测逻辑
这一步其实是一个非常典型的数学操作:
R(x,y)=F(x,y)×D(x,y)R(x, y) = F(x, y) \times D(x, y)
其中:
-
F(x,y)F(x, y):雪花层像素(0 或 1)
-
D(x,y)D(x, y):地面层像素(0 或 1)
-
R(x,y)R(x, y):结果层(1 表示接触)
👉 当两个像素都为 1 时,乘积为 1 —— 这就代表「雪花落地」。
6️⃣ 把雪花“放到地上”(Transform + Composite Maximum)
接触检测只是“知道哪里落地了”,
接下来要把雪花“堆”上去。
操作:
-
Transform TOP→ Y 向上平移 1 像素(-1) -
用
Composite TOP的 Maximum 模式
将此图与积雪层合并。
这样新的雪花会“叠在”旧雪堆上,
再反馈回系统形成永久积雪。
7️⃣ 防止雪花穿透地面(Invert Mask)
真实雪不会穿过地面,所以要清理掉地面以下的雪花。
做法:
-
对积雪图像使用
Level TOP,Invert(反相) -
再用
Composite TOP(Multiply)
将反相图当作遮罩去乘下落雪花层。
数学逻辑如下:
F′(x,y)=F(x,y)×(1−D(x,y))F'(x, y) = F(x, y) \times (1 – D(x, y))
👉 只保留「积雪上方」的雪花。
8️⃣ 添加红色接触点标记(可选)
为了可视化接触点,可以把新落地的像素标为红色:
-
使用
Reorder TOP调整通道顺序(让 R 为主) -
在
Level TOP中降低 G/B -
再用
Composite (Over)叠加在积雪图上
这样你就能看到每一帧落地的红色雪点。
9️⃣ 模拟雪花“扩散”:模糊代替物理扩散
Paka12 没有做复杂的物理模拟,而是用了一个聪明的简化:
使用 Blur TOP 模糊积雪,让雪自然摊开。
模糊其实是一种数学卷积操作:
I′(x,y)=∑i=−rr∑j=−rrI(x+i,y+j)⋅K(i,j)I'(x, y) = \sum_{i=-r}^{r}\sum_{j=-r}^{r} I(x+i, y+j) \cdot K(i, j)
其中:
-
K(i,j)K(i,j) 是模糊核(例如高斯函数)
-
rr 是模糊半径
模糊越强,积雪越“软”,边缘也更自然。
🔟 最终效果
当以上模块全部连接起来:
-
雪花随机生成 → 缓慢下落
-
接触地面后停留 → 持续堆积
-
积雪形状被模糊 → 柔和自然
🎬 最终你会看到一场不断落下、缓缓积累的程序化雪景。



暂无评论内容