Mesh网格绘制模型

模型一:圆锥

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MeshYuanZhui : MonoBehaviour
{
    public float radius = 1f;    // 圆锥底面半径
    public float height = 2f;    // 圆锥高度

    private void Awake()
    {
        CreateConeMesh(radius, height);
    }

    /// <summary>
    /// 创建圆锥Mesh
    /// </summary>
    /// <param name="radius">圆锥底面半径</param>
    /// <param name="height">圆锥高度</param>
    /// <returns>Mesh对象</returns>
    private Mesh CreateConeMesh(float radius, float height)
    {
        var vertices = new List<Vector3>();
        var indices = new List<int>();

        vertices.Add(Vector3.zero);
        vertices.Add(Vector3.up * height);

        var temp = new List<Vector3>();
        //底圆面
        for (var i = 0.0f; i < 360.0f; i += 30)
        {
            var rad = Mathf.Deg2Rad * i;
            var x = radius * Mathf.Cos(rad);
            var z = radius * Mathf.Sin(rad);

            temp.Add(new Vector3(x, 0.0f, z));
        }

        vertices.AddRange(temp);
        vertices.AddRange(temp);

        for (var i = 2; i <= 13; i++)
        {
            indices.Add(i);
            if (i < 13)
            {
                indices.Add(i + 1);
            }
            else
            {
                indices.Add(2);
            }
            indices.Add(0);
        }

        for (var i = 14; i <= 25; i++)
        {
            indices.Add(i);
            indices.Add(1);
            if (i < 25)
            {
                indices.Add(i + 1);
            }
            else
            {
                indices.Add(14);
            }
        }

        Mesh mesh = new Mesh();
        mesh.SetVertices(vertices);
        mesh.SetTriangles(indices, 0);
        mesh.RecalculateNormals();
        GetComponent<MeshFilter>().mesh = mesh;
        GetComponent<MeshCollider>().sharedMesh = mesh;
        Material mat = new Material(Shader.Find("Custom/NewSurfaceShader"));
        return mesh;
    }
}

模型二:圆柱

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MeshYuanZhu : MonoBehaviour
{
    public int num;
    // 网格渲染器
    MeshRenderer meshRenderer;
    // 网格过滤器
    MeshFilter meshFilter;

    // 用来存放顶点数据
    List<Vector3> verts;        // 顶点列表
    List<int> indices;          // 序号列表

    private void Start()
    {
        verts = new List<Vector3>();
        indices = new List<int>();
        meshRenderer = GetComponent<MeshRenderer>();
        meshFilter = GetComponent<MeshFilter>();
        Generate();
    }

    public void Generate()
    {
        // 把顶点和序号数据填写在列表里
        AddMeshData7(num);//三角形
        // 用列表数据创建网格Mesh对象
        Mesh mesh = new Mesh();
        mesh.SetVertices(verts);
        //mesh.vertices = verts.ToArray();
        mesh.SetIndices(indices, MeshTopology.Triangles, 0);
        //mesh.triangles = indices.ToArray();
        // 自动计算法线
        mesh.RecalculateNormals();
        // 自动计算物体的整体边界
        mesh.RecalculateBounds();
        // 将mesh对象赋值给网格过滤器,就完成了
        meshFilter.mesh = mesh;
    }
    void AddMeshData7(int n)//n为圆形包含三角形的数量
    {
        int a = 360 / n;
        verts.Add(new Vector3(0, 0, 0));
        for (int i = 0; i < n; i++) //上面
        {
            verts.Add(new Vector3(Mathf.Sin(a * Mathf.Deg2Rad), 0, Mathf.Cos(a * Mathf.Deg2Rad)));
            a += 360 / n;
        }
        verts.Add(new Vector3(0, -2, 0));
        for (int i = 1; i < n + 1; i++) //下面
        {
            verts.Add(verts[i] + new Vector3(0, -2, 0));
        }
        Debug.Log("verts.Count: " + verts.Count);
        for (int i = 0; i < n; i++) //绘制上面
        {
            indices.Add(0);
            indices.Add(i + 1);
            if (i + 1 >= n)
            {
                indices.Add(1);
            }
            else
            {
                indices.Add(i + 2);
            }
        }

        for (int i = n + 1; i < 2 * n + 1; i++) //绘制下面 
        {
            Debug.Log("i " + i);
            indices.Add(n + 1);
            if (i + 2 >= 2 * n + 2)
            {
                indices.Add(n + 2);
            }
            else
            {
                indices.Add(i + 2);
            }
            indices.Add(i + 1);
        }

        int oldcount = verts.Count;
        Debug.Log(oldcount);
        for (int i = 0; i < oldcount; i++)
        {
            verts.Add(verts[i]);
        }

        for (int i = oldcount + 1; i <= oldcount + n; i++) //绘制侧面
        {
            indices.Add(i);
            indices.Add(i + n + 1);
            if (i + 1 >= n + oldcount)
            {
                indices.Add(oldcount + 1);
            }
            else
            {
                indices.Add(i + 1);
                Debug.Log(verts[i + 1]);
            }
            indices.Add(i + n + 1);
            if (i + n + 2 > 2 * n + 1 + oldcount)
            {
                indices.Add(oldcount + n + 2);
                indices.Add(oldcount + 1);
            }
            else
            {
                indices.Add(i + n + 2);
                indices.Add(i + 1);
            }
        }
    }
}

