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
    评论
好的,以下是用Matlab画出该电场的代码,注释中有详细的说明: ```matlab % 定义常数 n0 = 120 * pi; % 自由空间电导率 e0 = 8.85 * 10^(-12); % 真空介电常数 a = 1; % 区域长度 b = 0.5; % 区域宽度 % 定义网格 x1 = linspace(0, a, 100); % 第一个区域的x坐标 y1 = linspace(-b, b, 100); % 第一个区域的y坐标 [x1, y1] = meshgrid(x1, y1); % 生成网格矩阵 x2 = linspace(-a, 0, 100); % 第二个区域的x坐标 y2 = linspace(-b, b, 100); % 第二个区域的y坐标 [x2, y2] = meshgrid(x2, y2); % 生成网格矩阵 % 计算电场 Ex1 = (n0 * sinh(2 * pi * a / b) / sinh(3 * pi * a / b) / e0) .* cos(pi .* x1 / a) .* sinh(pi .* (y1 - b) / a); % 第一个区域的x方向电场分量 Ey1 = (n0 * sinh(2 * pi * a / b) / sinh(3 * pi * a / b) / e0) .* cos(pi .* x1 / a) .* sinh(pi .* (y1 + b) / a); % 第一个区域的y方向电场分量 Ex2 = -(n0 * sinh(pi * a / b) / sinh(3 * pi * a / b) / e0) .* cos(pi .* x2 / a) .* sinh(pi .* (y2 - b) / a); % 第二个区域的x方向电场分量 Ey2 = -(n0 * sinh(pi * a / b) / sinh(3 * pi * a / b) / e0) .* sin(pi .* x2 / a) .* cosh(pi .* (y2 + b) / a); % 第二个区域的y方向电场分量 % 画图 figure; % 新建画布 quiver(x1, y1, Ex1, Ey1); % 画第一个区域的电场矢量图 hold on; % 后续的图像都在同一画布上显示 quiver(x2, y2, Ex2, Ey2); % 画第二个区域的电场矢量图 axis equal; % 设置坐标轴比例相等 xlabel('x'); % 设置x轴标签 ylabel('y'); % 设置y轴标签 title('Electric Field'); % 设置图像标题 ``` 运行以上代码即可得到该电场的矢量图。您可以根据需要调整网格数量、区域大小等参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值