__original_drawn_by_mochizuki_shiina__sample-049d167e8c827521f9ca8d56afc25ad8.jpg

上一篇:


第一节 解析顶点和三角面原理,绘制mesh顶点和三角形


创建一个空物体,命名Mesh generator,reset transform归零,
新加入两个组件:Mesh Filter(储存mesh网格形状),Mesh Renderer(读取mesh形状,渲染后获得可见模型),
mesh Filter和Renderer可以演示基本网格形状和默认渲染材质效果。
再添加一个脚本:Mesh Generator,进行脚本编辑
mesh内包括很多信息,顶点,三角面,颜色,法线等等,这节我们重点分析下vertices顶点和triangles三角面
顶点介绍
vertices 2d.png
以方块为例,四个顶点
vertices=(0,0),(0,1),(1,0),(1,1)
这样存储了方块的位置信息,这个数组就叫做顶点数组。
如果是三维空间,我们查看下图示例
vertex.png
可以了解到对应的顶点坐标
了解顶点之后,我们想要模型面也渲染出来,则用到三角形填充
vertices&triangles.png
至于如何渲染,unity渲染三角面采用顺时针方向,这涉及到一个知识叫做
backface culling(背面剔除)
为了节省渲染资源,物体内部和背面一般不进行渲染计算,所以通过填充的顶点顺序判断正反面
因此,我们如果要渲染正面,则需要进行正确的三角面顶点排序,第一个三角形应该是
0,1,2 第二个三角形则是2,1,3
如果你存储为1,2,3的话,unity则会将这个面视为背面,默认为黑色,不进行渲染。
好了,进入脚本开始编写

1. 目标:第一个三角面渲染

新数组

Vector3[] vertices;
int[]triangles;

申明一个 Mesh mesh;
我们就可以在start方法中开始赋予网格了:

void Start(){
    mesh=new Mesh();
    GetComponent<MeshFilter>().mesh=mesh;
    }

这样我们就实例化一个新的mesh网格了,并且将刚才的空物体上面的meshfilter里mesh网格属性赋值咱们新建的mesh信息了,要获取meshfilter,我们还需要在最开始class前面申请获取组件:

[RequireComponent(typeof(MeshFilter))]

继续,start方法中开始创建物体形状:

CreateShape();

我们新建这个方法:

void CreateShape(){
    vertices=new Vector3[] {
    new Vector3 (0,0,0),
    new Vector3 (0,0,1),
    new Vector3 (1,0,0)
    };
    triangles = new int[]
    {
    0,1,2
    };

我们还未告知系统如何使用这些数据,因此新建一个Mesh更新方法进行分开处理
start方法后新加一个调用:UpdateMesh();
然后新构建此方法:

void UpdateMesh()
{
    mesh.Clear();//方便更新mesh网格前清空之前的网格
    mesh.vertices=vertices;
    mesh.triangles=triangles;
    }

这样我们就可以将上面获得的数据赋值到咱们的mesh信息里面,理论上我们应该能得到三个顶点信息和一个三角形填充信息了
保存脚本,进入unity运行测试,调整scene视野,让镜头与view对齐,如果嫌图标过大,点击scene界面右侧Gizmos,调整3d icon后方横条即可。
因为还没有赋予材质信息,所以显示紫色三角形。
我们手动赋予默认材质,通过光照系统发现光线反射效果比较诡异,这是因为我们还没有设置法线信息,可以通过unity指令直接设置,在UpdateMesh方法里加入一条:

mesh.RecalculateNormals();

即可。
这样就能看到和普通模型一样的橘黄色外框和白色正常反馈光反射效果了
第一个三角面和三个顶点构建完毕,

2. 新的目标:第一个方块构建

我们尝试构建第一个方块剩下部分,需要新增一个顶点
CreateShape方法里新加:

new Vector3 (1,0,1)

即右上角的顶点位置,
triangles里面新加

1,3,2

第二个三角形信息,保存后unity里执行,发现ok
如同我们普通的三维物体,这个方块我们可以执行旋转拉伸甚至加入rigidbody刚体组件,实现自由落体等等
开头我们说到,如果三角形存储顶点顺序不是顺时针,渲染会发现变化,那么我们试着改成1,2,3看看效果
发现一个黑色三角,翻过来看见另一个,都是黑色的,因为三角面无法判断方向,因此无法计算光线走向,从而没有光线渲染。
下一节,我们再分析如何拓展我们的顶点绘制方法,将单个方块顶点和三角形的绘制拓展到整个平面所有方块mesh绘制。
下一篇:

Last modification:August 6, 2020
If you think my article is useful to you, please feel free to appreciate