CG cosh, exp, sinh, smoothstep, tanh, perlin_easeCurve1/2 曲线

xxxh
中的h==>hyperbolic:双曲线的意思


cosh

// see: https://developer.download.nvidia.cn/cg/cosh.html
float cosh(float x)
{
  return 0.5 * (exp(x)+exp(-x));
}

0.5 ∗ ( e x p ( x ) + e x p ( − x ) ) 0.5 * (exp(x)+exp(-x)) 0.5(exp(x)+exp(x))

在这里插入图片描述


为何叫双曲线

因为exp(x)就是一个曲线,而cosh中有exp(x)与exp(-x),所以就是两个(双)曲线咯


exp(x)曲线

e x p ( x ) exp(x) exp(x)
在这里插入图片描述

exp(-x) 曲线

e x p ( − x ) exp(-x) exp(x)
在这里插入图片描述

exp(x)+exp(-x) 两曲线叠加

e x p ( x ) + e x p ( − x ) exp(x)+exp(-x) exp(x)+exp(x)
在这里插入图片描述
在这里插入图片描述

调整x=0时,y=0

e x p ( x ) + e x p ( − x ) − 2 exp(x)+exp(-x)-2 exp(x)+exp(x)2
在这里插入图片描述

调整x=-2 or 2时,y=1

( e x p ( x ) + e x p ( − x ) − 2 ) ∗ ( 1 / e x p ( x ) + e x p ( − x ) − 2 ) (exp(x)+exp(-x)-2)*(1/exp(x)+exp(-x)-2) (exp(x)+exp(x)2)(1/exp(x)+exp(x)2)
==>
∵ c u r v = ( e x p ( x ) + e x p ( − x ) − 2 ) \because curv=(exp(x)+exp(-x)-2) curv=(exp(x)+exp(x)2)
∵ i n v C u r v = 1 / c u r v \because invCurv=1/curv invCurv=1/curv
∴ 1 = c u r v ∗ i n v C u r v \therefore 1=curv*invCurv 1=curvinvCurv

在这里插入图片描述


exp(-x*x)

2022/07/14 再补充一条曲线
因为在制作 SSS 时,看到别人的代码中有一曲线

half3 Transmittance(half transmittanceMask, half3 sssColor, half3 lightDir, half3 normal, half3 viewDir)
{
	half3 lll = normalize(lightDir + normal * 0.1f);
	half VdotL = saturate(dot(viewDir, -lll));
	half thickness = 1.0f - (VdotL * transmittanceMask);
	
	//return exp((thickness) * half3( -8, -40, -64 ) ); // ref
	return exp(-(thickness * thickness)) * sssColor * (1.0 - thickness);
}

其中留意:exp(-(thickness * thickness))
在这里插入图片描述

单独查看:exp(-x*x
在这里插入图片描述


sinh

float sinh(float x)
{
  return 0.5 * (exp(x)-exp(-x));
}

在这里插入图片描述
在这里插入图片描述


smoothstep

smoothstep(min,max,x)

它的公式如下:
s m o o t h s t e p ( x ) = − 2 ⋅ ( x − m i n m a x − m i n ) 3 + 3 ⋅ ( x − m i n m a x − m i n ) 2 smoothstep(x)=-2 \cdot (\frac{x-min}{max-min})^3+3 \cdot (\frac{x-min}{max-min})^2 smoothstep(x)=2(maxminxmin)3+3(maxminxmin)2

代码是在公式的基础上优化了写法的,可读性会差非常的多!

float smoothstep(float a, float b, float x)
{
    float t = saturate((x - a)/(b - a));
    return t*t*(3.0 - (2.0*t));
}

在这里插入图片描述
在这里插入图片描述


tanh

float tanh(float x)
{
  float exp2x = exp(2*x);
  return (exp2x - 1) / (exp2x + 1);
}

在这里插入图片描述
tanh 的头部过渡速度比较快,中,尾部比较缓慢
一般比较多的动画也会用到类似的曲线


perlin noise ease curve 1

3 ( t 2 ) − 2 ( t 3 ) 3(t^2)−2(t^3) 3(t2)2(t3)可见perlin noise中初版的平滑插值,与smoothstep非常相似

3(t^2)2(t^3)

在这里插入图片描述


perlin noise ease curve 2

6 ( t 5 ) − 15 ( t 4 ) + 10 ( t 3 ) 6(t^5)−15(t^4)+10(t^3) 6(t5)15(t4)+10(t3)

6(t^5)15(t^4)+10(t^3)

在这里插入图片描述
curve 2比curve 1的头尾过渡比较缓慢,也就是说作数值过渡会比较饱满的头尾,中部过渡比较快一些


Summary

其实我们在很多平台的动画库(tween)都会有类似的插值过渡算法


excel 文件

cosh_sinh_smoothstep_tanh_perlinEaseCurve1&2.xlsx 提取码: dxnr


References

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值