Skip to main content

在这提供下我跟着教程做的工程:

链接:https://pan.baidu.com/s/1dk4cXwJz3BZsjE1sbyxyyA
提取码:qi2n

BASE

先使用mask_paint节点为HF_Noise做遮罩,画出大致的山体起伏。HF_Noise的噪波类型可以改为Perlin,至少视觉上看起来更像山体。

在画完遮罩后,在HF_Noise中,将Combine Method改为了Maximum。我觉得这样做的用意是为了让山体没有负形,都是从世界坐标0开始向上生成的。这样在之后做Vop的时候就很方便,因为Vop中的P属性值,就是从世界坐标开始计算的。Vop中的高度0,也就代表了山体的高度0.

在将Combine Method改为Maximum后,HeightField中会出现一大片平坦的部分。作者通过移动Offset重新产生噪波。这个操作看第一遍时候我没看懂,一直以为是通过Offset来重新映射上面的mask_paint区域。实际上,移动的不是mask,而是噪波。在没有噪波的位置,HeightField就会变为平坦的状态。我们需要移动噪波,找到一个可以让噪波能够完全覆盖住Mask部分,只要Mask部分HeightFeild是有噪波的,哪怕只有一点点也没关系,只要不是完全平坦的就可以了。

当然这时候,山体的高度可能并不是我们想要的,所以还需要重新调整Mask,在Paint Method是Repalce的时候,可以鼠标中键擦除遮罩。但是可能会遇到不管怎么画,山体高度都不会变化的情况,这时候就得将Paint Method改为Add,再继续增高山体,但是Add模式下,没办法中键取消Mask,想要取消,还得回到Replace模式。

另外还有两个要注意的点。

一个是注意比例。

现在的视觉构图是前景左下方有一个小山,中景别左右两座山,远处一座山。在透视图中看,前景的小山跟中景的两座山差距不是太大。但是在第一次做的时候,我的前景的山做的特别小,这会导致什么呢?

导致我要还想做出上面那个构图,摄像机就必须靠小山很近,才能让它填满左下角,在近大远小的透视作用下,之后添加树木后,前面的树木特别大,中景的树木特别的小。可能我想让前景的树看起来正常大小,但是中景的树已经小到看不出来是树的。所以要注意比例问题。

二是注意给山体添加斜坡。

不管是因为参考是这种斜坡的,还是因为曲线更有美感,在这个教程中,都要注意下要让山脚呈现出一个斜坡。第一次做的时候,我的左边的山脚就很硬,看上去像是悬崖,上材质之后也不好看。

除了通过绘制Mask形成这种斜坡外,还可以通过HF_Noise中的Distoration来形成,调节一下就能明白了。

回到节点中,再添加第一个HF_Noise中,山体的大形体就结束了,BASE中余下爱的节点是添加细节的。

再添加一个HF_Noise是为了填充完全平坦的部分,让那些区域也有噪波产生,HF_Distort可以看作是给山体添加一些纹路,也可以让扭曲山体,让山体看起来更随机,更自然。Terrace就是额外添加一些岩石细节了。不过到现在为止,仍然只算是塑造大形体,因为我们还没有使用Erode节点。

River Projection

这里优化了下河流映射的流程,使用一个sweep节点,就可以得到一个法线正确,线条始终在面片中间的,这么一个面片。需要调节的就是Surface Shape改为Ribbon,然后调整下面的Width就好了。

而下面的transform节点,是把面片稍微往上抬一抬,不然映射出来的面片太低,会让河流区域跟山体区域有着很明显的断层。

这张图种,红色区域的断层还能接受,erode一下可能就消失了,但是蓝色区域的断层就很明显,即便erode也会很不自然。所以这也是为什么一开始要给山体添加斜坡的原因。如果遇到这种情况,就需要回到mask paint阶段重新画一下这个山体了。

Erode

先来看看Erode的Main参数面板,主要分为Hydro和Thermal两个参数,风力侵蚀和热力学侵蚀。

Hydro对侵蚀的影响我以为是针对产生的河流的影响,后来发现不是的。可以理解为侵蚀后留下的沟壑的多少。Erodability值越大,沟壑越多,越细,反之亦然。

而Bank Angle的影响是值越大,沟壑之间的间距越小,Debris越少。值越小,沟壑之间的间距越大,同时沟壑之间留下的Debris也就越多。

Thermal的参数可以理解为山体的软硬。值越大,山越软,那么一开始的棱角就会被侵蚀的特别光滑。值越小,山越硬,就越能维持住棱角。

Cut Angle起到的作用其实也是控制Thermal侵蚀的范围,值越大,反而有越少的部分被侵蚀。值越小,就会越多的部分被侵蚀。

所以总结来说,Main参数面板控制两种侵蚀的形态,一种是产生沟壑的Hyfro风力侵蚀,一种是控制山体软硬的Thermal热力学侵蚀。而每一种侵蚀方式都有一个控制强度的参数,和控制范围的参数。其他的参数都可以理解为是起到一个倍乘的作用。

