关于Unity3D动态生成连续性网格几何体总结【第一部分】(基础篇)
开篇
南无阿弥陀佛
苦海无涯,回头是岸
之前再逛油管的时候,发现女神Freya Holmér的动态生成几何体的技术视频的时候Procedural Geometry,觉得十分有趣,但是百度一下国内类似的文章,竟然全无相关资料。所以决定自己尝试跳跳这个坑,由于自己过于懒惰,周期有点长,因此时至今日才弄成文字。话不多说,上图为敬。
简介
既然是技术文章,还是简单简绍一下技术内容。动态生成网格模型是通过一组固定路径点,经过一系列的曲线平滑技术,把路径直线转化为平滑的曲线,然后通过特定的模型模板与生成算法,生成一组动态网格模型,同时还需要动态计算网格的UV值分布以及法线朝向,同时还需要计算贴图的拉伸值,最终才能生成最终模型。
基础准备工作
本篇既是第一部分,那么此次内容就不涉及算法、逻辑等等复杂内容。我们就从最基础的模型模板与路径点的构成进行讲解。
路径部分
如日常生活中的道路一样,人需要按照自己的道路方向前进,同样我们也需要告诉电脑应该按照什么样的方向生成模型。那么构件一组路径点,自然就成为不二之选。为了好看,你可以通过lineRender组件把整个路径给串联起来,当然我这里偷懒了,用了Handle.DrawLine()API接口进行绘制,当然每个路径点用也是Handles.DrawSphere()绘制小球来表示。最后每个路径节点之间还需要进行平滑处理过渡
不然生成的模型的每一段会相互穿插在一起,如下图示,当然本篇暂时不涉及这部分内容,放在后面算法一起统一讲解。
模型模板
好嘞,终于进入本篇的核心内容,模型模板。万物有序,皆有规律而行。我们不仅需要告诉程序沿着什么方向生成,还需要告诉它,构件一个怎么样的模型。因此我们需要一个模型模板,来告诉它。如下图所示。
客官,你觉得到这里就可以直接用于生成了么。答案是:不可以。让我们一步一步来揭开它神秘的面纱。首先我们来看看这个模型的顶点分别,如图示:
P.S:冗余顶点是为了处理后面UV值的问题,后续篇章会讲到
模板数据文件的保存与管理
前面几个段落,讲解了模型模板的构成。这里讲解如何构件与保存新模型文件。
新的模型数据模板
鉴于生成算法对模型顶点顺序连续性与规律性的特殊要求,因此之前模型君提供过来的FBX模型文件就不能直接作为模型模板了,囧。所有我们选择一种新的方案,那就是ScriptableObject脚本文件。具体内容格式如图所示:
顶点数据结构
在ScriptableObject数据结构的Vertices里,分别包含Vertices、UV、Normal这三部分内容,分别对应模型顶点位置、UV值、法线朝向。其中顶点位置与UV值可以根据原来FBX模型中的顶点与UV值直接映射过来,无需改动,但是法线朝向要与Z轴方向保持一致,因此Z值要设置为1,图中法线值有误,不应该是-1 。
三角形数据结构
在ScriptableObject数据结构的Triangles里,包含 FirstVertice、SecondVertice、ThridVertice三部分内容,分别是构成三角面的三个顶点序号,且这三个顶点序号一定要是重新梳理后的顶点的顶点序号。
ScriptableObject代码
既然是一篇技术类文章,没有一点代码显得是那么的不接地气。所以我们还是把ScriptableObject的代码粘贴在下面。
public abstract class TempletObjectBase : ScriptableObject
{
public string TypeName;
public string ModelName;
public List<VerticesData> Vectices;
public List<TriangelData> Triangles;
public Material SurfaceMaterial;
public Material SectionMaterial;
public object AssetDatabase { get; set; }
[Serializable]
public class VerticesData
{
public Vector3 Vertices;
public Vector2 UV;
public Vector3 Normal;
}
[Serializable]
public class TriangelData
{
public int FirstVertice;
public int SecondVertice;
public int ThridVertice;
}
}
[CreateAssetMenu(menuName = "Templet/Create Tunnel")]
public class Tunnel : TempletObjectBase
{
}
传送门
上一篇 :关于Unity3D动态生成连续性网格几何体总结【第二部分】(算法篇)
下一篇 :关于Unity3D动态生成连续性网格几何体总结【第三部分】(贴图篇)