链接:https://pan.baidu.com/s/1LWKFqQZd9d_e64mP9bxAvw
提取码:spl8
文件是scene assemble.hip

Houdini有专门用来散布植物的节点,叫做Height Field Scatter。我之前看过一个官方介绍这个节点的视频,功能还是很强大的。不过作者并没有使用这个节点来散布植物,而是使用Scatter和Instance节点来制作。但是之后自己创作东西的时候,还是会来看看这个Height Field Scatter节点。

01-03节

Instance节点是散布植物的核心,它能够让我们散布成千上万个植物成为可能。C4D中也有一个Instance对象,每一个Instance对象都表示一个对象的实例。具体这个实例位置在哪里,还是需要我们手动摆。

但是在Houdini中,Instance的逻辑跟C4D完全不一样。我们在Instance节点内部产生的点,将作为实例对象的产生位置。而被实例的对象,则通过Instance节点的参数,或者通过Vex来指定。

另外,这个Instance还和其他节点不一样的是,它并不是在SOP中,它是跟Geometry节点是一个等级的。比SOP高一级。点进去Instance节点的内部其实还是SOP,只不过我们在这里面创建的任何物体的点,都会被用来当作实例对象的位置。

Instance节点本身的参数没有太多好说的,唯一调节的是它的点实例化模式,作者提到Arnold渲染器不支持Full point instancing,只支持Fast point instancing。我看了下官方手册,这俩的区别大致是Full point instancing模式下,能改的参数更多。比如后面我们使用Fast point instancing做分布的时候,引入的abc文件指定的材质位置是不能变的,因为一旦变了abc文件就找不到这个材质了。但是Full point instancing可以重新指认材质的位置,大概就是这个意思。

最初作者只用了简单grid来做演示,这里的grid可以是任何多边形对象。

这里的sort节点起到了关键作用,它打乱了点的id值,让点id随机分布,这样我们就有了随机化引用被实例对象的基础。这个节点是不能缺少的。

随后作者在这里第一次使用了Vex,因为之前我有过编程的经验,所以Vex的逻辑对于我来说还是很好理解的,可是到了具体的函数功能还是抓瞎。

开头的s@instance我确定并不是Houdini全局通用的变量,因为全局通用的变量,比如下面的pscale和orient,是不需要在前面声明变量的数据类型的。可是按着我的理解,这种自己声明的变量应该是不能直接被节点识别的。但是这里却是可以,所以只能当作一个知识点记下来了。即:为s@instance赋值,值是要被实例化的对象的路径位置。

s代表着string,字符串类型,就是文字,后面的itoa(),就是整形转字符函数,虽然我也不知道为啥不是itos()。

而@ptnum%3,就是用点的id号除以3.得到的余数是什么,返回的值就是什么。

现在想一想,虽然我们的id号是一直增长的整数,但是拿id号去除以3,得到的余数只能是0(完全整除)、1和2.这里可以自己考虑一下,我怕我说的太多太磨叽,还说不清,但是自己捋一下很快就能明白的。

也就是因为这个求余运算,让我们可以循环的指引三个不同的对象作为被实例化的对象,当然你要是有4个,就除以4就行。当然,在Object层级下,你要有名称相对应的4个节点。

下面的代码都很好理解了,就不多解释了。

再之后,作者又演示了怎么使用attribute transfer节点来用模型控制点的分布区域。这个对于艺术化的制作很有帮助,比如可能想要制作一个麦田圈的效果,就可以用这个做。

这个操作的本质是,给两个模型创建同一个名称的属性,这两个模型一个是要被分布的物体A,一个是要影响分布位置的物体B。A物体属性是0,而B物体属性是1,这样就可以通过B与A的接触来控制影响的位置。

下面的scatter节点,它的Relax Iterations参数的意义其实是尽量避免点之间的穿插,但是同时也让分布看起来更刻意。我们做植物分布的时候,设置为0就好了。

至于其他的,虽然作者展示了几种制作Mask的方法,但是因为跟之前制作山体的时候原理一样,就不重复记录了,如果忘了的话,随时回来看看视频也是可以的。

04-06节

在houdini里,点虽然看上去仅仅是一个点,每个点都没有区别,但是每个点都能承载很多信息,包括pscale,点的大小,虽然点本身不能以视觉方式表现出来它的大小,但是它确实存在这个数据。同时点也有法线朝向的。所以我们可以围绕点的法线方向旋转,来达到克隆物体跟着旋转的目的。

这一节作者先是介绍了使用Vop调整旋转的随机值。

其他部分都好理解,但是红框里的部分一开始没弄明白。后来查了查资料,再加上猜测才算理解个七七八八。

