![0efdce1e0024abc2430377b9d17e2b38.png](https://i-blog.csdnimg.cn/blog_migrate/d3fc44c824c0291bef0d37a60faaa3db.jpeg)
导言
houdini本身是很优秀的地形编辑工具,houdini engine让我们可以在UE4中使用houdini生成的HDA文件快速的构建地形地貌,并且支持协同工作。
![6390abf69974db6c6018f9d41b6024fa.png](https://i-blog.csdnimg.cn/blog_migrate/affb3ecf1ce7bb8fd59ab056c4e2b224.jpeg)
这里要了解到的一个概念是:我们在houdini中制作好了hda文件之后,在ue4中就可以反复的使用这个文件来做修改了,并不是传统的互相修改同一份文件来实现的,这使得ue4中可以进行闭环的操作,而不需要每一个使用到这部分功能的制作人员都掌握houdini使用方法
(注:未安装houdiniFX的电脑上,要想使用hda,一种选择是装sidefx提供的houdini engine版本,还有一种选择是在一台共用机上安装一个houdini engine,所有人在插件设置里使用tcp连接到共用机)。
这篇教程主要是为了带着大家走一遍houdini&ue4的基础,从houdini制作基础的高度图开始,导入ue4,在ue4中做一些调整,然后再使用hda文件cook一次,这就是最基础的一套操作环节啦!
关于一些houdini中基础的地形节点,请参照这篇文章呢!
键盘侠·伍德:Houdini Terrian & UE4 (〇)Terrian基础zhuanlan.zhihu.com![3313712eb663e99218a92cf7851cd96c.png](https://i-blog.csdnimg.cn/blog_migrate/c94ce0cf991e3ce96f7a42a14457bba4.jpeg)
1、houdini中制作height field
首先我们在obj目录里创建一个Geometry节点。
![8f90058f802849243220f1716222d4e3.png](https://i-blog.csdnimg.cn/blog_migrate/079c82bbf9c9c909ecb6b1d931c46a3f.jpeg)
然后我们创建一个新的assert
![7dd1a9062dfbb1b0935f1b9791462e3d.png](https://i-blog.csdnimg.cn/blog_migrate/b53b912629408e7ec0e99142aa24f1cd.jpeg)
![06ea207c7078aa7f00309ae1b00cb448.png](https://i-blog.csdnimg.cn/blog_migrate/ced49a381aa5b6dd154e845206342d5e.jpeg)
这里我们把输入设置到0,因为初始化地形的节点并不需要输入
![14e9406b107a655f0c74f67ce7e7fd11.png](https://i-blog.csdnimg.cn/blog_migrate/5fb9eb6e47fff63b1012b22028ae8052.jpeg)
然后我们在之前创建的Geometry节点里面,创建这个assert。
![6bebe6eca3aec55e8eb7b5f14c8d7e5d.png](https://i-blog.csdnimg.cn/blog_migrate/a99f2e3659451416544252d1b751051c.jpeg)
这里我们要打开编辑功能才能进去编辑LandScapeInit节点
![f2e00e8d1a8a3145eb0b174ae92bfb2d.png](https://i-blog.csdnimg.cn/blog_migrate/76afd1c13571bd3d973181cc5657a417.jpeg)
这里我们就之做一个最基本的地形生成,怎么做的好看就自己研究啦~
![03ce933e00dad2e736fcb390c7b8c763.png](https://i-blog.csdnimg.cn/blog_migrate/cd91c9bc16ed1088913033f8fb4261c2.jpeg)
对于最基础的节点,我们按照ue4的标准来设置地形信息,否则导入ue4后地形边缘一圈会出现拉伸。
![b0b6c84741d08ea6038461858a76a785.png](https://i-blog.csdnimg.cn/blog_migrate/7db0b7ef52da35c17c2154d110fbb270.jpeg)
![c4299df4ec1015695ff7acdedefa9f95.png](https://i-blog.csdnimg.cn/blog_migrate/f924e84bda8f2338b09b27323b93d9b1.jpeg)
这里插一个步骤,我们在ue4中先创建一个地形材质,这里我们简单的用颜色来表达。
![5807110426a2a357e0c942f5e6731ae4.png](https://i-blog.csdnimg.cn/blog_migrate/ccd310b66a3f2aee70cf4cc1735b1a76.jpeg)
然后复制这个材质的引用
![fd34b6f308d8b0498bc23060dc2fa4d6.png](https://i-blog.csdnimg.cn/blog_migrate/c75432e84bea6867c66d8b725175a39f.jpeg)
用上面的引用在create attribute节点里面设置给unreal_material属性,记得要去头去尾哦。
这里的属性name是约定的。具体其他的属性可以参见官方文档或者看源码。
https://www.sidefx.com/docs/unreal/_attributes.html
这里我们设置好以后,地形被导入UE4时就会自动被赋予指定的材质
![815a10928c5a62ba300b932fab3c061c.png](https://i-blog.csdnimg.cn/blog_migrate/83fef3ad5c2e5144a0e1853437ec61ef.jpeg)
然后我们选中最后一个节点并保存这个hda
![8390add39dc85a6543fd35adbbece775.png](https://i-blog.csdnimg.cn/blog_migrate/7f08b02a6047b71279a3d2ea40c54759.jpeg)
2、导入ue4
刚刚我们创建好的hda文件,我们把它拖入UE4,这时候就能看到一个houdini图标的uassert了。
![6885cc6ddee622a5780aef6c36580132.png](https://i-blog.csdnimg.cn/blog_migrate/b22f3070954333069851c54f615a2926.jpeg)
然后拖入到场景当中,hda会自动把我们上面创建的地形cook出来。
![0ccf7f0cd13a93abc3babff25efb71d1.png](https://i-blog.csdnimg.cn/blog_migrate/a226c4c70eb6bb97840afa6e853052f0.jpeg)
这里我们看到的地形因为没有layer的信息,所以是全黑的。
![dd5c53a1ef1d08157894c2f651b65a67.png](https://i-blog.csdnimg.cn/blog_migrate/447a6482e9d6dbe5a642ad39e008a3d9.jpeg)
点击LandScapeInit里面detail面板上的bake按钮,把地形脱离开来,这时候LandScapeInit文件就可以从场景中删除了。
![eb571ed146308c85acfb0bb7f40cf3f5.png](https://i-blog.csdnimg.cn/blog_migrate/ef56adaf382734034480920b82fba912.jpeg)
到这里,地形的高度信息就已经导入成功了,下面我们要给地形生成一些mask。后续可以用作山顶、斜坡贴图等。
3、创建一个制作mask信息的hda文件
和上面一样。我们创建一个新的assert叫LandScapeMask,但是这里我们希望它有一个输入参数,来接收一个heightfield。
![2abde6a2e518587ef64d44dc263deeae.png](https://i-blog.csdnimg.cn/blog_migrate/3a35fd24c2ee9916c78b16a2d223c611.jpeg)
![783cf1e97ad0ea7d9a87a909025d3a2f.png](https://i-blog.csdnimg.cn/blog_migrate/e875d1be667d7104856a09d5c54bf390.jpeg)
我们把这个节点创建到之前的LandScapeInit之后
打开允许编辑,我们来制作这个hda文件。
同样,这里也是做一个简单的mask创建。我们在这里用mask by feature对斜率信息做一个mask,然后把mask赋值到Slope。
后面反转slope层作为Base mask。
![15c6b37de0777d5b64ecdfe469f24234.png](https://i-blog.csdnimg.cn/blog_migrate/c0d803d155d699399e44c1bce3e0a30f.jpeg)
选择最后一个节点,保存
![92190d96438f0266442b88690f4ee671.png](https://i-blog.csdnimg.cn/blog_migrate/e905211e7b9236c6bd33b6e57b0cb0ea.jpeg)
4、回到UE4
我们把新的hda文件拖入UE4。
![3a96b9e3eb136a4d6e4d7d8fc078859b.png](https://i-blog.csdnimg.cn/blog_migrate/1091ff853ecbdb4cd6d48ff96554cf84.jpeg)
然后我们就能看到刚刚我们定义的Input出现在了Detail面板里。
![976711e987fc55e3c0fc4507ad4aa0cc.png](https://i-blog.csdnimg.cn/blog_migrate/698b99007c58e39e16ebba8b99ff66b6.jpeg)
这里我们选择Update Input Landscape Data(更新输入的地形数据,不勾选的话会创建一个新的),然后点击列表中的Landscape,hda就会自动把地形送到houdini library处理了。
![e28376a38ed8540292801c795a6e57b0.png](https://i-blog.csdnimg.cn/blog_migrate/531665f87e30fa55080e7b623a16c6e8.jpeg)
处理完之后我们就能看到我们的地形上的斜坡被着色了。
![e949989e66dacb70da2c79c8080183f1.png](https://i-blog.csdnimg.cn/blog_migrate/9e804ed611bfa71d8403f0c8453beb11.jpeg)
我们将这个处理之后的地形bake出来以后,可以做一些修改。这里我们在UE4中拉了一下地形。
![e831d08da82534a24c368d999faef771.png](https://i-blog.csdnimg.cn/blog_migrate/90fe261b6b867b59f3a631211d4988d1.jpeg)
拖入LandScapeMask再次提交地形就可以看到,被提交的地形重新计算了slope layer的信息。
![e526b8c030c7840dff1901852cc2503c.png](https://i-blog.csdnimg.cn/blog_migrate/18d9fa9df3eb90944468533635df9c57.jpeg)
5.将houdini的调整参数带入UE4
打开houdini,进入LandScapeMask节点
![7430e9f172b74e5dde58a6fbcb3d09f7.png](https://i-blog.csdnimg.cn/blog_migrate/d1290c7c690efe0b0701510884266d58.jpeg)
这里就是可以放入参数并带入UE4的地方啦。
![0c2dc0629083af2b1852c604068ca56d.png](https://i-blog.csdnimg.cn/blog_migrate/8c10bf2b7ed13579cf8ada4dd7525ced.jpeg)
我们选中mask by feature节点,直接将参数拽入parameters面板中,应用并保存hda文件。
![52c129bf0a59ad0944c67829a7d0441c.png](https://i-blog.csdnimg.cn/blog_migrate/e97f49d9a1c9787e0ce3d8c1fd98e672.jpeg)
并且在UE4的内容浏览器里右键LandScapeMask选择Reimport,把修改的hda更新到uassert中。
![ebdb423416d956c42cabc51c82e3879c.png](https://i-blog.csdnimg.cn/blog_migrate/d14111a6e8bfcdec63478a4cea6ecb7d.jpeg)
拖入场景,就能看到Detail面板里这些信息了。
![d3475445e8a51743c9938ff6d8e7facb.png](https://i-blog.csdnimg.cn/blog_migrate/896da2bb12da2f736e74bd1d00b24cc6.jpeg)
如果地形没有被bake出来的话,在这里调整参数会直接应用到地形上。
6.注意点
- 可以注意到我们这里用了两个hda节点来制作,其实也是个人自己觉得比较方便的方式。毕竟除了初始化地形的操作以外,很多操作如果没有输入是无法直接在houdini中预览效果的。通过这样的制作和连接方式,我们可以在制作mask活着后面撒点的时候都可以有个预览。
- parameter和input都可以把参数抛进UE4中,但是input更常用一点,毕竟在houdini中input可以直接作为输入口来预览。
- 每次用hda文件cook出结果后,最好都把结果bake出来,然后删除hda节点,下次要使用的时候再把hda拖进场景。当然,在确保没问题的情况下,把修改的地形放在hda下面能够得到更加及时的更新。
- 每次hda操作之前和之后最好都保存并重新打开场景。
- 如果操作前不保存,可能出现输入houdini engine的数据并不是当前最新的情况。
- 如果操作后不保存重启,地形上的mask信息可能是错乱的,而且会发现调整地形或者画layer的时候笔刷在地形上很卡的情况。保存重开保存重开!真的很重要!
后记
到这里为止,我们在没有修改houdini engine插件的情况下完成了一次地形的基础工作流。在一些更加深入的工作流程探究时,我们还是会发现有很多不如人意的地方,这里暂不一一举例。
使用houdini&UE4做开发,除了houdini本身的使用外,还有很大一部分就是houdini engine根据项目的需求进行定制化,后面的分享也会围绕houdini engine定制来写。
还望多点赞,多指正,感谢感谢!