unity---Mesh网格编程(一)

目录

1.Mesh 初识

2.Mesh介绍

 3Mesh 脚本


1.Mesh 初识

打开unity 新建3d物体 cube , wireframe模式下 即可发现正方形物体是由几个面组成的,

每个面都是由2个三角面组成,而每个三角面又是由3个点构成的。

而3d物体是由MeshFilter (模型)和MeshRenderer(渲染)组成的。官网介绍

 unity2021 示意图

扫描二维码关注公众号,回复: 14754458 查看本文章

2.Mesh介绍

unity 有自动渲染优化功能,mesh绘制时,如果顺时针绘制一个三角形,那么法向量是向上的。逆时针绘制三角形时,法向量是向下的。当法线朝向我们时这个面是可见的,否则要切换到反面才可见。

顶点:vertices

顶点下标:triangles

  

纹理:uv---注意左图uv顶点与 三角面绘制顶点的对应关系

 3Mesh 脚本

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

//脚本挂载到物体后,自动添加MeshFilter与MeshRenderer组件
[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
public class Mesh_1 : MonoBehaviour
{
    private Mesh mesh;

    void Start()
    {
        //新建Mesh
        mesh = new Mesh();

        MeshFilter filter = GetComponent<MeshFilter>();
        filter.mesh = _mesh;
        mesh.name = "Mesh1"; //命名
        mesh.vertices = GetVertexs();   //顶点
        mesh.triangles = GetTriangles(); //三角面顶点下标
        mesh.uv = GetU1V();     //纹理1
        mesh.uv2 = GetU2V();    //纹理2
        mesh.uv...= xxx;
        mesh.uv8 = xxx;
        mesh.normals = GetNormals(); //法向量-影响模型受光效果--按需使用
        //mesh.RecalculateNormals(); //若对法向量没有特别需求,可使用这条,自动计算
    }

    private void Update()
    {
        //获取切线与上面的法向量联合求出父切线
        _mesh.tangents = GetTangent();
    }

    //切线--xyzw:{0,1,0,-1}改变y的正负值可调整normal map贴图的凹凸方向
    private Vector4[] GetTangent()
    {
        return new Vector4[]
        {
            0,
            1,
            0,
            -1,
        };
    }

    //顶点
    private Vector3[] GetVertexs()
    {
        return new Vector3[]
        {
            //3个顶点构成一个三角面
            new Vector3(0, 0, 0),
            new Vector3(1, 0, 0),
            new Vector3(1, 1, 0),
            //4个顶点构成一个正方形面
            new Vector3(0, 1, 0),
        };
    }

    //纹理贴图
    private Vector2[] GetU1V()
    {
        return new Vector2[]
        {
            new Vector2(1,0),
            new Vector2(0,0),
            new Vector2(0,1),
            new Vector2(1,1),
        };
    }

    private Vector2[] GetU2V()
    {
        return new Vector2[]
        {
            new Vector2(0,0),
            new Vector2(0,0),
            new Vector2(0,0),
            new Vector2(0,0),
        };
    }

    //法向量--影响受光效果
    private Vector3[] GetNormals()
    {
        return new Vector3[]
        {
            Vector3.right,
            Vector3.right,
            Vector3.right,
            Vector3.right,
        };
    }

    //顶点的绘制顺序---顶点下标序列
    private int[] GetTriangles()
    {
        return new int[]
        {
            0, 1, 2,
            0, 2, 3
        };
    }
}

猜你喜欢

转载自blog.csdn.net/lalate/article/details/128081876