奇技淫巧-Unity弯曲的赛道(一)
先来看个效果。一段风格鬼畜的赛道模型。通过一个Shader,控制整个场景模型的弯曲变形。
今天的主题和跑酷游戏有关。话说当年,我也曾进过合肥号称游戏行业老大的某堂,他们靠一款跑酷游戏起家,并一直很执着的做了下去。精神可嘉。
在我们印象中,经典的跑酷游戏大概都是这样,注意,这里我使用的是普通材质球。赛道是正常的直线型。
我这里采用的是摄像机固定。然后赛道循环出现的方式。其中每一段赛道是140个单位,也就是140M
好了,现在开始切入主题。
有一年的夏天和我大学同学@史良聊天。聊起跑酷项目。说起来一个问题。一般跑酷项目。直线赛道的尽头都不是很好处理。赛道不可能做无限长,尽头怎么藏,是个很考研场景美术的活。@史良同学给我演示了一个效果。就是把赛道尽头藏在地平线下。效果目测不是模型或动画调出来的。应该是Shader。不然不可能那么整齐划一。(合肥老大某堂的方式很粗暴。直接给个摄像机最大范围。完全无视天际尽头那一条明显的切线……)史同学问我咋搞,我当时沉浸在黄焖鸡米饭中,无暇他顾。含糊一声:嗯,回头我弄看看……
后来。我还是弄出来了。效果如下
如上图,整个赛道场景模拟一个地平线的效果。所有的模型都受一个弯曲效果的影响。
好了。废话少说。今天就给大家讲下具体怎么个操作法。
打开Shader Forge,新建一个Shader一切就绪。
拖入一个World Position (世界位置)节点。将Z节点连在Emission (自发光)节点上。
这时。整个赛道模型分成了黑白两部分。
你可以试试拖动整个赛道模型在场景中的地方,会发现黑白交接的地方永远是在世界原点。
如下图,我画了个大致的示意图。Unity的视图网格一格是100个单位。这个时候,模型上的黑白信息是已空间坐标来分的。以世界空间远点为基准。以Z轴的坐标划分。大于1的是白色。小于0的是黑色。(注意我连的是World Position的Z输出节点,如果是XYZ输出节点会是怎样?你可以试试,反正又不会死机)
好了。我上面说了。大于1的是白色。小于0的是黑色。那么1和0之间的呢。我给大家放大看看
如下图。放大后。在0-1这一个单位的大小上。有一个灰度渐变。
这里讲下基本原理。
World Position (世界位置)
在世界空间中输出网格当前部分的位置 |
World Position (世界位置)这个节点能够输出模型上世界坐标的数值。上面我输出的是Z轴向上的坐标。(Unity中表示颜色的方式和我们熟悉的Photoshop不一样,Unity中黑色是0.白色是1.Photoshop中黑色是0,白色是255。0-1有无数个色阶。但是0-255只有256个色阶。所以理论上你在PS里面能使用的颜色是256的三次方)所以这时候,模型上表现出来的黑白就是基于坐标的数值。由于我们的显示器是基于Adobe RGB的。也就是我提到的0-255这样的表示方式,所以。只能显示0-1之间的色彩。所以我们只能观察到坐标0-1之间这1M的空间上的明暗变化现象。
接下来,我们使用另一个节点
Remap (Simple) (重映射(简单))
R + LMB
将值从一个范围重映射到另一个范围。例如,如果节点期望 -1 到 1 的值,但您想要它输出 2 到 5 的值,那么您可以在第一行键入-1 和 1,在第二行键入 2 和 5 |
这个节点简单点说,就是把一个范围的数值缩放成另一个范围。
如下图
我使用了一个Remap节点,将之前-400到-50的数值,缩放成了0-1其实也就是将我们之前显示器显示范围之外的数值。缩放成了我们能观察到的数值。这个时候,就能看到赛道模型上面处于空间坐标Z轴上-400到-50的区域内。出现了可以看到的明暗变化效果。
OK。有了明暗数值变化,就好说了,直接把Remap后的数值乘以50,然后连到Vertex Offset (顶点偏移)输入端,这时。就能在视图里面,看到赛道模型发生了50个单位的偏移。
现在模型有了变形,同样,你也可以拖动赛道模型在场景中的位置看看变化。
接下来的事情,就是调整变形的效果了。
这部分且留在下回分解!