
(不重要的前言:该博文为系列博文,每一篇有前后文关系,例如基类、组件的集成,如果发现有陌生组件和基类,请查看前面文章,本系列文章单纯应用unity的mesh来绘制模型,并未使用任何三方插件,文章内容、代码都是纯手打,望支持)
在开始制作铰链之前,先做个基类,本教程会制作很多模型,所以必然会有很多重复代码,将重复部分集成进基类BaseMesh:
public class BaseMesh : MonoBehaviour
{
protected List vertices;
protected List triangles;
protected List uvs;
public virtual void Create()
{
}
public virtual List GetVertices()
{
return vertices;
}
public virtual List GetTriangles()
{
return triangles;
}
public virtual List GetUVs()
{
return uvs;
}
}
基类有四个支持覆盖的方法
Create():创建
GetVertices():获取顶点
GetTriangles():获取三角面
GetUVs():获取uv
在Create里获取顶点、三角面和uv然后创建模型是这个数据结构的基本思路。
那么现在开始制作铰链,所谓铰链,就是若干个矩形块,同侧相连组成一个条状图形,常见的应用例如:楼梯的表面、折叠的纸张、圆柱体侧面等等。
顶点:铰链每个块彼此相连,所以顶点数组按顺序设置更容易处理,例如想制作下面这个铰链,就应该先准备好0-11共12个顶点,这个算法就不写了,比较简单。
三角面:每一个矩形有两个三角面,例如0123组成的矩形有021和312两个三角面,一次类推,把所有三角面组合起来:
public override ListGetTriangles() { List triangles = new List (); for (int i = 0; i < vertices.Count / 2 - 1; i++) { int index0 = i * 2 + 0; int index1 = i * 2 + 1; int index2 = i * 2 + 2; int index3 = i * 2 + 3; triangles.Add(index0); triangles.Add(index2); triangles.Add(index1); triangles.Add(index3); triangles.Add(index1); triangles.Add(index2); } return triangles; }
uv:
每个顶点设置一个uv
public override ListGetUVs() { List uvs = new List (); float count = vertices.Count / 2; for (int i = 0; i < count; i++) { uvs.Add(new Vector2(0, i / count)); uvs.Add(new Vector2(1, i / count)); } return uvs; }
看看效果:
几十行代码就能绘制出一个楼梯表面。