Mesh网格

一、什么是Mesh

Unity是基于mesh去做渲染的,也就是说你想在Unity里看见东西的话,就必须要使用mesh。

从概念上讲,mesh是图形硬件用来绘制复杂事物的的框架。它至少包含一个顶点集合(这些顶点是三维空间中的一些坐标,)以及连接这些点的一组三角形(最基本的2D形状)。构成这些三角形的点和边的集合就是Mesh。

在Unity Game视图当中 你肉眼所见的东西都是通过一个三角面  组成各种各样的模型  Mesh就是存放这些数据,并且渲染  显示在场景当中。

如果你想用一个GameObject展示一个3D的模型,那么它必须要两个components才可以。第一个是Mesh Filter 网格过滤器,它决定了你想展示那个mesh;第二个是Mesh Renderer 网格渲染器,它决定了你应该如何渲染mesh,比如使用什么材质球,是否接受阴影或者投影等等。

二、Mesh的属性

网格的正面、反面是因为渲染顺序的不同所形成的(渲染顺序指顺时针、逆时针渲染)

Mesh{ 

        vertices    顶点坐标数组
         triangles   绘制顺序

        {mesh.triangles = new int[]{0,1,2,2,1,0}        //必须是3的倍数}
        Normal         法线       {告诉你光怎么反射的}
        UV          坐标

        {坐标  二维坐标
        显示贴图的坐标
        0-1的值
        和顶点相同数量
        //给mesh网格添加uv坐标}

       

三、如何绘制网格

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

public class MeshTest : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Mesh mesh = new Mesh();

        #region   Cube
        //给mesh网格添加顶点
        List<Vector3> vectors = new List<Vector3>();
        //vectors.Add(Vector3.zero);
        //vectors.Add(Vector3.up);
        //vectors.Add(Vector3.right);
        vectors.Add(new Vector3(0, 3, 0));
        vectors.Add(new Vector3(0, 3, 3));
        vectors.Add(new Vector3(3, 3, 3));
        vectors.Add(new Vector3(3, 3, 0));
        vectors.Add(new Vector3(0, 0, 0));
        vectors.Add(new Vector3(0, 0, 3));
        vectors.Add(new Vector3(3, 0, 3));
        vectors.Add(new Vector3(3, 0, 0));
        mesh.vertices = vectors.ToArray();
        //给mesh网格添加绘制顺序
        mesh.triangles = new int[] {
            4,3,0,
            3,4,7,
            7,2,3,
            7,6,2,
            6,1,2,
            6,5,1,
            5,0,1,
            5,4,0,
            0,2,1,
            0,3,2,
            5,7,4,
            7,5,6
        };                            必须是3的倍数

        //重新计算法线
        mesh.RecalculateNormals();

        //给mesh网格添加uv坐标
        List<Vector2> uv = new List<Vector2>();
        uv.Add(new Vector2(0.1f, 0.3f));
        uv.Add(new Vector2(0.9f, 0.3f));
        uv.Add(new Vector2(0.9f, 0.9f));
        uv.Add(new Vector2(0.1f, 0.9f));
        uv.Add(new Vector2(0, 0));
        uv.Add(new Vector2(1, 0));
        uv.Add(new Vector2(1, 1));
        uv.Add(new Vector2(0, 1));
        mesh.uv = uv.ToArray();
        #endregion
    }
}

四、画球

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

public class MeshTest : MonoBehaviour
{
    public int n = 4;
    public float r = 5;
    // Start is called before the first frame update
    void Start()
    {
        Mesh mesh = new Mesh();
        //每份的弧度
        float ang = 2 * Mathf.PI / n;
        List<Vector3> vertices = new List<Vector3>();
        vertices.Add(Vector3.zero);//圆心
        List<int> triangles = new List<int>();
        for (int i = 0; i < n / 2 + 1; i++)
        {
            float xr = Mathf.Sin(i * ang) * r;
            float y = Mathf.Cos(i * ang) * r;
            for (int j = 0; j < n; j++)
            {
                float x = Mathf.Sin(j * ang) * xr;
                float z = Mathf.Cos(j * ang) * xr;
                vertices.Add(new Vector3(x, y, z));
                if (j == n - 1)
                {
                    float x0 = Mathf.Sin(0) * xr;
                    float z0 = Mathf.Cos(0) * xr;
                    vertices.Add(new Vector3(x0, y, z0));
                }
                if (i < n/2 && j < n)
                {
                    triangles.Add(i * (n + 1) + j);
                    triangles.Add(i * (n + 1) + j + 1);
                    triangles.Add(( i + 1) * (n + 1) + j);
                    triangles.Add(( i + 1) * (n + 1) + j);
                    triangles.Add(i * (n + 1) + j + 1);
                    triangles.Add((i + 1) * (n + 1) + j + 1);
                }
            }
            

        }
        mesh.vertices = vertices.ToArray();//给mesh网格添加顶点
        mesh.triangles = triangles.ToArray();//给mesh网格添加绘制顺序

        GetComponent<MeshFilter>().mesh = mesh;
        GetComponent<MeshCollider>().sharedMesh = mesh;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值