角度可视化

1 / 18
练习着色器中常用的数学基础积木。

atan(y, x) 能算出一个点相对于原点的方向角,把它归一化后就能驱动颜色,关键代码是:

下面拆解这两步的含义。


atan 返回什么

atan(y, x) 是极坐标里的角度函数,它返回从正 x 轴(右侧)出发,逆时针到向量 (x, y) 的角度,单位是弧度:

  • 正右方(3点钟)→ 0
  • 正上方(12点钟)→ +π/2(约 1.57)
  • 正左方(9点钟)→ +π 或 -π(边界)
  • 正下方(6点钟)→ -π/2(约 -1.57)

范围是 [-π, +π],中间有个跳变(从 +π 跳到 -π)。


归一化到 [0, 1]

加上 π 把范围从 [-π, π] 变成 [0, 2π],再除以 2π 压缩到 [0, 1]。这样整个圆圈:

  • 正右方(3点钟)→ t = 0.5
  • 逆时针转一圈 → t 从 0 平滑增加到 1

用这个 t 做灰度输出,就能看到一个围绕中心旋转的灰度角度轮。


试着改一改

改动效果
t 代替灰度,改成 mix(vec3(1,0,0), vec3(0,0,1), t)从红色到蓝色的色相环
p = uv - 0.5 里的 0.5 改为 0.3圆心偏移,角度轮跟着移动
t 乘以 3.0 再取小数 fract(t * 3.0)角度分成 3 段重复
加上 u_time * 0.3 让角度随时间旋转画面不断旋转

练习

练习代码中坐标已经居中到 p,但 at 都还没计算。补全这两行,让画面输出一个从 0 到 1 的灰度角度轮。

答案解析

起始代码里 t 未定义或为 0,画面全黑。

atan(p.y, p.x) 计算每个像素相对于画布中心的方位角,范围 [-π, π]。加 π 后变成 [0, 2π],除以 2π 得到 [0, 1]。每个像素的 t 值就是它在圆上的相对位置,所以灰度图像呈现出一个绕中心平滑变化的角度轮盘。

试着把 gl_FragColor = vec4(vec3(t), 1.0) 换成 vec4(t, 1.0-t, 0.5, 1.0),看看彩色角度轮的效果。

GLSL 代码编辑器

正确代码预览

当前代码预览