Houdini to Unity地形流程(一)
前言这是花了2天业余时间(指打Hitman 3成就打到逆反)摸出来的极度新手向的小文,帮助有兴趣的朋友在两三个小时内绕过版本冲突、避免弯路、快速见效。
关于例子,虽然说文中写得简单,但也附上了对应的3个HDA,分别对应基本例子、HeightField Layer、Detail Layer。
主要我也没有找到很好的展示方法,毕竟可视化节点工程这种吊东西对记录太不友好了,有兴趣自取。
插件安装
Houdini版本为19.0.498。选这版本的原因是Houdini Engine For Unity插件需求。
Unity我的版本是2022.2.0a16.2406。Houdini For Unity下载地址为Houdini Engine for Unity。
验证安装成功的方法是Unity编辑器上方出现HoudiniEngine的菜单栏选项,且New Node - Curve之后可以在场景中创建线条。
启动失败的可能原因
[*]重启Unity和Houdini
[*]Houdini安装时没有勾选为Unity 2018+安装支持
[*]Houdini Engine For Unity插件未找到Houdini位置,Plugin Setting - General - Override Houdini Install Path里重新选择路径,并重启Unity
地形的基本流程
明确一点就是,在这个流程和Unity Terrain不一样,修改是由Unity的插件面板反馈到Houdini Engine中进行计算后再反馈回来的。
一个基本的例子就是随插件附带的TerrainGenerator.hda,或者打开该场景查看这个用例:
一个极其简单的例子
快速捏一个HeightField:
打包成Subnet,右键Create Digital Assets,把内部节点的参数都暴露一下:
之后,来到“我的文档\houdini19.0\otls”路径下,将做好的*.hda文件拖到Unity工程中,会得到带有Houdini图标的资源,此时将这个资源扔进场景:
Yeah,就这么简单……听上去似乎很简单,但实际上上述例子仅贴图展示以及未说明的地方有以下几个要点。
HeightField的大小和网格间距
Unity要求HeightField分辨率为2的幂次方+1,也就是说,应该是65、189、257、513诸如此类的字样。
对于Sampling,则使用Corner。据文档描述,Houdini使用的Center采样会在转换为Unity地形时出现浮点计算错误。
对于Grid Spacing,使用1或2的幂次方进行控制,Size也是如此。
总之,在HDA的输出节点点击鼠标中键,即可看到HeightField的信息:
分块输出
如果地形过于庞大,以至于不得不分块输出,则在HDA里连上一个HeightFieldTileSplit节点。
HeightField Layer
HeightField实际上是一个Volume,由height和mask两个Layer组成。如果要传递更多的地形信息,就要制作更多的Layer,上个例子中,我们用中间可以看到,地形腐蚀后出现了非常多的Layer:
除了mask和height外,还有水体、砂岩、碎片、沉积这4层。而打开导入到Unity的地形,选择Paint Texture,查看Layer Palette,恰好正是这四个:
如果我们直接替换这几个Layer会怎么样?
显然是可以的,但如果我们为Layer指定更多参数,可以直接完成这件事情。在文档中,Houdini HeightField和Unity地形之间存在着特定的字段接口,用于传输信息,例如如果我们为unity_hf_terrainlayer_file字段指定了具体的Layer路径,显然,我们可以直接完成这件事情。
下面丰富一下HDA,我们需要测试一下:
这里简单的用两个HeightField Mask By Feature节点,以高度为0为边界线,将上层保存到名为grass的Layer,将下层保存到名为water的Layer。
最后,在Group里分别指定这两个组,为其Primitive附上unity_hf_terrainlayer_file字段的属性,这个属性值为工程中的TerrainLayer路径。重新保存HDA并导入,在拖进去的一瞬间,我们就会发现,无需手动分配TerrainLayer,效果即成。
地形的细节流程
Unity地形支持笔刷刷树、草等预制件或者细节,对于大多数场编来说,这些活相比都很痛苦……当然,使用Houdini可以一定程度上缓解。这种撒放类的内容有两种做法,第一种是将这些点以点云的形式输出,unity_instance字段的属性可以帮助这些点找到在Unity工程里的预制体,而后插件会把这些预制物的实例添加到点云上。文档指出,这种方法只对小数量情况表现较好。
TreeInstance
对于树这些大规模使用量的预制件而言,更好的方式是使用TreeInstances和TreePrototypes,后者允许设置预制体的列表,而前者则设置每个点上的实例化数据,通过这种方法可以有效的撒布数十万规模的预制物。
我使用的Unity Terrain - HDRP Demo Scene包含了下面六种树。
在撒点之前,让我们稍微正式的做一个HDA:
这里先用detail的【unity_hf_tree_prototype+索引id】的属性,设定了6种树木在Unity中的路径,随后分别针对大中小三种树木做了三次撒点,然后对于每一种点云单独设置了他们使用哪一个索引的树木,最后稍微设置一下。关于TreeInstance/TreePrototype的属性,可以参见文档Terrain (Height Fields)中关于Tree Instances的一节。
导入之后,无需任何操作,即可看到这样的效果。
Detail Layer
对于草、碎尸这些东西,可以用Unity地形的细节层级进行导入。在原先的HDA上稍作修改:
因为Detail Layer并不需要与地形完全同等的尺寸,那样既浪费,又很难达成自然的渐变效果。所以这里是选择先用blast切出一层,然后用HeightField Resample节点调整下大小,再开始生成mask,最后把这个Layer合并回去:
可以看到这个Layer大小是只有32*32。关于这个用作为Unity地形Detail Layer的HeightField Layer,如何标记可以看Terrain (Height Fields)中关于Detail Layer的一节(话说写到这里我才想起其实可以直接用AttributeWrangle进行标注,比AttributeCreate节点可读性高多了)。
导入之后看看效果:
我去,怎么变白了?
莫慌,这里是因为HoudiniEngine For Unity插件并没有控制开启GPU Instancing的字段,所以假如你的细节物品材质球开启了GPU Instancing,那么这一步需要自己手动切换(老实说,蠢得不行)。看下切换之后的效果:
小结
这篇屌文是周日的时候临时起意摸的,总的来说感觉Houdini to Unity的流程就一个字——难用。
H端这边,啥玩意儿都套字段里;U端这边,就一个HDA把面板一敞,一种爱用用不爱用别用的躺平感。我尼玛是有点醉的,不好说这玩意儿是不是敷衍人,后面摸Houdini to UE的时候再看看。
看了下本地文章有几个能发知乎的,妈的,合着我这下半年个人成长是一点几把毛都没有,我可能是当螺丝钉当傻了……日。
最后我还要吐槽下知乎的md文档功能,真的……算了,不说了
noobdawn_grassdetail.hda
48.2K
· 百度网盘
noobdawn_SimpleErode.hda
63.1K
· 百度网盘
noobdawn_treescatter.hda
46.9K
· 百度网盘 大佬,最近我也在研究houdini地形,然后公司地编觉得没有worldcreator好用[捂脸]虽然本着谁干活谁选工具这个原则,但我就是不太爽,有什么办法驳倒他吗?[捂嘴] 没用过wc,不过一个比较便捷的方法是声称Houdini可集成的方案多,如果打通了那就是一键全栈,对项目成本更加友好;如果用wc做,势必有额外学习成本,这部分成本既是隐性的人力成本,又给项目增加了额外的风险(多学习一个东西造成的水平问题)
总之能吹就行~还可以说Houdini是UE入股的,人家UE眼光不比你懂吗balabala~ 可以先在外部用worldcreator搭一个架子,出效果还是很快的。导入到项目后,再用houdini对地形进行二次修改[滑稽] 没用过wc,想问下wc在地形方面对h的优势是什么呢~? wc里有很多成熟的地形模板,而且操作简单快捷,参数和效果的同步程度也高(houdini稍微复杂一点就要wait[捂脸])麻烦的是后续修改要来回导入导出。个人理解houdini的优势是,TA做好hda之后让地编来用,可以在引擎内直接进行二次编辑,实时预览效果,避免导入导出。
页:
[1]