接着作者又做了一节关于erode节点的高级参数面板讲解,但是我没有细看。研究太多的参数只会让我更迷糊,在以后某个项目中,erode节点的默认效果达不到我想要的效果的时候,也许我会再重新来研究。而且erode并不是创建山体的终点,有时候甚至需要多个erode节点来配合。

不过Houdini官方的文档中,简单介绍了几种常见的操作方式,翻译如下:

  • 沟壑形状
    • Main->Hydro->Bank angle调低,可以得到更宽、更浅的沟壑,提高则会产生更细、更深的沟壑。
    • Advanced->Precipitation->Density调低,可以得到更细的沟壑,反之亦然。
    • Advanced->Raindrop settings->Expand radius调低,可以得到弯曲、细的沟壑,反之得到更直、更宽的沟壑。
    • Advanced->Raindrop settings->Blur radius调低,可以得到更深的沟壑,反之得到过渡更顺滑的沟壑。
  • 山脊形状
    • Main->Thermal->Cut angle降低,可以得到更尖锐的山脊,调高可以得到更圆润的山脊。
    • Removal rate也可以起到这个作用。
  • 湖泊
    • Advanced->Precipitation->Evaporation rate调低,可以得到更大面积的湖,调高可以减少面积或者没有湖泊。
    • Advanced->Raindrop settings->Blur radius调低可以得到更明显的湖泊边缘,调高可以得到过渡更顺滑的边缘。
  • 沉积物
    • Advanced->Debris flow->Quantization调低可以得到更平坦的沉积物聚集,调高的话,沉积物聚集的就很分散。
    • Advanced->Debris flow->Max height调低,沟壑种更少或者没有聚集沉淀物,反之亦然。
    • Advanced->Debris flow->Repose angle调低,可以让沉淀物更少的堆积,像是沙子。反之则让沉淀物更多的聚集,类似岩石。

第一次erode没有改变参数,用的就是默认的。

erode一次后,添加resample节点提高采样,这个类似于增加图片的分辨率。添加这个之后,再次erode的时候,会明显感觉计算速度变慢了。

之后使用distort by layer来做出球状置换的效果。这个节点看名字就能明白是依靠一个额外的layer来提供置换数据的,不过作者并没有连接其他节点。因为作者只是想要这个节点提供的Swirl功能。

我的理解是,这个layer应该只是提供一个哪里需要置换,哪里不置换的信息,如果不提供,那就默认全部都有置换效果了。而且这个置换,并不是简单的高低置换,而是XYZ三轴方向的矢量置换。

而且要开启Swirl才能看到效果,作者只调节了两个参数,开启Swirl和Smear,然后调整Rotate displacement为60.Swirl就可以做出山体向外拱成球形的置换,Smear则可以看作是一个控制Swirl强度的参数。当Rotate displacement为0的时候是不会有置换效果产生的,但是当值为+90或者-90的时候,就是完全的swirl效果。只不过正值是向外拱,负值是向内收缩。

接着再一次使用distor by noise节点,只是为了添加更多的细节,细节越多,erode的效果越好。

然后进行第二次erode。不过这次就需要调整下参数了。

在Main面板中,提高了风力侵蚀的效果,可以得到更多的沟壑。提高了一点热力侵蚀的比率,能让山体稍微柔和圆润一点点。

在Advanced面板中,提高了Max Debris Depth,它的作用是当沟壑达到一定深度的时候就停止侵蚀,我的理解是这个数值决定了沟壑的最大值。然后提高了Precipitation中的Amount和降低Density。Amount控制降水量,数值越大的化,侵蚀效果越少,因为houdini会认为降雨太多成海了,你的山体是在水面下面的,不受侵蚀。Density的值越小,侵蚀程度越高,其实很多参数都是从各个角度去影响侵蚀,虽然有时候达到的效果可能差不多。我觉得这个数值也只是Amount的一个倍率调控而已。

最后在Debris Flow中调节的参数,都是为了返回来降低产生的沟壑。

erode之后,通过distort by noise再次添加一些细节,然后使用heightfield_slump来让山体底部更加的平滑。可以把slump想象成山上的碎石泥土滑坡下落到山脚下,那么山脚下就会堆满这个沉积物,山脚的部分则会更平滑一些。作者主要调节了两个参数,Repose Angle可以理解为slump的范围,当然是以角度为参考值。Height Factor是影响slump的对比。

这个阶段,也是我反复调整最多的阶段。因为这个时候基本山体就已经定型了,但是每次都觉得不是十分满意,就反反复复的回到mask paint重新调节。

Mask Generation

其实在这个教程中,所有的Mask都是通过Vop连接出来的,没有用到Heightfield自己生成的Mask。所以如果用其他山体软件很顺手,完全可以先在别的软件中制作好,然后导出高度图或者什么,在houdini中转为Heightfield,然后再进行其他的调节。

