目录
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
};
}
}