大概来看,是通过操控点围绕自己法线方向旋转,将这个旋转的值导出到up属性中,来让克隆的物体发生旋转。

这个up属性是什么呢,我找到了官方介绍,所有克隆或者实例都自带很多个属性,up就是指克隆物体的上行矢量,在没有orient属性的情况下,它也是克隆物体的Y轴方向。具体可以看这个文档:https://www.sidefx.com/docs/houdini/copy/instanceattrs

所谓的朝向也是用旋转来操控的,那么就可以简单理解,up这个属性可以操控克隆物体的旋转。

那么通过调整rotate的参数,连接到up中,就可以实现操控克隆物体的旋转了。

rotate这个节点,顾名思义就是旋转,将N连接到rotate的axis上,就是围绕着法线方向旋转。如果这时候把rotate链接一个bind export,然后查看它的数据,能发现这个数据是一个数组,而且是包含了15个数据的数组。

虽然不知道这么多数据是拿来干嘛的,但是它肯定不能正常输出到一个三维数组里,三维数组就是包含三个数值的数组,位置包含xyz三个数值,法线也包含三个数值。而up这个属性是一个三维数组,它不能直接识别rotate这个多维数组。

所以作者通过multiply节点来转换为三维数组。让这个数组与一个三维数组相乘,也就是vector数据,这个vector数据是[0,1,0]。这么相乘情况下,除了中间1的位置的数据,乘以1本身不变,其他部分的都是乘以0变成了0.至于rorate剩余的其他数值,我就不知道Houdini怎么处理了。不过总之,我们得到了一个vector类型的数据。

而multiply这个节点的连接顺序是有讲究的,rotate的输出点是紫色的,constant节点的输出点是绿色的。multiply这个节点,谁连接到它的input1节点,它就输出什么类型的节点。所以一定要让constant作为input1,我们才能得到一个正常的vector数据类型。constant作为input1时,multiply输出的节点也是绿色的。

这样,就完成了rotate数据传递到了up属性上。很麻烦,也很难记得。不过也正是因为这种底层的操控,才让Houdini变得这么强。

之后又说了下使用fuse节点做出聚集的效果,简单理解是通过点聚集和没有聚集之前的状态,混合一下,类似于C4D中的姿态变形标签,来做出点之间靠拢的效果。但是这个功能,height field scatter有专门做这种效果的功能,而且最终场景中也没有用到这个技术,所以就先不去深研究了。

第五课则是讲了一个物理笔刷的节点,很好玩也很容易理解,也略过。

06节中,作者介绍了使用megascans资源,为场景添加更多细节。其实megascans有一个插件,可以直接一键导入进houdini中。之前尝试导入材质,渲染器用的redshift是成功了,之后有机会可以单独写一篇记录下怎么安装和使用这个插件。

在这节课的末尾,作者又简单走了一遍他是怎么做散布的。但是实际上,在后面的教程中,操作和细节远没有他这个场景中的这么多。在这里展示的场景,应该是教程宣传片中的场景,质量确实高。在后面的时候,作者其实省略了很多步骤没有说。不过即便这样,最终效果还是很好的。

然后又介绍了在Houdini中优化叶子面数的办法。这个办法只有在叶子整体是一个模型情况下才管用。就是用delete节点,通过Delete by Range模式,每6个叶子里删掉4个。再通过连接一个For-Each Connected Piece,给每一个叶子都放大2倍,让树看起来不秃。

连接这个foreach的时候,会自动在delete下面连接一个叫做connectivity的节点。这个节点的作用是,给每一个primitive或者point指定一个属性,默认这个属性叫做class,这个属性的数值是一个整数,如果某两个或者多个primitive或者point的数值相同,那么这两个或者多个primitive/point会被视为是一个整体。在这里的作用,是给叶子分组,每个叶子自己都是一个组。用组来识别有多少个叶子。

而foreach本身其实我也不是太清楚,只是知道它的作用就是不断重复一个操作,直到满足某个条件。在这里就是不断的给每个class放大2倍,直到次数达到最大值。

这个操作也很有意义,不过我更倾向于在SpeedTree中就把叶子面数压缩到合适的数值。作者应该也只是演示一下有这么个操作的可能性。

07节

这一节主要说了使用VDB创建一个塔楼,没有太多要说的,记得把所有的polygon模型都封顶,成为一个封闭的多边形就行。

这里作者只是简单介绍了操作流程,在最终场景中,那个稍微复杂的塔楼作者没有交代是怎么做的,尤其是在塔楼周围再随机覆盖一些植物。虽然这些基本原理前面都说过,但是其实在最终场景中,类似于这样的省略作者还是做了很多…

(完)

Leave a Reply