Smoothstep/平滑--Length/Distance 长度/距离的应用?【Ben图形/15.16】
节点教程Game艺视界原创 14889 0
实名

通过了实名认证的内容创造者

发布于 2022-3-21 21:32:14

您需要 登录 才可以下载或查看,没有账号?注册

x
本期内容
今天我们将看看 虚幻和unity中的平滑步节点,好吧,这是平滑步节点,这个节点用于平滑地打开和关闭, 所以在这个视频中 我们要做的第一件事是看看平滑阶跃函数背后的数学 ,理解数学很重要,这样你才能知道它是如何工作的以及它在幕后做了什么。

019b7963156f9a31cabf8f887015a62c.png

背后的数学公式(视频中有讲解00:48秒开始)

3fdc620d917a7ebd07d9c7eb70fe9f91.png


让我们在虚幻和unity中看看效果,我有一个unity的例子, 我们已经得到了我们的 uv 坐标我只是使用 x 坐标我正在使用它,因为 x 坐标给了我们一个很好的从左到右的平滑渐变就像我们在desmos图中看到的 x 值一样现在计算器,如果我把这里得到的这个 x 值连接到平滑的步骤中,你可以在视觉上看到与我们的曲线相同的事情

现在我在这里的区别是我有另外两个控件(0.4、0.5),我可以控制在哪里慢进和慢出发生所以我的混合只会发生在 0.4 和 0.5 之间的狭窄范围内,您可以在此节点预览中看到它就在那里发生,所以我一直保持黑色,直到我的渐变值达到0.4然后在 0.4 和 0.5 之间我做得很好很慢 进入并减速 ,然后在 0.5 之后我固定为1值,因此它将从第一个输入值处的零变为第二个输入值处的1,我可以再次使用我的平滑步骤来打开和关闭效果

我们来看看虚幻中效果,我有我的纹理坐标节点,这引入了我的u和v坐标然后我使用组件遮罩节点来获取红色通道或仅使用u组件来为我提供相同的从左到右渐变,在unreal情况下, 因为我只有一个通道它将它表示为红色,但是我们真的知道这只是黑白数据与我们在unity中看到的相同,所以如果我将它连接到我的平滑步骤节点,如果我给它最小的零和最大的一个你可以看到它平滑了我的在开始和在梯度最后

然后再次如果我缩小这些值,让我们在 0.6 和 0.7 之间进行,这次你可以在我的预览中看到我在渐变的开头有很大一部分是黑色的。但是一旦我得到一个值0.6它开始上升并在它完成之前平滑到0.7的值所以这就是平滑步骤的工作原理。我们基本上是打开和关闭我们的渐变值,我们能够指定打开发生的位置或开始转动的位置

让我们看几个例子或我们可以使用 smoothstep的方法这里是我们在这个例子中的第一个例子我们正在创建一个溶解效果

你可以在这里看到它而不是使用uv输入这次我们使用时间作为我们的输入,我们使用时间的正弦,然后我们稍微调整范围,时间的正弦范围是负一比一
(视频08:36分)你可以看到它慢慢地填充自己然后消失这是一种在电子游戏中经常看到的效果。

我们看看另有一个例子中我在这里使用我的预览立方体 来表示一个世界或一个风景

我有我的绝对世界位置 和我使用组件蒙版屏蔽b通道,这代表我的风景的高度或我的世界的高度

我将向您展示如何使用平滑步骤节点选择上方的特定范围或低于某些高度,因为我知道我只希望在特定海拔以上的风景上有雪,所以在这个例子中,我们将 看看如何做到这一点以及如何使用平滑的步骤来实现它, 所以你可以在这里看到我从我的世界位置开始,我再次取代表高度的 b 值,现在 我的高度值很快超过 1 ,所以我需要的第一件事要做的是重新映射这个值以便我从最底部的 0 到 0 到最顶部的1,因此我将向其添加130 ,这将移动我们击中白色的那条线它将把它移到底部,所以我要添加130, 显然你的单位不同,如果你在景观上使用它, 你可能不得不使用一个比这个值高很多的值, 从0到1一直往下移动

好吧,接下来我 要做的就是在这里乘以一个小数字,这将使我的值从go到1的行移动到顶部,所以我乘以 0.005 这是打算让我的渐变从最底部的黑色变成白色到顶部,所以现在我有了渐变, 就像我使用我的 uv 坐标作为输入时所做的一样,现在我有一个垂直的渐变而不是向左走 向右,但我再次获得了从 0 到 1 的这个值范围,一旦我有了这个值

