UE4程序化建模工具开发教程「植被建模」(ue4程序化植物)
Unreal Engine最好的部分之一就是它对那些偏艺术的人来说是无障碍的。随着虚幻引擎4的首次发布,人们发现自己可以制作整个游戏,而不必触及C 。从那时起,人们一直在挑战蓝图的极限,Epic则通过更新扩展工具集来做出回应。
Unreal引擎中一个非常强大的部分是程序化网格(procedural mesh)组件,它接收数组输入并输出静态网格。
将程序化网格与渲染到纹理(render to texture)功能相结合,可以完全在引擎中程序化地创建纹理资源!
这很有用,因为:
- 你可以准确地看到资产在构建时的外观。
- 在构建资产时就可以在其环境中看到该资产。
- 更新都是实时的。
这有大量的潜在应用,我一直在研究风格化的植被(Foliage)生成,对于传统建模工具而言这是一个痛苦的任务,而程序化网格则非常适合用于解决这个问题,因为游戏树主要由简单的形状(圆柱体和平面)组成,并且更多地是关于这些形状的正确放置和轻微变化,而不是它们各自的复杂性。
使用程序网格组件构建的一些树:
如果你有兴趣试用该工具,可以在此处下载。
使用此工具时,我建议增加项目设置中的最大循环计数(Max Loop Count)。如果超过项目设置的最大循环计数,我们的几何图形将无法正确构建!
1、程序化创建三角形
让我们从简单的网格对象开始,渲染一个三角形。创建新的Actor蓝图并添加程序化网格组件。创建DrawTriangle函数,并将其插入到构造脚本中:
添加两个数组:
- 向量数组,用来表示顶点
- 整数数组,用来表示顶点数组的目标索引
在这里我们有三角形的三个顶点和创建该三角形所需的整数顺序。注意我们需要列出顶点的顺序,如果存储0,1,2,则三角形将会方向错误。
程序化网格组件输出到Create Mesh Section(创建网格截面)函数,并将上述数组链接到对应的输入中。
嘿!我们成功制作了一个三角形!
2、程序化创建平面
现在让我们更复杂一点,做一个平面。首先需要添加更多的数组。我们需要补充:
- 法线向量数组
- 切线结构向量数组
- UV二维矢量数组
别担心,我们将用一些小技巧获得法线和切线!
请记住,就像以前一样,我们需要先清理数组数据。
然后创建Draw Quad函数,并添加两个嵌套循环,用来处理x 和 y的每个 值。
然后取当前的 x 和 y 值,乘以一个值(距离),并将其添加到向量数组中,最后将UV当前 x 和 y 值除以其总计(长度)以获得归一化值。
然后,我们可以使用Create Grid Mesh Triangles(创建网格三角形)功能自动生成指定数量的三角形。虽然以后无法使用它,但就目前而言,这是生成三角形数据网格的简单方法。
我们还需要法线和切线,这样我们就可以使用Calculate Tangents for Mesh(计算网格的切线)函数来得到结果。
下面是最终得到的完整函数,点击链接查看放大的视图:
下面是构造脚本:
结果:
3、程序化创建圆柱体
一旦有了网格,将形状从平面更改为圆柱体就是一件简单的事情:我们不再将定点与网格对齐,而是将它们缠绕在轴上。
取我们之前创建的 X 和 XLength 值,将它们相除以得到归一值,然后乘以 360,从而得出角度。我们希望围绕 z 轴旋转 x 轴,因此获取这些值并将它们插入,并通过与浮点数相乘来控制距离。
像这样将此新计算与原始的 x*float 交换,点击链接 查看大图。
现在我们的平面就变成了圆柱体!
如果我们取归一化的y或z值,并用1-x反转,则创建一个圆锥体!
4、读取网格数据
我们需要的最后一个元素是读取网格数据。Get Section from Static Mesh(从静态网格体获取截面)函数可以从任何网格中获取数据并输出供我们使用。现在,我们可以对任何网格进行采样,对其进行修改,然后将其散布在表面上。
现在,我们已经有了构建程序化内容所需的基础。在下一部分中,我们将介绍如何利用这些工具制作一个简单的树生成器。
5、程序化生成植被
在深入研究植被生成工具开发之前,我强烈建议你下载并尝试一下,否则我们将讨论的一些主题将非常抽象!你可能还会注意到一些未涵盖的对pivot painter的引用。这是我目前正在开发的额外功能,尚未完成!
树叶工具分为五个单独的蓝图:
1、父蓝图 Tree Parent
- 保存将在所有子项之间共享的数据。
- 树干、树枝和树叶蓝图均继承自它。
2、树干 Trunk
- 继承自Tree Parent
- 样条控制的网格
- 只制作一个网格
- 提供大量用户控制
3、树枝 Branch
- 继承自Tree Parent
- 沿表面或随机生成多个树枝
- 用户控制仅限于随机变量范围
- 可以相互叠加
4、树叶 Leaf
- 继承自Tree Parent
- 读取网格数组并沿树干/树枝或随机放置
- 不能有子节点
5、合成器 Compositer
- 以TreeParent数组为输入,将网格重建为单个资产
- 检测并合并重复材质,以减少材质数量
你可能会想,为什么要这样做!?好吧,分解树有多种好处:
- 在层次结构上进行更改时不必重绘整个网格
- 快速分离和隐藏资产的元素
- 删除部分而不会破坏整个树
- 资源将组件化,因此可以将树的一部分复制粘贴到其他树上
- 拆分随机种子生成,以便获得更多控制
所有这些元素结合在一起,让用户构建一个模块化的组件堆栈,这些组件"应该"允许他们制作任何类型的树!
6、父蓝图 – Tree Parent
为了避免重复工作,我们应该首先创建一个作为基础的父蓝图,其他蓝图需要继承父蓝图。这很有用,因为我们放入父蓝图中的任何数据都将在其后代蓝图中共享。例如,每个资产类型都需要一个材质引用和一组网格数组,以便将信息添加到父级,以便传播到其子级。