用程序让雪花自然下落与堆积(Let it Snow 解析)

用程序让雪花自然下落与堆积(Let it Snow 解析)

🌨️ 一、项目简介:用程序做一场雪

在自然界里,雪花从空中飘落,触地后逐渐堆积成雪层。
而在 TouchDesigner 里,我们也可以用图像计算的方式重现这种现象。

Paka12 的做法很巧妙:
他用两张纹理(Texture)来分工:

名称 作用
Falling Texture 表示正在下落的雪花
Deposit Texture 表示已经堆积在地面的雪层

这两个图层在每一帧中相互作用,逐渐生成逼真的雪花堆积效果。


🧱 二、核心思路:两个纹理的对话

整个系统其实是一种「像素级物理模拟」。
简化后可以理解为以下逻辑:

  1. 生成一些雪花点(白色像素)

  2. 让这些点向下移动(重力效果)

  3. 检查它们是否“碰到”地面或雪堆

  4. 碰到后停下,并更新雪层

这个过程通过 反馈(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 中输入:

 
-absTime.frame * 1

或简化为:

每帧下降 1 像素。

并将 Extend Mode 设为 Repeat
让画面循环滚动,就像雪从上方不断飘进来。


4️⃣ 引入 Feedback 实现“堆积记忆”

真实世界的雪会“留在地上”,不会消失。
在 TouchDesigner 里,我们用 Feedback TOP 来实现这种“记忆”。

步骤:

  1. 创建 Feedback TOP

  2. 输入为积雪纹理(Deposit)

  3. 输出回到自己(形成循环)

  4. 加入 Keyboard In TOP,按键可重置场景

反馈机制的作用是:

保留上一帧的积雪状态,并在下一帧继续叠加。


5️⃣ 检测雪花是否触地(Composite Multiply)

为了判断雪花是否接触地面,我们需要一个“地面检测”:

  1. Rectangle TOP 在底部生成一条白线。

  2. 使用 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)

接触检测只是“知道哪里落地了”,
接下来要把雪花“堆”上去。

操作:

  1. Transform TOP → Y 向上平移 1 像素(-1)

  2. Composite TOPMaximum 模式
    将此图与积雪层合并。

这样新的雪花会“叠在”旧雪堆上,
再反馈回系统形成永久积雪。


7️⃣ 防止雪花穿透地面(Invert Mask)

真实雪不会穿过地面,所以要清理掉地面以下的雪花。

做法:

  1. 对积雪图像使用 Level TOPInvert(反相)

  2. 再用 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️⃣ 添加红色接触点标记(可选)

为了可视化接触点,可以把新落地的像素标为红色:

  1. 使用 Reorder TOP 调整通道顺序(让 R 为主)

  2. Level TOP 中降低 G/B

  3. 再用 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 是模糊半径

模糊越强,积雪越“软”,边缘也更自然。


🔟 最终效果

当以上模块全部连接起来:

  • 雪花随机生成 → 缓慢下落

  • 接触地面后停留 → 持续堆积

  • 积雪形状被模糊 → 柔和自然

🎬 最终你会看到一场不断落下、缓缓积累的程序化雪景。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容