Raymarching SDF模型眨眼的小实现

Number of views 188

image1741184711431.png

image1741184759801.png

眨眼有很多实现方法,下面介绍通过简单的算法来实现该功能。

先介绍下shader中的 mod函数

float mod(float x, float y) {
    return x - y * floor(x / y);
}

函数所返回的结果直接上图,下图为 mod(x, 6)的结果:

image1741183805564.png

可以看到mod的计算结果与frac函数类似,只不过frac函数返回0~1的区间,而 mod(a, b)返回0 ~ b的区间。

根据这个特性,我们可以把shadertoy中的iTime代入。得到的结果会从0 ~ 6往复运动,即从0 ~ 6经历6秒。

image1741184492402.png

了解这个特性后,我们可以结合smoothstep函数进行眨眼的动画实现:

float s = mod(iTime, 6)
float sm = smoothstep(0, 0.1, s)-smoothstep(0.18, 0.2, s)

image1741185082358.png

image1741185432190.png

上述的代码也就是间隔 5.8s会眨一次眼睛。要缩短间隔可以把mod函数的第二个参数改小。眨眼示例代码如下

float stepAnim = mod(iTime, 4.);
float animEyelid = smoothstep(0.1, 0.2, stepAnim)-smoothstep(0.28, 0.35, stepAnim);
float topEyelid = max(eyelid, dot(ap-vec3(0., 1.33-animEyelid*0.07, 0.), normalize(vec3(0., -1., 0.))));
float bottomEyelid = max(eyelid, dot(ap-vec3(0., 1.2+animEyelid*0.05, 0.), normalize(vec3(0., 1., 0.))));
0 Answers