旋转 UV

11 / 14
让 UV 围绕中心随时间旋转。

画面里的颜色图案在不停地旋转,像一个转动的风车。实现它用了一个旋转矩阵:

下面拆解每个部分。


围绕中心旋转的技巧

直接旋转 vUv 会绕左下角旋转,画面会跑偏。

正确的方式是:

  1. p = vUv - 0.5:把坐标原点从左下角移到画面中心
  2. p = rot(u_time) * p:绕中心旋转
  3. uv = p + 0.5:把原点移回去

这样旋转就围绕画面中心进行。


旋转矩阵是什么

旋转矩阵是一个 2x2 的数学工具,把一个二维坐标旋转角度 a

把矩阵乘以坐标向量,就得到旋转后的新坐标。u_time 作为角度传入,随时间增大,旋转就持续进行。


旋转后的颜色从哪来

把旋转后的 uv.xuv.y 直接用作红色和绿色通道。坐标本身就是颜色,旋转坐标就等于旋转颜色图案。


试着改一改

改动效果
rot(u_time * 2.0)旋转速度加倍
rot(-u_time)反向旋转
rot(u_time * 0.2)非常缓慢的旋转
vec3(uv.x, uv.y, sin(u_time) * 0.5 + 0.5)蓝色通道随时间闪烁

练习

练习区的颜色图案是静止的,在 p = rot(u_time) * p 这行代码的 TODO 处加上旋转,让图案随时间转动起来。

答案解析

  • rot(u_time) 生成一个角度为 u_time 的旋转矩阵
  • rot(u_time) * p 把坐标 p 旋转该角度
  • 随着 u_time 增大,旋转角度持续增大,图案持续旋转

起始代码缺少 p = rot(u_time) * p 这一行,坐标 p 从未被旋转。加上这行后,每帧的坐标都被旋转了更多角度,图案就转起来了。

试着把 rot(u_time) 改成 rot(sin(u_time)),旋转角度会在正负方向来回摆动,图案会左右摇摆而不是持续转圈。

GLSL 代码编辑器

正确代码预览

当前代码预览