找回密码
 注册帐号

扫一扫,访问微社区

技术讨论 生成mesh时生成不全的问题

4
回复
532
查看
[ 复制链接 ]
7日久生情
2002/5000
排名
925
昨日变化

12

主题

358

帖子

2002

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
2401
好友
2
蛮牛币
4348
威望
0
注册时间
2013-8-21
在线时间
514 小时
最后登录
2020-7-1

活力之星

2019-11-21 17:52:52 显示全部楼层 阅读模式
50蛮牛币
通过读取外部的顶点数据文件进行mesh的生成过程中,使用的模型顶点数少的话,生成出来的模型就很完整,但是如果数据一多,生成出来的mesh模型就出现了很多地方没有生成,出现破面的情况,希望遇见过或知道原因的大佬指导指导

顶点数据多时生成

顶点数据多时生成

顶点数据少时生成

顶点数据少时生成
代码.png
回复

使用道具 举报

7日久生情
2002/5000
排名
925
昨日变化

12

主题

358

帖子

2002

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
2401
好友
2
蛮牛币
4348
威望
0
注册时间
2013-8-21
在线时间
514 小时
最后登录
2020-7-1

活力之星

楼主 2019-11-22 10:47:17 显示全部楼层
我自己的处理方式就是:将所有的顶点数按照一定的比例,最好是能够被3整除的比例进行分割,这样的话每一个单独的mesh的个数就不会很多,就能够完整的显示出来,具体代码如下:
[C#] 纯文本查看 复制代码
    public void CreateObject(string _path,List<Vector3> _vertices,List<Vector3> _normals,List<int> _triangles)
    {
        //根节点
        GameObject root = new GameObject(Path.GetFileNameWithoutExtension(_path));
        root.transform.localPosition = Vector3.zero;
        root.transform.localScale = Vector3.one;

        int count = _normals.Count / singleTrianglesNumber;
        count += (_normals.Count / singleTrianglesNumber > 0) ? 1 : 0;

        for (int i = 0; i < count; i++)
        {
            GameObject child = new GameObject(Path.GetFileNameWithoutExtension(_path) + "_" + i);
            child.transform.SetParent(root.transform, false);
            child.transform.localPosition = Vector3.zero;
            child.transform.localScale = Vector3.one;

            MeshFilter mf = child.AddComponent<MeshFilter>();
            MeshRenderer mr = child.AddComponent<MeshRenderer>();
            Material mat = new Material(Shader.Find("Standard"));
            //Custom/TwoSided       Standard

            int startIndex = i * singleTrianglesNumber * 3;
            int length = singleTrianglesNumber * 3;

            if ((startIndex + length) > _vertices.Count)
            {
                length = _vertices.Count - startIndex;
            }

            if (length > 0 && startIndex <= _vertices.Count)
            {
                List<Vector3> vertices = _vertices.GetRange(startIndex, length);
                List<Vector3> normals = _normals.GetRange(startIndex, length);
                List<int> triangles = _triangles.GetRange(0, length);

                Mesh mesh = new Mesh();
                mesh.name = child.name;
                mesh.vertices = vertices.ToArray();
                mesh.normals = normals.ToArray();
                mesh.triangles = triangles.ToArray();
                mesh.RecalculateNormals();
                mf.mesh = mesh;
                mr.material = mat;
            }

            if ((startIndex+length) >= _vertices.Count)
            {
                break;
            }
        }
    }
回复

使用道具 举报

5熟悉之中
572/1000
排名
6684
昨日变化

4

主题

37

帖子

572

积分

Rank: 5Rank: 5

UID
157026
好友
1
蛮牛币
372
威望
0
注册时间
2016-7-15
在线时间
331 小时
最后登录
2020-4-24
2019-11-21 18:26:31 显示全部楼层
分UV了吗
回复

使用道具 举报

7日久生情
2002/5000
排名
925
昨日变化

12

主题

358

帖子

2002

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
2401
好友
2
蛮牛币
4348
威望
0
注册时间
2013-8-21
在线时间
514 小时
最后登录
2020-7-1

活力之星

楼主 2019-11-22 10:40:15 显示全部楼层

没有加UV,但是我找到处理方式了,就是在生成mesh的时候按照一定的比例进行分割,将整体分割成多个小的mesh就没有问题了
回复

使用道具 举报

3偶尔光临
277/300

1

主题

209

帖子

277

积分

Rank: 3Rank: 3Rank: 3

UID
341351
好友
0
蛮牛币
516
威望
0
注册时间
2020-2-27
在线时间
67 小时
最后登录
2020-7-5
2020-3-1 18:14:28 显示全部楼层
6666666666666666
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则