关于Unity3D动态生成连续性网格几何体总结【第一部分】(基础篇)

本文介绍使用Unity3D动态生成连续性网格几何体的方法,包括路径定义、模型模板创建及ScriptableObject数据管理等基础步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开篇

    南无阿弥陀佛
    苦海无涯,回头是岸

之前再逛油管的时候,发现女神Freya Holmér的动态生成几何体的技术视频的时候Procedural Geometry,觉得十分有趣,但是百度一下国内类似的文章,竟然全无相关资料。所以决定自己尝试跳跳这个坑,由于自己过于懒惰,周期有点长,因此时至今日才弄成文字。话不多说,上图为敬。

路径点

生成几何体
几何体正面
桥面

动态展示

生成模型的过程

简介

既然是技术文章,还是简单简绍一下技术内容。动态生成网格模型是通过一组固定路径点,经过一系列的曲线平滑技术,把路径直线转化为平滑的曲线,然后通过特定的模型模板与生成算法,生成一组动态网格模型,同时还需要动态计算网格的UV值分布以及法线朝向,同时还需要计算贴图的拉伸值,最终才能生成最终模型。

基础准备工作

本篇既是第一部分,那么此次内容就不涉及算法、逻辑等等复杂内容。我们就从最基础的模型模板与路径点的构成进行讲解。

路径部分

如日常生活中的道路一样,人需要按照自己的道路方向前进,同样我们也需要告诉电脑应该按照什么样的方向生成模型。那么构件一组路径点,自然就成为不二之选。为了好看,你可以通过lineRender组件把整个路径给串联起来,当然我这里偷懒了,用了Handle.DrawLine()API接口进行绘制,当然每个路径点用也是Handles.DrawSphere()绘制小球来表示。最后每个路径节点之间还需要进行平滑处理过渡
不然生成的模型的每一段会相互穿插在一起,如下图示,当然本篇暂时不涉及这部分内容,放在后面算法一起统一讲解。

DrawLine

路径点

没有平滑模型,相互挤压

非平滑路径生成的模型

模型模板

好嘞,终于进入本篇的核心内容,模型模板。万物有序,皆有规律而行。我们不仅需要告诉程序沿着什么方向生成,还需要告诉它,构件一个怎么样的模型。因此我们需要一个模型模板,来告诉它。如下图所示。
原始模型模板

原始模型

客官,你觉得到这里就可以直接用于生成了么。答案是:不可以。让我们一步一步来揭开它神秘的面纱。首先我们来看看这个模型的顶点分别,如图示:
在这里插入图片描述

顶点分别图
敢问客官,您看出点门道来么?是的,它的顶点是无顺序,换句话说,就是该模型的顶点顺序是没有连续性且没有任何规律而言。制作该模型的模型君为此也很头疼。那怎么办呢?答案只有一个:只能发扬我们无产阶级的吃苦耐劳的伟大精神。囧,手动建模,把模型的整体重新梳理一篇,重新构造一个模型模板。最终模型顶点顺序如图示:

整理顺序

整理后的模型

P.S:冗余顶点是为了处理后面UV值的问题,后续篇章会讲到

模板数据文件的保存与管理

前面几个段落,讲解了模型模板的构成。这里讲解如何构件与保存新模型文件。

新的模型数据模板

鉴于生成算法对模型顶点顺序连续性与规律性的特殊要求,因此之前模型君提供过来的FBX模型文件就不能直接作为模型模板了,囧。所有我们选择一种新的方案,那就是ScriptableObject脚本文件。具体内容格式如图所示:ScriptableObject

ScriptableObject基本内容
顶点数据结构

顶点相关参数

顶点相关参数数据

在ScriptableObject数据结构的Vertices里,分别包含Vertices、UV、Normal这三部分内容,分别对应模型顶点位置UV值法线朝向。其中顶点位置UV值可以根据原来FBX模型中的顶点与UV值直接映射过来,无需改动,但是法线朝向要与Z轴方向保持一致,因此Z值要设置为1,图中法线值有误,不应该是-1

三角形数据结构

三角面结构体参数

三角面结构体数据

在ScriptableObject数据结构的Triangles里,包含 FirstVerticeSecondVerticeThridVertice三部分内容,分别是构成三角面的三个顶点序号,且这三个顶点序号一定要是重新梳理后的顶点的顶点序号。

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动态生成连续性网格几何体总结【第三部分】(贴图篇)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值