使用Houdini为Unity创建程序化环境

Unity官方平台 2019-08-23
本文由来自英国的技术美术专家Marina Alexandra Bade,介绍如何使用Houdini为Unity创建程序化环境工具Shanty Town。

项目背景

2018年3月,我与3个成员组成的团队计划制作一款跑酷游戏,它包含超级跳和平移跳等机制。

游戏背景故事发生在一个充满自然灾害和洪水的世界,人类只剩最后的聚居地。他们必须使用找到的所有资源,在被冲洗过后的建筑废墟上建立新的家园。


我的主要目标是制作一款工具,让游戏及关卡设计师能在游戏环境中快速填充大型的关卡。虽然这个项目由于时间期限没能完成,但我还是一定程度上完成了该工具,实现了它的功能,该工具的核心要素是Houdini Engine for Unity。

该插件能够在Houdini中创建数字资产并应用在Unity中。该资源的参数会在Unity中显示,用于自定义控制。参数数值会在Houdini中计算,然后发送到Unity中实时查看结果。得到的结果可以烘焙并保存为游戏对象,或是之后再进行调整。

生成建筑

建筑物是根据“垒方块”(Stack boxes)算法生成的。方块会在特定大小的边界内创建,该工具每次迭代都会添加方块。

我们可以使用宽度和高度参数控制房屋的大小。房屋的迭代过程可由参数控制,从而控制房屋的复杂度。工具中的每一个参数都使用了一段种子代码作为随机数生成器。


建筑模式

该程序化工具拥有两种不同的构建模式:随机模式和自定义模式。

随机模式会在特定边界内随机生成所有参数,可以激发用户的创意,实现快速环境生成。在对随机模式进行大量开发后,我发现游戏及关卡设计师需要对环境拥有更多控制权,所以我添加了自定义模式。

自定义模式能够通过输入大小数值来预先定义房屋的样子。不管房屋处在高台上,还是建在桩柱上,或者没有地基的房屋,该工具都能实现控制。墙壁材质可以根据为每一个房子进行单独设置。

该工具还拥有低多边形模式和高多边形模式。由于意识到复杂房屋的多边形数量容易过多,甚至达到不合理的数量,所以我添加了低多边形模式。该模式能将平面上所有镶板都烘焙成低多边形面片。

这些平面之后的处理方式和高多边形一样,这样我们能够准确预测高多边形墙壁的效果,从而使快速迭代更加简单并节省大量多边形,得到的效果却差不多。

如下图所示,高多边形墙壁网格,带有顶点颜色,可以轻松制作纹理和UV布局。


下图是低多边形模式和高多边形模式的对比。


材质分配

建筑包含的镶板数量和其骨骼的多边形数量一样。然而,镶板会经过裁剪以符合多边形的大小,所以每个多边形都只使用整块镶板的一小部分。

下图是墙壁材质分配流程。


材质被分配为房屋表面的属性,但当发现如果一面墙只使用一种材质,看起来会非常不自然。所以我通过使用随机起始值灵活地提高了材质数量,使效果看起来更好。

下图为墙壁上的材质属性分配。


每个材质集群都单独处理,共享边缘会被偏移,从而实现不那么统一的外观,然后选中材质来使用。材质的可选项有金属板,木板或瓦楞金属。

每个面都会选择高多边形模式的金属板或低多边形模式的装饰板变体。材质类型在整个集群中保持不变。每个面都会用作标记,标出材质板或装饰板的随机部分,这样能够增加墙壁的外观变化。

我使用的节点都非常简单,但包含大量Vex脚本。该功能强大的原因是,它通过节点将许多简单代码片段和节点加入到复杂的网格中。我使用了大量算法检查相交情况、边界框的使用、属性转移、布尔值处理、点邻域、复制/标记、排序点和计算方向等内容。

窗户,门和道具的制作

我经常将点散布到表面上,例如墙壁或屋顶,用来实现道具和窗户的放置功能。门是最难放置的,因为门需要遵循合适的规则进行放置。

门共有两种:普通门面前是平地,阳台门不会与平地相连。为了得到合适的位置,我必须考虑当前检查的墙壁或面是否足够宽,足够高,从而容纳门的网格。而且,放置位置前方不能有其它房屋,那样会把门挡住,使门无法使用。