因为说实在的,可能还是我用的不熟悉,感觉Gaea做出的山体,细节很多。但是Houdini就比较适合生成出来做植被的山体。Gaea那种可能更偏向于模型的创建?

好吧,先看下bedrock的mask制作,主要是通过法线数据,来生成偏向于垂直的面的mask,法线数据记录的是面的xyz三轴的旋转朝向信息,那只连接到法线的Y方向,就是在面的朝向都朝向Y轴时候的方向。当然这个只是我的推断,其实真的做的时候,把N来生成这种bedrock的遮罩当作一个记住的小技巧,一共就三个通道,挨个儿试试也行。

然后使用aanoise来生成横向的断层一样的遮罩,可以想象成这样的:

因为我的河流朝向跟教程中是不一样的,所以我的aanoise的frequency参数是z轴为0.哪个轴为0,就是向哪个轴无限拉伸。

使用Add将两个遮罩合并起来,这里的add的两个接口没有顺序的要求。

因为aanoise生成的断层是连贯的,所以作者又使用voronoise来产生一个随机纹理阻断这种连贯性。

这里使用subtract节点,交叉相减voronoise的dist1和dist2,也当作一个强制记忆的小技巧吧。因为voronoise也是依靠P属性,也就是位置属性来生成的,虽然我不知道具体怎么依靠P来生成,但是给P一个随机值,就可以让voronoise产生的直线也产生随机的扭曲。

所以这里通过aanoise与P相加,来产生一个新的、随机的P值。但是这里的相加,就对顺序有要求了,必须是P加aanoise,不能反过来。其实这里我想不明白,按理说相加参数应该对顺序没有要求才对啊。

然后将这个带有随机扭曲的voronoise跟断层遮罩相互叠加,就产生了被阻断连贯性的断层遮罩,然后再用这个新的断层遮罩再去加上之前的bedrock遮罩。

最后还有一个问题要修复,就是现在遮罩影响到河流部分了。我想让河流的遮罩部分保持纯黑,不会产生任何的bedrock。这个很好理解了,河流部分在最底层,那就用位置来影响了,所以连接了P的Y轴。

直接看P的Y轴信息,就能看到河流部分都是黑色的,因为河流是在地平面下面的从Y轴数值上来说是负数。然后用这个信息去乘以刚才做好的bedrock遮罩,一开始的相乘信息是错的,视觉上看是更白了,原理是数值上这个数更大了。

在P的Y轴信息后加一个fit就可以矫正过来了。因为这个fit可以让Y轴的数值限制到0-1,最大是1,1去乘以一个数值,仍然是数值本身,所以河流以上,非纯黑的部分就不会去提高之前的bedrock值。

然后作者又通过刚刚制作好的bedrock遮罩,在遮罩部分用贴图产生岩石置换,让山体模型更多一些细节。在用贴图之前,需要先给山体展UV。这个uv其实很随便,使用uvunwarp节点展uv,可以想象成生生的将这个山体压扁,如果压扁之后面有重叠,那就把重叠的部分抠出来放在旁边,最终让整个山体没有任何重叠的压平。

如果给一个uvquickshade节点来查看uv的话,就能看到这个uv很乱,但是恰好我们之后做山体材质的时候,免不了会产生贴图重复的现象,这种乱糟糟的uv反而可以避免重复的现象。

需要调节的参数是Spacing,控制的是每个面布局之间的间距,默认是6,作者调节成了0.001,不过我觉得改成0.1效果也挺好的。

用贴图做置换的vop逻辑挺好理解的,要注意的就是mix的节点中input的顺序是有要求的。还有一个是这里引入uv属性用的是importvertex,而不是bind。虽然我查了好多资料也没有明确说明bind是引入什么属性,但是测试一下发现应该是只能引入point属性,而uv属性是附着在vertex中的。

添加置换之后效果确实好了很多,不过最终我们还是会使用一套岩石贴图来制作这个岩石外表。

最后一个attribute vop节点是用来生成各种mask,以便之后做贴图用。这里的mask还不完全,比如那个grassMask遍布整个山体,之后还会通过bedrock和river的遮罩去除掉不应该有的部分。

这个教程中其实作者有很多地方进行了省略,比如虽然这里制作了雪的mask,但是教程中并没有使用的过程,但是最终渲染图中远处的山顶是有雪的,很多地方都需要自己去思考制作下的。

总结

在Week2中,作者讲解了使用houdini制作山体的通用做法。

先使用paint mask来制作大的框架。

通过heightfield_project来映射河流,或者其他什么想映射的物体模型。

尽量多使用heightfield distort让山体的纹理更丰富更自然。

erode节点不一定只用一次,必要的多,可以erode两次。

erode之后,通过额外的节点进行细化,比如slump节点。

通过Vop连接想要的遮罩。

(完)

Leave a Reply