Mesh网格绘制圆形和贴图

   //你的圆是由若干个小三角型组成的      
    public int n = 1000;

    public float r = 2;

    // Start is called before the first frame update
    void Start()
    {
        //画圆
        Mesh mesh = new Mesh();
        List<Vector3> v3 = new List<Vector3>();
        List<int> triangles = new List<int>();
        v3.Add(Vector3.zero);
        //每一份的弧度
        float ang = 2 * Mathf.PI / n;
        
        for (int i = 0; i < n; i++)
        {
            float x = Mathf.Sin(i * ang) * r;
            float y = Mathf.Cos(i * ang) * r;

            v3.Add(new Vector3(x, 0, y));
            triangles.Add(0);
            triangles.Add(i + 1);
            //vector2s.Add(new Vector2(x, y));


            if (i == n - 1)
            {
                triangles.Add(1);
            }
            else
            {
                triangles.Add(i + 2);

            }
        }
          mesh.vertices = v3.ToArray();
          mesh.triangles = triangles.ToArray();
          mesh.RecalculateNormals();
          GetComponent<MeshFilter>().mesh = mesh;
    }

这里的n是组成你圆形的三角形数量,r是这个圆的半径

写完上面的代码之后把他挂到一个空对象上或者一个cube上

通过上面的代码就可以获得一个圆形,如图下:

然后就是给这个贴图了,贴图的画需要用到算uv坐标了,如果你的脚本是挂载到一个cube上的话

那就先给那个cube附上图片,将图片直接拖拽到cube身上就可以,然后通过代码操作,代码如下

        Vector2[] uvs = new Vector2[v3.Count];
           for (int i = 0; i < v3.Count; i++)
           {
             uvs[i] = new Vector2(v3[i].x / r / 2 + 0.5f, v3[i].z / r / 2 + 0.5f);
           }
         mesh.uv = uvs;

这里的v3是你绘制这个圆的所有顶点的集合,通过下面的算法就可以做出下面的效果

如果挂载脚本的是空对象的话,在代码中可以加上这一行代码,如下

GetComponent<MeshRenderer>().material = Resources.Load<Material>("Materials/labu");

这一行代码的意思是把Resources下的Materials文件夹中的labu材质球给Mesh网格绘制出来的圆形贴上图片

最终代码是这样的,如下:

 public int n = 1000;
    public float r = 2;

    // Start is called before the first frame update
    void Start()
    {
        //画圆
        Mesh mesh = new Mesh();
        List<Vector3> v3 = new List<Vector3>();
        List<int> triangles = new List<int>();
        v3.Add(Vector3.zero);
        //每一份的弧度
        float ang = 2 * Mathf.PI / n;

        for (int i = 0; i < n; i++)
        {
            float x = Mathf.Sin(i * ang) * r;
            float y = Mathf.Cos(i * ang) * r;

            v3.Add(new Vector3(x, 0, y));
            triangles.Add(0);
            triangles.Add(i + 1);
            //vector2s.Add(new Vector2(x, y));


            if (i == n - 1)
            {
                triangles.Add(1);
            }
            else
            {
                triangles.Add(i + 2);

            }
        }
        Vector2[] uvs = new Vector2[v3.Count];
        for (int i = 0; i < v3.Count; i++)
        {
            uvs[i] = new Vector2(v3[i].x / r / 2 + 0.5f, v3[i].z / r / 2 + 0.5f);
        }
       

        mesh.vertices = v3.ToArray();
        mesh.uv = uvs;
        mesh.triangles = triangles.ToArray();
        mesh.RecalculateNormals();
        //如果挂载脚本的是空对象可以使用这行代码
        //GetComponent<MeshRenderer().material=Resources.Load<Material("Materials/labu");
        GetComponent<MeshFilter>().mesh = mesh;

    }

这就是完整的mesh网格绘制圆形并且贴图了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值