大屏天气镜头

销售大屏 · 天气镜头(概念演示 · 第二版)

按门店所在城市的天气实况:3D 地图里下雨、刮风、下雪、起雾、起霾;镜头上挂水珠、成股流下,大风时树叶贴上镜头晃一阵被揭走,冷天镜头四周结冰。风向跟着实况走。顶部「天气」可以关。以下是示意数据。

实况 14:15晴 东北风 2 级 · 22℃

水珠怎么做的

照业内成熟的做法(Codrops · Lucas Bebber 的 RainEffect、 Shadertoy · BigWings 的 Heartfelt): 下面的水珠行为是逐条照它们的源码移植的。

照 Codrops 原文和源码(raindrops.js、water.frag)移植,规律都照它:

  • 直接用它的:水珠贴图(drop-alpha.png、drop-color.png)、生成 255 档厚度的方法、画水珠的方法、着色器的取色方式,都是 Codrops 原样的(它的许可允许整合进自己的项目)。水珠截边后略下坠、上平下圆;里面是一张倒置、缩小、很糊的场景。
  • 为什么会往下掉:新雨点落在旧水珠上就合并,越并越大;每一帧按「半径越大越可能」被猛拉一下(表面张力抓不住了),拉多少也随机,动量很快衰减——所以是一顿一顿地往下走,不是匀速滑。
  • 扫下去:往下走的水珠碰到下面比它小的就吞掉(面积相加),吞完更快、并往被吞的那颗偏一点,于是一路把下面的水珠扫下去。
  • 留痕:走过的路上按动量留下小水珠(被拉长一点),自己缩一点;细水雾被抹出一道;小水珠慢慢干。
  • 跟风:往下走时按实况风在画面上的横向分量往下风带,水股斜着流;挂着不动的水珠不受影响。
  • 起雾(四周一圈、中间透明):三个参考都有——Codrops 的背景本身是糊的、raindrop-fx 有一层约 10 秒起满的雾、Heartfelt 写明「玻璃起雾、水珠划出痕」。雾面糊、水珠清(里面是一个清晰的小倒像)、划过的地方一道清痕,人眼靠这个反差认出「玻璃上的水」。这里雨天镜头慢慢蒙雾,水珠停留和滑过的地方擦清、再慢慢雾回去;只起在四周一圈、往中间渐淡,中间留透明(最浓处小雨约四成、大雨约七成),门店柱子始终看得清,字和数字不受影响;雨停后 5 秒左右散掉。
  • 雪花:落在镜头上的是六角对称的冰晶——星状枝晶、羊齿枝晶、六角片、扇形片,大雪时还有几片粘成的一团;每条臂长短略不齐,偶尔断一截。落上来先是清楚的晶体,然后边缘变软、细枝先化没、中间攒出一小摊冰水,最后缩成一颗水珠混进镜头上的水里;越冷挂得越久、化得越慢。
  • 明暗:取自另一个复刻 raindrop-fx(MIT)的合成着色器——按水珠法线加一层漫反射,背光一侧暗、迎光一侧略亮。Codrops 的水珠只做折射,靠亮背景才看得出;大屏是深色夜景,需要这一层。
  • 改了的参数:水珠半径从它的 20–50 改成 14–38(原版在大屏上挡视线,再小又没存在感);细碎小水珠照它的密度乘雨量;下流留下的小水珠一两秒就干;被水盖住的面积封顶(小雨约 2.5%、大雨约 7%),画面中间生成的少一半。

树叶、风向、雷暴、开关

  • 树叶是弯的 3D 叶片:横向微卷、沿主脉微折,程序画的高清纹理(主脉、侧脉、细网脉、斑点、叶缘锯齿、叶柄),逆光时叶脉透亮。贴在镜头上时边缘随阵风起伏,风大了先从上风一侧掀起,再整片被带走。
  • 风向按实况:风是「从哪边来」,世界里的雨、雪、落叶、雾都往下风走;镜头转到哪个角度,贴镜头的叶子就从画面里对应的上风一侧进来。实况标签里的小箭头是「按现在的视角,风往哪边吹」。
  • 雷暴只闪 3D 世界(远处一道闪电、全城一亮),镜头和文字不闪。
  • 顶部「天气」按钮一键开关,记在这台设备上;关掉后 2 秒内所有效果淡出。

实况 → 效果(规则)

实况判定(open-meteo 字段)3D 世界镜头
雨天气码 51–67、80–82;强度 = 降水 mm/h ÷ 8雨线(随风斜)、地面涟漪与湿反光小水珠铺满、大水珠成股流下;强度大时股数多、流得快
雷阵雨天气码 95–99同大雨 + 远处闪电、全城一亮不闪(只有水珠)
大风阵风 ≥ 25 km/h 开始,50 km/h 封顶;方向 = wind_direction_10m落叶、雨雪雾随风走叶子从上风侧飞来贴住、晃、被揭走;水股往下风斜
雾天气码 45 / 48,或能见度 visibility < 3 km低处一层薄雾随风飘,远处发白;近处门店始终看得清—
霾空气质量接口 pm2_5 ≥ 75(≥ 225 封顶)远处发黄发灰整体轻微发灰(最多降 20% 对比度)
雪天气码 71–77、85–86;强度 = 降雪 cm/h ÷ 2.5雪花飘落,地面与柱顶慢慢积白,停了慢慢化雪花落上来化成小水珠;四周轻微结冰
寒潮气温 ≤ 0℃,或 24 小时降温 ≥ 8℃画面偏冷四周结冰、冰下的画面发虚,越冷越往中间长,中间始终留出来

数据从哪来

按大屏城市中心的坐标取:天气用库存包已经在用的 open-meteo,只多问一组 current(天气码、降水、降雪、风速、阵风、风向、气温、能见度);霾用同一家的空气质量接口(pm2_5)。POS 接入的大屏快照带 weather 块,15 分钟一刷;取不到就当晴天,状态栏说一句。

还要你定的

  • 夜里看昨天时,天气用此刻的实况(建议)还是昨天的?
  • 效果的强度上限:演示里大雨时镜头上水股已经不少,在店里电视上要不要再收一档?