那么我可以使用我的平滑步骤来精确控制我的黑白过渡发生的位置,所以我将此值插入平滑步骤,然后我的最小值为0.5 ,最大值为 0.8,所以现在我可以将其插入基色中 ,您可以看到在渐变的0.5 处,我从0开始 ,然后平滑过渡到 0.8 到一个值的范围 1. 所以有了这些值,我现在可以控制我的转换开始的位置和我的过渡结束的地方,所以如果我想

在我的高度值上进一步向下移动过渡,我可以将我 的 0.5 值更改为0.1,然后如果我希望过渡发生得非常快, 我可以使我的最大值有所作为像 0.15 这样它会在非常短的时间内发生非常短的高度跨度或者如果我想采用更长的高度跨度

我可以使我的最大值 更大一些并让它从黑色一直过渡到白色顶部,所以通过这个平滑的步骤,我能够准确地控制过渡是如何 发生的我能够准确地控制过渡是如何发生的,只要我能够首先让过渡发生从零开始然后在最顶部上升到一个调整范围值以开始

所以作为回顾,我们今天查看了平滑步骤节点,我们发现平滑步骤非常适合打开和关闭事物并控制发生这种情况的范围,因为我们有设置最小值和最大值,因此在虚幻中我们查看了这个 高度示例,然后在unity 中我们查看了这个动画溶解和嘶嘶声示例
这两个示例都 使用平滑的步进操作在正确的位置打开和关闭我们的值

在今天的视频中,我们将讨论 unreal 和 unity 中的长度和距离节点,让我们开始吧!

我们今天要做的第一件事就是解释长度和距离是什么节点做了什么以及它们是什么,然后我将向您展示如何在着色器中使用长度和距离的三个示例,
因此首先重要的是要知道长度和距离基本上会给您相同的结果,因此如果您使用长度节点或使用距离节点,您将获得某物的长度或距离作为输出,以及确定要使用这些节点中的哪个节点的方式取决于您开始时注意的内容长度节点有一个输入,所以它期望输入一个东西,距离节点有两个输入

那么长度和距离之间有什么区别,长度节点的作用是取一个向量或一条直线,它测量直线的长度这就是为什么它只有一个输入,因为一行是一个对象您要插入的单个事物, 例如,您可以给它一条从相机位置到场景中当前像素位置的线或者你可以得到一条线, 从你的对象的原点延伸到你正在渲染的当前像素,你给它一条线你有距离节点测量两者之间的差异或距离点,这就是它在这里有两个输入的原因是因为你给它两个数据点,所以你可以给它你当前渲染的像素和场景中光源的位置, 或者你可能给它是您当前正在渲染的对象位置和您当前正在渲染的像素,您将给它两个点,它将测量这两个点之间的距离,但我想您现在明白我为什么这么说了 这两个的结果将是相同的,一个是测量线的距离, 另一个是测量两点之间的距离,结果将是一个数字, 表示这些距离有多远两点相距或这条线有多长我希望你能理解并且现在已经足够清楚了我将向您展示三个使用这些在着色器中创建效果的很酷方法的示例

在第一个示例中我向您展示一种使用距离或长度节点来测量场景深度的方法

所以这里我有相机位置和我正在渲染的当前像素的位置

我正在使用距离节点来测量两者之间的距离所以基本上我当前从相机渲染的像素有多远 ,然后我将结果除以五以获得我正在寻找的深度范围这意味着我最多有五个米所以在相机像素将为零或黑色 ,然后在 5 米外它将变为白色或值为1
当我靠近球体时,它变得更暗,然后当我缩小时,您可以看到, 当我离球体大约 5 米远时,它变成全白甚至比超出的更亮,所以这是一种测量之间距离的方法相机和我目前正在渲染的位置以获得场景深度,所以我有更深的颜色,位置更接近相机,更亮的颜色现在离相机更远


我也可以使用长度节点来实现相同的效果并记住,正如我所描述的,长度节点需要你给它一条线或一个向量,如果你有两个位置,你创建向量的方式是你从另一个中减去一个,所以这里我有我的相机位置和我当前的像素位置和我子从当前位置追踪相机位置。这给了我一个从相机到我当前像素的向量,这样我就可以获取我刚刚创建的向量并将其传递给长度 ,当我将这些东西连接起来时你可以看到这个着色器我会把它保存在这里并让它重新编译这个着色器,会给我与使用距离节点的版本完全相同的结果,所以这里使用距离我正在测量两点之间的距离,这里使用长度我测量通过从相机的位置减去位置而形成的向量的长度非常酷,有一个使用距离或长度来获取场景深度的示例

这是在虚幻中的同一个示例我有我的相机位置和我的绝对世界位置和我 虚幻中测量它们之间的距离以获得相同的结果,我必须除以10000,因为虚幻的基本单位是厘米,而不是像umity中的米,但我们正在做的是同样的事情

