Unity网格编程学习(一)

1.创建平面


Unity有Mesh Filter和Mesh Renderer组件,通过编辑Mesh Filter的Mesh属性进行绘制,并使用Mesh Renderer将图形渲染到屏幕上。

//在C#脚本顶部使用这段语句检测绑定该脚本的对象是否存在Mesh Filter和Mesh Renderer组件,如果没有则创建
[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]

使用以下代码编辑网格

private Mesh mesh;
private void Start()
{
    mesh = new Mesh();
    MeshFilter filter = this.GetComponent<MeshFilter>();
    filter.mesh = mesh;
    mesh.vertices = GetVertexs();
    mesh.triangles = GetTriangles();
}

获取Mesh filter组件并绑定mesh后,需要对mesh的顶点和绘制方式进行编辑
使用以下方法获取顶点和绘制信息

private Vector3[] GetVertexs()
{
    return new Vector3[]
    {
        new Vector3(0, 0, 0),
        new Vector3(0, 1, 0), 
        new Vector3(1, 1, 0)
    };
}

private int[] GetTriangles()
{
    return new int[]{
        0, 1, 2
    };
}

即可得到绘制的三角形

在GetVertexs方法中定义了三个顶点(0, 0, 0),(0, 1, 0),(1, 1, 0),如图所示

同时在GetTriangle方法中定义的数组0,1,2代表从第一个顶点->第二个顶点->第三个顶点进行绘制,如图所示

当数组中的值改为0,2,1时,会发现无法看到任何图案,移动摄像机,可以在反面发现以下的图案

这是因为在绘制平面时,顺时针方向绘制的平面方向可以被绘制出来,当绘制顺序变成0,2,1时,在正面以逆时针的方向进行绘制,所以平面将会在反面以上图的方式进行绘制

接下来通过对GetVertexs和GetTriangle方法中添加更多数据进行正方形的绘制

private Vector3[] GetVertexs()
{
    return new Vector3[]{
        new Vector3(0, 0, 0),
        new Vector3(0, 1, 0),
        new Vector3(1, 1, 0),
        new Vector3(1, 0, 0)
    };
}

private int[] GetTriangles()
{
    return new int[]{
        0, 1, 2,
        0, 2, 3
    };
}

加入新的顶点(1, 0, 0)
加入新的绘制顺序0,2,3
即可得到新的平面图案,使用Shaded Wireframe模式可以更加清晰的看到路线

2.使用UV贴图


为对象的材质添加贴图,会发现在绘制的平面上并不能正确地显示贴图

这是因为我们需要对mesh的uv进行设置,指定贴图的位置
输入mesh的uv
mesh.uv = GetUVs();
定义GetUVs方法

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

即可得到如下所示的图案

这段数据将UV图的四个顶点与mesh的四个顶点进行对应,即可在平面上绘制贴图,当UV的顶点数据改为(1,1),(1,0),(0,0),(0,1)时,将会得到如下所示的图案

这是因为开始时UV贴图上的(0,0)与mesh的(0,0,0)对应,(0,1)与(0,1,0)对应...
修改UV顶点的数据后,UV贴图的(1,1)顶点与mesh的(0,0,0)对应,(1,0)与(0,1,0)对应... 所以平面上的图案翻转了过来

3.使用法线贴图


输入mesh的法线数据
mesh.normals = GetNormals();
定义GetNormals方法

private Vector3[] GetNormals()
{
    return new Vector3[]
    {
        Vector3.right,
        Vector3.right,
        Vector3.right,
        Vector3.right
    };
}

可以发现当输入的数据为Vector3.right(1,0,0)时,绘制的图案收到的光照与立方体右侧的光照情况一致

在材质球上直接添加法线贴图时,会产生如下效果

通过输入切线数据来使法线贴图产生效果
private Vector4 tagent = new Vector4(0, 1, 0, -1);
mesh.tangents = GetTangents();

private Vector4[] GetTangents()
{
    return new Vector4[]
    {
        tagent,
        tagent,
        tagent,
        tagent
    };
}


当修改tangent数据为(1, 0, 0, -1)时将会产生如下效果

这是因为光照情况由垂直于切线与法线组成平面的向量来计算,当切线方向变为(1,0,0)与法线一致时,无法进行有效的计算,所以平面会变光滑。tangent变量(0, 1, 0, -1),前三个数据代表了切线的方向,第四个值用于表示不同的坐标系空间

posted @   NfishAndSli  阅读(116)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示