Unity Mesh:顶点数超过65000的绘制方法

该博客介绍了在Unity中如何通过拆分Mesh来绘制超过65000个顶点的3D模型。核心代码展示了从STL文件读取数据并创建多个GameObject,每个GameObject包含一部分顶点,从而规避Unity的单个Mesh顶点限制。文章还提供了完整的工程参考链接。

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

Unity Mesh:顶点数超过65000的绘制方法

核心代码

    在Unity中,单个Mesh绘制的顶点数不能超过65000,当需要绘制顶点数超过65000个的模型时,需要将模型进行拆分绘制。
核心代码如下:

    private void CreateInstance()
    {
        string fullPath = "D:\\UnityProject\\DrawMesh\\Assets\\ImportSTL\\徽章.stl";
        int gameObjectCount = 60000;//代表一个物体中包含多少个点(Unity中单个Mesh顶点数量最多为65000个)

        _total = int.Parse(_trianglescount);
        _number = 0;
        _binaryReader = new BinaryReader(File.Open(fullPath, FileMode.Open));

        //抛弃前84个字节
        _binaryReader.ReadBytes(84);

        _vertices = new List<Vector3>();//存储三角形顶点坐标
        _triangles = new List<int>();//存储三角形索引

        while (_number < _total)
        {
            byte[] bytes;
            //每50个字节一组,存储着三角形的法矢量和三个点的顶点数据
            bytes = _binaryReader.ReadBytes(50);

            if (bytes.Length < 50)
            {
                _number += 1;
                continue;
            }
            //这里只用了三角形的顶点数据,忽略矢量
            Vector3 vec1 = new Vector3(BitConverter.ToSingle(bytes, 12), BitConverter.ToSingle(bytes, 16), BitConverter.ToSingle(bytes, 20));
            Vector3 vec2 = new Vector3(BitConverter.ToSingle(bytes, 24), BitConverter.ToSingle(bytes, 28), BitConverter.ToSingle(bytes, 32));
            Vector3 vec3 = new Vector3(BitConverter.ToSingle(bytes, 36), BitConverter.ToSingle(bytes, 40), BitConverter.ToSingle(bytes, 44));

            _vertices.Add(vec1);
            _vertices.Add(vec2);
            _vertices.Add(vec3);

            _number += 1;
        }

        //将索引写入列表中,值为0到每个物体中顶点个数减一
        for(int triNum = 0; triNum < _vertices.Count; triNum++)
        {
            int gameObhectIndex = triNum / gameObjectCount;//标记着当前正在给第几个物体赋值
            _triangles.Add(triNum - gameObhectIndex * gameObjectCount);
        }

        for (int meshNumber = 0; meshNumber < _vertices.Count; meshNumber+=gameObjectCount)
        {
            //创建GameObject
            GameObject tem = new GameObject(Path.GetFileNameWithoutExtension(fullPath));
            tem.name = meshNumber.ToString();
            MeshFilter mf = tem.AddComponent<MeshFilter>();
            MeshRenderer mr = tem.AddComponent<MeshRenderer>();
            
            Mesh m = new Mesh();
            mr.name = meshNumber.ToString(); 
            if ((_vertices.Count - meshNumber) >= gameObjectCount)
            {
                m.vertices = _vertices.ToArray().Skip(meshNumber).Take(gameObjectCount).ToArray();
                m.triangles = _triangles.ToArray().Skip(meshNumber).Take(gameObjectCount).ToArray();
            }
            else
            {
                m.vertices = _vertices.ToArray().Skip(meshNumber).Take(_vertices.Count - meshNumber).ToArray();
                m.triangles = _triangles.ToArray().Skip(meshNumber).Take(_vertices.Count - meshNumber).ToArray();
            }
            m.RecalculateNormals();

            mf.mesh = m;
            mr.material = new Material(Shader.Find("Standard"));

            _binaryReader.Close();
           
            //Debug.Log(tem.name + ":顶点数量 " + _vertices.Count);
        }
    }

需要注意的是,_triangles中存储的是索引,存储的值应当在0到gameObjectCount-1之间,以此循环。

完整工程

Unity绘制STL格式模型

参考链接

Unity导入STL格式模型(一)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值