又是好久没见啊。作为一个苦力运维工程师,总是要被动的去做很多事情。想要喝杯茶学学Shader真不容易啊。今天继续学习一些函数绘图,本文讨论一个稍微复杂的函数Smooth. 在物理世界中,存在很多平滑的曲线,而不是尖锐的直角。而在苹果的设计IPHONE7之后引入了一个叫做G2连续的工业设计概念。再比如IQ大神写的下面这个Shader觉得这个球很丝滑的融入到平面中。 所以什么是丝滑,他有没有明确的数学定义,公式是什么呢?
光滑Smooth的直观感受
shadertoy: www.shadertoy.com/view/X3GGD3
在CSS中, border-radius 属性可以为元素的边框加一个圆角, 带来的感受是一个边没有立即转变到另外一个边,而是丝滑的转变。
而在下面这个图中,左边的矩形与圆形的结合并不是生硬的,而是有一个丝滑的过度。就好像一滴水融入了水面。 而右边的矩形与圆形的结合便是用到了之前学习的 SDF_UNION 操作。
如果还不够明显,可以看看IQ博客中给出两个图,左边的人偶使用的不smooth的union操作,右边的人偶使用的是smooth的union操作。
光滑Smooth到底是什么?
从iOS 7开始,苹果更新了自家产品标志性的圆角图标轮廓,将工业设计中常用的曲率连续变化的概念应用到视觉层面,app图标从简单的圆角矩形(G1连续)转变为看起更顺滑的圆角矩形(G2连续)使得整个iOS系统的设计感都得到了提升,让用户看着更舒服。
所以在工业界本来就有对Smooth的数理定义和等级划分,详细可以参考WIKI. 我们常常说的光滑其实是 Geometric continuity 几何连续。 一个曲线或曲面可以被描述为具有 Gn 连续性,n 是表示光滑度的增量,即在曲线上取一点,然后分析该点与其两侧线段的关系。
- G0: 两侧曲线在这一点相遇(位置连续)。
- G1: 两侧曲线这一点的切线方向相同(相切连续)。
- G2: 两侧曲线在这一点的曲率相同(曲率连续)。
上面G0很好理解两个线只要连接了,那就是G0连续,我们的直角矩形就是G0连续, G1连续也比较好理解,以CSS或者IPHONE7以前的圆角矩形为例,直角边与圆角的切线是一条,那就是G1连续
如果用法向量来表示, 法向量的方向不会出现瞬间跳跃
数理定义
不过上面的图,都是一些感受上的东西,如果我们想要在Shader中使用他们,必须要用数学去定义并推导。 这里会补回忆一些数学基础知识, 因为笔者有10多年没碰过数学了,这里的内容有许多应该是非常基础的。
连续
在wiki的丝滑定义中,提到了位置连续,相切连续和曲率连续。 可是连续是什么呢? Continuity of real functions is usually defined in terms of limits. A function f with variable x is continuous at the real number c, if the limit of 𝑓(𝑥),as x tends to c, is equal to 𝑓(c)
连续要求两个相近的x, 其f(x)的值也一样。
切线
曲线 y=f(x) 在其上一点 P(x, y)处的切线PT是割线PQ, 当动点Q沿此曲线无限接近于点P时的极限位置。由于割线PQ的斜率为
因此当 时如果的极限存在,则极限
即为切线PT的斜率, 同时考虑一个特殊情况,如果f(x)在处单侧导数不存在,但是都趋近于 或者 ,那么 在 处有平行于y轴的垂直切线
曲率
曲率: 衡量曲线弯曲程度的量
曲率的影响因素为: 弧长和切线转角
曲率公式推导
曲率k的定义为
根据以上定义推导任意函数的曲率公式的过程如下 的推导
的推导
在套用曲率定义可以得到, 对于函数y=f(x), 其曲率为
曲率圆
圆的曲率公式推导如下,其值为圆半径的倒数

弧长=圆心角 乘 半径
于是有一个概念叫做曲率半径和曲率圆。 曲率半径为曲率的倒数,过曲线的某一点做出一个圆,这个圆与曲线在该点处有公共切线,且曲率相等且凹凸方向相同,即称这个圆为该曲线在点的曲率圆。
geogebra: www.geogebra.org/classic/rwh…

曲率梳
分析曲率的时候经常用到下面的工具,曲线转的越快,曲率梳越大,反之曲率梳越平坦

reference
- iq smoothstep shader : www.shadertoy.com/view/st2BRd
- iq smoothstep blog: iquilezles.org/articles/sm…
- the book of shader: thebookofshaders.com/05/
- The Continuity of Splines www.youtube.com/watch?v=jvP…
- The Continuity of Splines 中文 www.bilibili.com/video/BV1Pr…
- the art of code: www.youtube.com/watch?v=YJ4…
- the art of code: www.youtube.com/watch?v=60V…
- 3blue1brown www.youtube.com/watch?v=9vK…
- 曲率: www.bilibili.com/video/BV1BG…
- 从圆角到圆角: zhuanlan.zhihu.com/p/29560646