GLSL 内置函数
atan()
返回正切值为 y / x 的弧度角。双参数形式 atan(y, x) 给出一个点绕原点的完整角度,范围是 -PI 到 PI。
函数签名
float atan(float y, float x)
float atan(float y_over_x)
vec2 atan(vec2 y, vec2 x)参数
- y
- 纵向分量。注意它是第一个参数。
- x
- 横向分量。
返回值
弧度角。atan(y, x) 返回 -PI 到 PI;atan(y_over_x) 返回 -PI/2 到 PI/2。
在线示例
修改右侧代码,左侧预览会实时更新。
工作原理
length(p) 回答"这个像素离中心多远",atan(p.y, p.x) 回答"它在哪个方向"。两者合起来就是极坐标。
结果是弧度制的角度:
| 方向 | atan(y, x) |
|---|---|
| 右 | 0.0 |
| 上 | 1.5708(PI / 2) |
| 左 | 3.1416 或 -3.1416(PI) |
| 下 | -1.5708 |
a / 6.2831 + 0.5 把它换算成 0 到 1 的值,也就是转了一整圈的百分之多少。示例用它来选色相,得到一个色轮;再用 fract 重复 12 次,画出旋转的光线。
常见用法
- 放射状图案:光线、扇形、用
sin(a * petals)做花瓣。 - 极坐标:
vec2(length(p), atan(p.y, p.x))能把螺旋和圆环变成简单的直线问题。 - 指向某个目标:计算像素和目标点之间的角度。
常见错误
- 参数顺序写反。是
atan(y, x),y 在前。 - 需要完整角度时用了单参数形式。
atan(p.y / p.x)分不清左右,在竖直轴上还会除以 0。 - 调用
atan(0.0, 0.0)。结果未定义,正中心那个像素可能闪烁。 - 以为角度是连续的。角度在左侧从 PI 跳到 -PI,基于它的图案要重复整数次,才不会出现明显的接缝。