您当前的位置: 首页 >  unity

莉萝爱萝莉

暂无认证

  • 8浏览

    0关注

    58博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Unity-网格编程

莉萝爱萝莉 发布时间:2022-09-27 10:53:57 ,浏览量:8

1. 简介 1. 基础理论
  1. 模型是由点和面构成的,每三个点构成一个三角面。
  2. 根据三个顶点排列的顺序,根据左手定则决定三角面的正反面
  3. 三角形序列是一组int数组,数组元素数量为3的倍数,表示三角形的顶点 对应的顶点ID
  4. Unity想要显示一个模型,必须在对象上挂载组件Mesh Filter(网格过滤器)与Mesh Renderer(网格渲染器)
2. Mesh构成
  1. Vertex
  2. Normal
  3. UV
  4. Trangle(三角形序列)
2. 基本函数 1. 使用代码创建Mesh模型 1. Mesh类
  1. Unity允许使用Mesh类创建模型,并将创建的Mesh赋值给MeshFilter。
  2. 模型顶点列表 记录了所有顶点的位置信息; 三角形序列 决定了哪三个顶点会构成一个三角面。以左手定则决定面的正方向; UV坐标列表 决定了每个顶点对应UV纹理坐标的具体位置。三角面之间的UV值将通过三个顶点的UV值,以插值的方式确定面每个位置的的UV值;
Mesh参数描述name模型名称vertices模型顶点列表triangles三角形序列(序列数量必须为3的倍数)uvUV坐标列表normals法线列表tangents切线列表 Mesh函数描述RecalculateNormals()自动计算法线方向RecalculateTangents()自动计算切线方向RecalculateBounds()重新计算模型边缘界限 2. 示例

一个正方形

MeshFilter filter;

void Start()
{
    filter = GetComponent();
    Mesh mesh = new Mesh();
    mesh.name = "Mesh_01";
    mesh.vertices = GetVertexs();
    mesh.triangles = GetTriangles();
    mesh.uv = GetUVs();
    mesh.normals = GetNormals();
    mesh.tangents = GetTangent();
    filter.mesh = mesh;

}

// 设定顶点位置
Vector3[] GetVertexs()
{
    return new Vector3[] 
    {
        new Vector3(0, 0, 0),
        new Vector3(1, 0, 0),
        new Vector3(0, 1, 0),
        new Vector3(1, 1, 0),
    };
}

// 设定三角形序列
int[] GetTriangles()
{
    return new int[]
    {
        0, 1, 2, 1, 3, 2
    };
}

// 设定UV
Vector2[] GetUVs()
{
    return new Vector2[]
    {
        new Vector2(1, 0),
        new Vector2(0, 0),
        new Vector2(1, 1),
        new Vector2(0, 1),
    };
}

// 设定顶点位置
Vector3[] GetNormals()
{
    return new Vector3[]
    {
        new Vector3(0, 0, 1),
        new Vector3(0, 0, 1),
        new Vector3(0, 0, 1),
        new Vector3(0, 0, 1),
    };
}

// 设定顶点位置
Vector4[] GetTangent()
{
    return new Vector4[]
    {
        new Vector4(-1, 0, 0, -1),
        new Vector4(-1, 0, 0, -1),
        new Vector4(-1, 0, 0, -1),
        new Vector4(-1, 0, 0, -1),
    };
}

动态创建指定尺寸的矩形

public int width, height;

MeshFilter filter;

private void OnDrawGizmos()
{
    Start();
}

void Start()
{
    filter = GetComponent();
    Mesh mesh = new Mesh();
    DrawMesh(mesh);
    filter.mesh = mesh;
}

void DrawMesh(Mesh mesh)
{
    mesh.name = "Mesh_02";

    width = width > 0 ? width : 0;
    height = height > 0 ? height : 0;
    // 顶点列表
    Vector3[] vertices = new Vector3[(width + 1) * (height + 1)];
    Vector2[] uvs = new Vector2[(width + 1) * (height + 1)];
    int[] triangles = new int[width * height * 2 * 3];
    for (int y = 0; y = 1 ? XSize : 1;
        YSize = YSize >= 1 ? YSize : 1;
        ZSize = ZSize >= 1 ? ZSize : 1;
        Radius = Radius             
关注
打赏
1663903574
查看更多评论
0.0934s