你可以看到当我远离球体时,它变得越来越亮 ,当我放大球体时,它变得越来越暗,直到我 变黑,所以在这里我正在测量相机位置和世界位置

在这里我形成相机矢量然后测量长度,你可以看到当我将它们连接在一起时,我得到相同的结果当物体更近时,更暗,然后更亮

好吧,让我们来看看另一个例子这里是一个例子,我假设我有一些树叶,一棵树,或者我想在风中挥舞的东西
它是对象 在本地或对象空间中的位置,如果我将其传递给颜色, 您可以看到我的枢轴点就在飞机的中间, 让我们先在这里讨论这个部分我是什么想要做的是动画这架飞机在风中来回挥舞

我们知道任何时候我们想要做动画我们都需要使用时间我在这里所做的是获取时间的迹象,这基本上会给我一个来回移动的动画波然后我将其乘以 100 以在任一方向上移动约一米,然后将其插入与我的 y 分量相同的 g 中,因此我正在为 y 设置动画顶点的组成部分, 所以让我们暂时跳过这个蒙版,我只是将它直接连接到 y 中然后将它连接到我的世界位置偏移中这将要做的就是来回设置我的飞机的动画我的飞机对风有反应

但现在它没有扎根地面,就像整个东西都在移动我希望只能移动顶部,假设这是一棵树, 我只想成为能够动画树的顶部,然后当它下降我想减少它的动画所以我需要做的是测量从树的底部到顶部的距离 ,然后用它作为面具来掩盖我的动作,这样底部发生的事情就什么都没有了
然后作为我在树上走得更高,我得到越来越多的运动,所以在这里你可以看到我正在采取不包括偏移的本地位置,所以不计算我在这里做的动画

然后我正在采取的 z 分量或者只是高度因为我的枢轴点在中间,我需要减去135的值。现在让我们继续将这个距离连接到基色中 ,看看我们得到了什么,所以我们立即得到一些超级明亮的东西,


所以我们需要将其乘以0.001,所以让我们将其连接起来 ,看看我们现在得到了什么,你可以看到实际上让我暂停一分钟,现在我们有一个很好的渐变,从黑色在底部到白色在他顶我通过测量

从z开头从这个点在负 135 处的 z 中的距离来做到这一点。如果我现在把这个零设为零,你可以看到我的距离在中间是零,因为那是我的物体的原点是或我物体的枢轴点这就是为什么我要减去135

因为这是 从中间到飞机底部的距离所以一旦我有了距离我将其乘以 0.001 得到一个更好的范围因为否则它从0 到 1就在底部然后一直向上 ,现在我可以用它作为掩码来掩盖我到达这里的运动

在我们之前看到这架飞机像这样动画,但如果我采用我创建的这个渐变并将我的运动 乘以渐变,那么我只会在我的平面顶部而不是底部获得运动,因为在底部我的运动是现在被这个渐变 掩盖了这是一种更简单的方法我可以只用这架飞机来做到这一点,但如果这是一棵树,这将是一个相当不错的方法,因为我正在测量从树的底部一直到顶部的距离,然后应用动画并在顶部获得比底部更多的动画, 因为我在此处创建的距离测量蒙版

与unity效果相同把它分成单独的xy和z分量

然后我引入时间符号并将其乘以0.35只是为了稍微减慢它的速度, 否则它在预览窗口中的动画有点太远了

然后我正在拉开距离在负0.5和位置的y分量之间,所以这让我向上直接向上方向我在这里使用负0.5 的原因再次是我的枢轴点就在飞机的中间,所以如果我在这里输入0 你可以看到现在是我这里的中心是黑色的, 所以我必须将该支点偏移

负0.5才能下降到飞机的底部,所以测量该距离可以让我从底部到顶部的平面从黑色到白色的漂亮渐变

然后我可以用它在这里乘以我的动画时间值,然后我将该值添加到飞机的 x 位置的位置,所以我在这里的飞机上走得越高,我得到的运动就越多,因为我正在乘以它通过此距离值 ,顶部为白色,底部为黑色,然后我将我的位置重新组合在一起 x、y 和 z 并将它们传递到我的主堆栈上的顶点位置,以便我能够控制数量顶点动画我是根据位置到达这里的离这个位置的距离

让我们再看看最后一个例子我正在使用距离节点创建一个假动画光源,如果我们来看看在这里你可以再次看到我使用正弦波,在这里做一点动画但是我在我的物体里面创建了一个假光源非常酷,所以距离节点或长度节点我们正在测量两个点彼此相距多远或向量有多长然后我们可以使用它来创建各种很酷的效果


原帖地址:Smoothstep/平滑--Length/Distance 长度/距离的应用?【Ben图形/15.16】 (qq.com)




本帖被以下画板推荐:

微信公众号:Game艺视界
使用道具 <
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表