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
    评论
Unity 是一种流行的游戏开发引擎,它提供了许多强大的功能,其中之一就是使用Mesh绘制和操作顶点。 Mesh是Unity中用来表示3D对象网格的组件,它由一系列的顶点和面构成。通过在Mesh上添加、修改和删除顶点,我们可以创建各种形状和模型。 在Unity中,绘制Mesh顶点有几个步骤。首先,我们需要创建一个空的GameObject,并在其上添加一个MeshFilter组件。MeshFilter用于存储和管理Mesh的数据。 接下来,我们可以使用代码或者Unity的编辑器工具来添加和编辑Mesh顶点。通过修改Mesh的vertices属性,我们可以指定顶点的位置。例如,我们可以通过创建一个Vector3数组来定义几个顶点,并将其赋值给Mesh的vertices属性。 完成顶点的编辑后,我们还可以为Mesh指定面的连接方式。在Unity中,面通常是由三个顶点组成的三角形。我们可以通过指定三角形的顶点索引来定义各个面。例如,我们可以将一个有序的整数数组赋值给Mesh的triangles属性,其中每三个整数表示一个三角形的三个顶点。 最后,我们需要为Mesh创建一个材质,并将其赋值给GameObject上的MeshRenderer组件。材质用于定义对象的外观和着色方式。 在绘制Mesh顶点后,我们可以使用Unity的摄像机和光源来渲染和显示对象。通过调整摄像机的位置、旋转和投影方式,我们可以在屏幕上看到Mesh顶点的绘制结果。 绘制Mesh顶点是Unity中创建3D物体和场景的重要步骤之一。通过熟练使用Mesh组件和顶点操作技巧,我们可以实现各种复杂的模型和效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值