对于我的世界末日
移框游戏
,我需要用不同的城市填充一个非常
广阔的开放世界。 我们的团队只有3个人,所以我当然使用了Houdini的程序能力!
之前,当我不了解Houdini时,我用C#编写了自己的工具,用于为Unity生成过程网格。 添加新功能是一个漫长的过程,当我听说Houdini专为此类任务而设计时,我立即切换到了它。 我尝试了各种生成城市和街道的方法,在本文中,我将简要介绍一下我最终用于游戏的技术。
首先,我创建了一个工具,用于生成可在城市中使用的街道网络。 我的决定基于
此处介绍
的概念以及引用的文章。 关于张量场和特征向量有很多讨论,并且所有内容都是从技术上写的,但简而言之可以解释如下:对于我的情况(在浮雕上生成路网),我需要生成轮廓浮雕线以及垂直于它们的线。
我从浮雕开始,在Houdini Gubbins示例的帮助下,我在浮雕的指向路径的每个点生成了矢量,并使用VEX生成了渐变线:
黄色矢量显示轮廓线。
然后,我们需要创建一个城市街道网格,并将其向量与重复浮雕自然曲线的向量混合。 因此,我们将创建一个类似于城市街道网格的区域,并与浮雕很好地结合在一起。 在这里,我们将网格放在凸版上,然后进行多重成帧,以使法线沿着网格线对齐,添加衰减以平滑混合,最后设置一个新的路径矢量,该矢量是两个矢量的混合:
在上图中,您可以看到在矩形的边界内,轮廓线更像是网格。 我还执行类似的过程,以将手动创建的道路的影响添加到游戏中。 我在Unity HDA中引入了一个滑块,以便可以通过在城市范围内创建更自然的位置或更多的“方形”街道来更改影响力。
接下来,我将矢量场转换为VDB,以便您可以从中采样以创建现成的道路。 通过SOP体积跟踪,您可以得到漂亮的可视化效果:
它已经开始看起来像是街道的网格! 它们彼此之间太近了,但是通常已经存在形式。 然后,我们从VDB速度和许多vex执行许多采样操作,以创建现成的道路线。 vex代码本质上是将道路布置到正确的距离,并在距离其他道路太近或太长时将其终止:
然后,我们执行后处理,以平滑所有内容,移除小零件,加长死角以创建逼真的相交点并在地形上铺设道路。 最终结果如下所示:
仍然有一些不切实际的部分,但是考虑到我们节省了多少时间,在Unity中进行一些手动清理是可以接受的。
因此,我们从程序上生成了城市街道网络,但结果只是Houdini中的一堆曲线。 现在,我将向您展示如何为每条曲线生成道路几何形状,以创建可在Unity中使用的网格。 这是我们先前移植到Unity的结果:
首先,您需要说明如何在Houdini和Unity之间进行数据传输。 对于道路,我将点,道路的宽度和路面预设的序列写入JSON文件。 在Unity中,我创建了用于使用Bezier曲线手动编辑道路的编辑器工具:
您可以在搜索引擎上找到很多有关在Unity中创建Bezier曲线编辑器的教程。 要将数据传输回Houdini,我使用Python节点读取JSON文件:
在这里,您可以看到上面创建的城市街道网络的结果,但是这次是从JSON文件读取的,因为现在是通过手动更改从Unity获取的。
我还从Unity导入救济,读取其原始数据。 今天也许可以使用HDA在本地完成,因为Houdini Engine改进了对Unity地形的支持,但是当我完成这项工作时,它仍然不是很好。
然后创建交点。 此处的主要工作由“相交针迹SOP”完成,但是我还使用VEX稍微延长了道路,以防它们未完全相交,并删除了短端,以便正确创建T型相交。
接下来,我借助交点处的衰减创建一组交点,在该交点处,弱化距离等于道路交点处的最宽距离。 然后,在两条道路之间的角度小于45度的情况下,我扩展这组边,以便在相交的两端之间有足够的空间来创建所需宽度的网格:
VEX节点中的计算找到了直角三角形的斜边(我们可以假设相交的每个部分都由两个直角三角形组成):
由于我们知道交叉路口的道路宽度(上图中用A表示)并且知道了角度α,因此我们可以计算C来找到需要扩展交叉路口以将其除以所需宽度的距离。
然后,我们创建桥组,突出显示距地面一定距离的道路段。 这是通过使用Ray SOP启用“点相交距离”并关闭“变换点”来完成的。 接下来,要为闭合的几何图形创建现成的曲线,我们使用Polycut剪切相交和桥梁组,以便仅保留普通道路。
现在我们终于开始创建真实的网格物体了。 创建相交网格的子网是“
求解相交”教程的修改版本。 产生道路几何形状的子网也会闭合线并产生UV。 HoudiniSimon创建了另一个
很棒的教程 。 它告诉您如何生成UV以弯曲闭合曲线,但是本教程的第一部分可以应用于开放曲线。
然后,我刚刚创建了一些组来应用材质,以使用从Unity中的曲线中获取的roadPreset属性。
接下来,我们创建桥梁的几何形状。 下图所示的网络迭代地穿过所有先前创建的桥组,并根据地面上方的高度,长度和曲折度,插入散装或拱形桥。 我将考虑在单独的教程中创建拱桥,而体桥使用出色的Gamedev Sweep Geometry SOP,并启用了开始和结束组,以沿桥曲线闭合先前创建的桥几何。
结果:
这些桥网格包括手动建模的开始/结束/中间部分,可变形的部分以及使用Gamedev Sweep Geometry SOP沿曲线复制的部分。 手动创建的几何和组如下所示:
选择了中心组,并且端点在bridgeStart和bridgeEnd组中,这些组由几何闭合节点使用。
我们将桥稍微挤压一下,以形成一个路堤,并在上面铺上砾石纹理,从而完成桥梁的建造。 还为某些类型的道路的交叉点设置了几个布尔变量。 例如,如果一条土路与一条高速公路相交,则会被截断。
最后,我们保存所有几何图形以供Unity和其他Houdini工具使用。 我们将道路网格划分为较小的片段,并将其导出为FBX,还将数据保存在.bgeo文件中,以便以后使用。
在Unity中:
希望您喜欢我们对Houdini道路几何图形创建过程的简短描述。 在下一篇文章中,我将讨论创建道路标记和平整地形以使其更紧密地匹配道路。