找到合适的面后,我会在光线投射的帮助下检查这些面的下方是否有地面。如果光线遇到了类型为地板,房顶或基础高台这样的几何体,该面就能生成普通门。如果没有遇到的话,它会生成阳台门。

我将这些面的底部中心隔离为原点后,我在工具中添加了一个参数,以决定门的数量。该参数会决定点的数量,以及这些面上所生成的门网格的变化。除此之外,门的基本形状也会被标记,然后从房屋方块凸出一部分以形成门的台阶。


窗户和道具的放置比较简单。由于将窗户随机散布在墙上的效果很奇怪,所以我决定在每个面上只生成一个窗户。

首先,我去除了不是四边形的面。然后检查面的大小,决定它将包含什么类型的窗户网格。窗户大小不能超过面的范围,因为这样窗户会在房屋墙壁外面。根据资源的参数,工具会选择符合表面大小的合适窗户。

为了在房顶和高台放置道具,我隔离了顶部的面用于生成道具,根据最大道具的最长宽度来插入道具,从而避免出现悬浮对象或对象与房顶相交的情况。然后,我通过输入参数在剩余表面区域上分散一定数量的点,这些点将作为特定比例随机道具的生成位置。

模块:创建网格

我根据概念艺术的草图来创建网格和整个房屋。


我在Blender创建中低多边形网格。然后使用masterxeon1001开发的HardOps插件来快速导出高多边形网格,将边缘和细节烘焙到中低多边形网格中。

我一共构建了超过50个模块,包括墙板、窗户、门口、各种道具、高台、遮阳棚、阳台、柱子和篱笆等。网格通过上面的方法来延伸或修改,由于它们都使用同样的大小来创建,所以可以互相组合和替换,而且放置时的原始方向都是Z轴正方向。


场景中的限制大多和多边形数量相关,大量网格会在一个建筑中多次使用。


灵活性

我的另一个项目重点目标是实现完整的灵活性,从而能够替换工具中使用的网格。该工具会从固定文件夹结构读取要使用的网格文件,所以这些网格可以轻松替换。

你可以在文件夹中进行替换,或者在Unity中拖放导入的文件。这样会完全改变导出的结果,只要提供正确的模块,就能通过简单的操作将棚户区改为东方城市。

由于Unity中的工具拥有和Houdini相同的参数,它们也具有相同的灵活性。所有参数都可以在Unity中查看和编辑。然而,每次在Houdini中进行修改时,我都需要在Unity中重新导入.hda文件并进行更新。

下图是Unity中一个简单城市示例。


材质放置

材质是按传统方法设置,这意味着每个网格所使用的材质都是我在Substance Painter中制作。

在制作纹理时,我实现了智能材质,这些材质能根据颜色标识图来分配金属或木质变体。如果我想修改其中一个基本材质,我可以重新导入贴图。

如果项目包含更多模块,建议在Substance Designer中使用Substance Automation Toolkit设置整个流程,在大型项目中是更好的做法。

纹理制作是项目中充满创意并能自由发挥的部分。我可以通过制作纹理为处理复杂技术任务。我尝试让模块尽可能逼真,让人感觉身临其境。

在下图中,你可以看到,遮阳棚是由塑料台布或旧窗帘布料制作的,因为这是人们触手可及的材料。墙壁上喷涂了标语,有时这些喷涂看起来因为某种原因中途停止。环境中还能看到手印和脚印。


使用和优化

在创建该工具时,我尝试着实现了项目制作时工具首次迭代所需的所有基础功能,其中包含了光照烘焙,不同细节层级以及可控和随机的建筑模式。

优化是一件没有止尽的工作,我仍在迭代各种问题,尝试更好地了解引擎,了解我要怎样利用它的功能。该工具没有固定的节点包,它相当灵活。

下图是Unity中的首次全景拍摄。

小结

使用Houdini为Unity创建程序化环境工具Shanty Town的创作过程为大家分享到这里。

来源: Unity官方平台
原地址:https://mp.weixin.qq.com/s/zX9GZwjrS19KL8Q15eNQtg



最新评论
暂无评论
参与评论

商务合作 查看更多

编辑推荐 查看更多