模型三:梯形

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MeshTiXing : MonoBehaviour
{
    void Start()
    {
        Mesh mesh = new Mesh();
        List<Vector3> vers = new List<Vector3>();
        vers.Add(new Vector3(-5, 0, -5));
        vers.Add(new Vector3(5, 0, -5));
        vers.Add(new Vector3(5, 0, 5));
        vers.Add(new Vector3(-5, 0, 5));

        vers.Add(new Vector3(-2, 3, -2));
        vers.Add(new Vector3(2, 3, -2));
        vers.Add(new Vector3(2, 3, 2));
        vers.Add(new Vector3(-2, 3, 2));

        List<int> tris = new List<int>();
        tris.Add(0); tris.Add(2); tris.Add(1);
        tris.Add(0); tris.Add(3); tris.Add(2);
        tris.Add(5); tris.Add(7); tris.Add(4);
        tris.Add(5); tris.Add(6); tris.Add(7);
        tris.Add(4); tris.Add(3); tris.Add(0);
        tris.Add(4); tris.Add(7); tris.Add(3);
        tris.Add(6); tris.Add(1); tris.Add(2);
        tris.Add(6); tris.Add(5); tris.Add(1);
        tris.Add(5); tris.Add(0); tris.Add(1);
        tris.Add(5); tris.Add(4); tris.Add(0);
        tris.Add(7); tris.Add(2); tris.Add(3);
        tris.Add(7); tris.Add(6); tris.Add(2);

        mesh.vertices = vers.ToArray();
        mesh.triangles = tris.ToArray();
        GetComponent<MeshFilter>().mesh = mesh;
    }
}

模型四:圆球

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MeshSphere : MonoBehaviour
{
    public MeshFilter meshFilter;

    public int num=100;
    public float r = 5;
    // Start is called before the first frame update
    void Start()
    {
        Mesh mesh=new Mesh();
        meshFilter=gameObject.GetComponent<MeshFilter>();
        List<Vector3> vector3s = new List<Vector3>();
        float Nums = (2 * Mathf.PI) / num;
        vector3s.Add(new Vector3(0, 0, 0));

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

            vector3s.Add(new Vector3(x, y, 0));
        }
        mesh.vertices = vector3s.ToArray();

        List<int> ints = new List<int>();
        for (int i = 0; i < num; i++)
        {
            if (i == 0)
            {
                ints.Add(0);
                ints.Add(num);
                ints.Add(1);
            }
            else
            {
                ints.Add(0);
                ints.Add(i);
                ints.Add(i + 1);
            }
        }
        mesh.triangles = ints.ToArray();
        meshFilter.mesh = mesh;


    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值