石落清池
三维水波纹实验:点击水面投下鹅卵石,看涟漪在池壁间来回反弹;转动齿轮调节光晕,还有实时合成的水声、齿轮声和一首 AI 作曲的背景音乐。
怎么玩
- 投石:点击水面,一颗鹅卵石从空中落下,溅起水花,推出一圈圈涟漪,再慢慢沉到池底。石头会越积越多,点左下角的「清空」可以全部捞走。
- 光晕:按住右下角的黄铜齿轮顺时针拖动,光晕变强;逆时针拖动,光晕变弱。齿轮外圈的小灯显示当前强度,松手后齿轮还会靠惯性转一会儿。
- 声音:浏览器规定页面要先有一次点击才能出声。「音效」开关水声和齿轮声,「音乐」播放背景音乐《涟漪》。
- 键盘:先点一下画面,或用 Tab 键选中它;按回车或空格投石,按左右方向键转动齿轮。
是怎么做的
整个场景用 three.js 在浏览器里实时渲染,没有加载任何图片、模型或音频文件。
- 水面:在 GPU 上逐格求解二维波动方程。池壁是反射边界,所以涟漪会在四壁之间来回反弹、彼此叠加。水面着色器同时计算反射(镜像相机渲染的倒影)、折射(随水深偏移的水下画面)和水对红、绿、蓝三色光的不同吸收(越深越偏青绿),再按菲涅耳公式混合。阳光照在波面上的高光交给 Bloom,泛出光晕。
- 焦散:把阳光穿过起伏水面后的折射光线投到池底,比较投影前后的面积,光线汇聚的地方就是池底那些晃动的亮纹。
- 鹅卵石:每颗石头都是随机捏出来的椭球,斑点、条纹和颗粒都由着色器里的噪声函数实时生成;入水后颜色变深、表面发亮,像真的湿了一样。下沉时受水的阻力,左右摇摆着飘落,最后平躺在池底,也能叠在别的石头上。
- 水花与气泡:入水瞬间溅起一圈水珠,随后中心冒出一小股水柱;水珠落回水面,又激起一圈圈小涟漪。石头带下去的空气变成气泡,浮到水面破掉。
- 声音:全部用 Web Audio 实时合成。入水的“咕咚”是音高快速上滑的正弦波(模拟气泡共振),再加一阵水花噪声;齿轮的“咔哒”是极短的噪声脉冲加上金属共鸣。
背景音乐《涟漪》
由 AI(Claude)作曲并编配:D 大调五声音阶,每分钟 72 拍,引子之后按 A、B、A′、尾声循环。旋律稀疏、留白多,长音上带古筝式的揉弦和上滑音,像一颗颗落进水里的石子。
音乐同样在浏览器里实时合成:拨弦用 Karplus-Strong 弦振动算法生成,铺底和弦、低音和偶尔响起的“水滴”钟声都由振荡器合成。每一遍循环里,伴奏的细节都略有不同。