找回密码
 注册帐号

扫一扫,访问微社区

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

3
回复
171
查看
[ 复制链接 ]
7日久生情
1985/5000
排名
927
昨日变化

12

主题

358

帖子

1985

积分

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

UID
2401
好友
2
蛮牛币
4358
威望
0
注册时间
2013-8-21
在线时间
497 小时
最后登录
2019-12-6

活力之星

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

顶点数据多时生成

顶点数据多时生成

顶点数据少时生成

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

使用道具 举报

7日久生情
1985/5000
排名
927
昨日变化

12

主题

358

帖子

1985

积分

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

UID
2401
好友
2
蛮牛币
4358
威望
0
注册时间
2013-8-21
在线时间
497 小时
最后登录
2019-12-6

活力之星

楼主 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熟悉之中
548/1000
排名
6686
昨日变化

4

主题

34

帖子

548

积分

Rank: 5Rank: 5

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

使用道具 举报

7日久生情
1985/5000
排名
927
昨日变化

12

主题

358

帖子

1985

积分

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

UID
2401
好友
2
蛮牛币
4358
威望
0
注册时间
2013-8-21
在线时间
497 小时
最后登录
2019-12-6

活力之星

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

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

使用道具 举报

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

本版积分规则