Unity3D开发之创建mesh

来源:互联网 发布:html5注册登陆源码 编辑:程序博客网 时间:2024/06/14 13:43

之前写过一篇博客,当时主要介绍的自绘地形并创建地形,着重介绍顶点排序处理以及分割三角形问题。当时由于着急,忽略了一些问题。之前写的创建mesh其实是有问题的,我只给mesh赋上顶点信息,并没有赋上法线信息以及uv信息。所以,本片博客着重讲下创建mesh过程。

首先我们需要获取到顶点信息,也就是组成这个mesh的所有三角形顶点信息。这里提醒下:一定不要省下那些重复顶点信息。一定不要省下那些重复顶点信息。一定不要省下那些重复顶点信息。有的人发现一个顶点被两次用到就在顶点数组中只写入一次,那样会给我们后来的其他信息赋值带来很多的麻烦,所以千万不要省。一个mesh由几个三角形组成,然后就依次将每个三角形顶点写入到顶点数组中。

如下图:我们要创建一个正方形mesh。

我们先将顶点信息写入进去,代码如下:

//每个顶点的位置信息    Vector3[] vertices = new[] {new Vector3(0,0,0),new Vector3(0,0,2), new Vector3(2, 0, 0) , new Vector3(2, 0,0), new Vector3(0, 0,2),new Vector3(2, 0, 2)};        //每个顶点的索引    int[] ints = new[] {0, 1, 2, 3, 4, 5};        //每个顶点的法线方向        Vector3[] normals = new[] {Vector3.up, Vector3.up, Vector3.up, Vector3.up, Vector3.up, Vector3.up};
顶点信息和索引是必须的,当没有赋值法线方向数组时,我们会发现mesh的光照信息会有错误,而且不能显示出来光影信息,所以法线方向是必须要赋值的。下面说下可有也可无的uv信息。

这个折磨我很久。当我们想在mesh上贴我们想要的贴图时,就必须要设置uv信息了。代码如下:

 //uv信息        Vector2[] uvs = new[]    {        new Vector2(0,0), new Vector2(0, 1), new Vector2(1, 0), new Vector2(1, 0), new Vector2(0, 1), new Vector2(1,1),        };    m.uv = uvs;
标准的正方形uv信息很好设置,每个点都是边界值、而当我们设置不规则的多边形时,我们就需要计算每个顶点然后去设置uv的值。我的方法就是获取所有顶点中X,Y最大和最小值。然后求的X最大值和最小值的差以及Y最大值和最小值的差,这样我们就固定出来了一个长方形的区域可以盖住我们的不规则多边形,然后我们计算每一个顶点的xy分量和对应分量最小值之差再除以对应分量的最大值与最小值之差。代码如下:

for (int i = 0; i < newVerList.Count; i++)        {            ints[i] = i;            normals[i]=Vector3.up;            pos = newVerList[i];            _kx = (pos.x - _v[0]) / _v[2];            _ky = (pos.z - _v[1]) / _v[2];            uvs[i]=(new Vector2(_kx, _ky));        }


private Vector3 getVector3(Vector3[] vs)    {        float ymin = vs[0].z;        float ymax = vs[0].z;        float xmin= vs[0].x;        float xmax = vs[0].x;        for (int i =1; i < vs.Length; i++)        {            if (ymin > vs[i].z)            {                ymin = vs[i].z;            }            if (ymax < vs[i].z)            {                ymax = vs[i].z;            }            if (xmin > vs[i].x)            {                xmin = vs[i].x;            }            if (xmax < vs[i].x)            {                xmax = vs[i].x;            }        }        //Debug.Log("xmin+"+xmin + "+xmax+"+xmax + "+ymin+"+ymin +"+ymax+"+ymax);        return new Vector3(xmin,ymin,xmax-xmin>ymax-ymin?xmax-xmin:ymax-ymin);    }
 然后我们就将每个顶点所求的比例值赋值到每个顶点的uv数组中。这样一张贴图就可以无缝的显示在多边形mesh上。下面是demo的完整代码。

using UnityEngine;[RequireComponent(typeof(MeshFilter))][RequireComponent(typeof(MeshRenderer))]public class CreatMyMesh : MonoBehaviour {// Use this for initializationvoid Start (){        //每个顶点的位置信息    Vector3[] vertices = new[] {new Vector3(0,0,0),new Vector3(0,0,2), new Vector3(2, 0, 0) , new Vector3(2, 0,            0), new Vector3(0, 0,2),new Vector3(2, 0, 2)};        //每个顶点的索引    int[] ints = new[] {0, 1, 2, 3, 4, 5};        //每个顶点的法线方向        Vector3[] normals = new[] {Vector3.up, Vector3.up, Vector3.up, Vector3.up, Vector3.up, Vector3.up};        //uv信息        Vector2[] uvs = new[]        {            new Vector2(0,0), new Vector2(0, 1), new Vector2(1, 0), new Vector2(1, 0), new Vector2(0, 1), new Vector2(1,1),        };        Mesh m = new Mesh();        m.vertices = vertices;        m.triangles = ints;        m.normals = normals;    m.uv = uvs;        GetComponent<MeshFilter>().mesh = m;}}

以上就是我在开发中解决的办法。希望对你有帮助。