public class CreateMesh : MonoBehaviour
{
public int n = 6;
public float r = 5;
// Start is called before the first frame update
void Start()
{
//创建一个mesh网格
Mesh mesh=new Mesh();
//顶点助手
VertexHelper vh = new VertexHelper();
//圆柱4个面组成
//第1个面(上面的圆盖)
//每个角的弧度=圆的弧度/角的个数
float ang = 2 * Mathf.PI / n;
//添加圆心
vh.AddVert(new Vector3(0, 1, 0), Color.white, new Vector2(0.5f, 0.5f));
//循环计算其它顶点
for (int i = 0; i < n; i++)
{
float x = Mathf.Sin(ang * i) * r;
float y = Mathf.Cos(ang * i) * r;
float uvx = (x + r) / (2 * r);
float uvy = (y + r) / (2 * r);
vh.AddVert(new Vector3(x, 1, y), Color.white, new Vector2(uvx, uvy));
}
//计算绘制(使用循环完成)
for (int i = 0; i < n; i++)
{
//因为0是圆心,所以0的时候绘制最后一个
if(i==0)
{
vh.AddTriangle(0, n, 1);
}
else
{
vh.AddTriangle(0, i, i + 1);
}
}
//第2个面(下面的圆盖)
//圆心+圆的周围已经用掉了的顶点。不能重复使用
int next = 1 + n;
//添加圆心
vh.AddVert(new Vector3(0, -1, 0), Color.white, new Vector2(0.5f, 0.5f));
//循环计算其它顶点
for (int i = 0; i < n; i++)
{
float x = Mathf.Sin(ang * i) * r;
float y = Mathf.Cos(ang * i) * r;
float uvx = (x + r) / (2 * r);
float uvy = (y + r) / (2 * r);
vh.AddVert(new Vector3(x, -1, y), Color.white, new Vector2(uvx, uvy));
}
//计算绘制(因为是下面,所以要逆时针绘制)
//所有下标+next保证不适用重复的下标
for (int i = 0; i < n; i++)
{
//因为0是圆心,所以0的时候绘制最后一个
if (i == 0)
{
vh.AddTriangle(0+next, 1+next, n+next);
}
else
{
vh.AddTriangle(0+next, i+1+next, i + next);
}
}
//第三个面(侧面)
//侧面的顶点就是上下圆出了圆心的所有顶点
//上下园用过的顶底不能再用
next = (1 + n) * 2;
//循环计算其它顶点(首尾相接 所以n+1=0)
for (int i = 0; i < n+1; i++)
{
float x = Mathf.Sin(ang * i) * r;
float y = Mathf.Cos(ang * i) * r;
//int是整数,所以int除以 int只返回0和1
float uvx = (float)i / (float)n;
if(i==n)
{
x = Mathf.Sin(ang * 0) * r;
y = Mathf.Cos(ang * 0) * r;
}
//下面的顶点
vh.AddVert(new Vector3(x, -1, y), Color.white, new Vector2(uvx, 0));
//上面的顶点
vh.AddVert(new Vector3(x, 1, y), Color.white, new Vector2(uvx, 1));
}
//多少个面绘制多少次
//所有下标+next保证不使用重复的下标
//因为圆是顺时针画的,所以显示外侧要逆时针绘制
for (int i = 0; i < n; i++)
{
vh.AddTriangle(i*2+next,(i+1)*2+1+next,i*2+1+next);
vh.AddTriangle(i*2+next,(i+1)*2+next,(i+1)*2+1+next);
}
//把顶点助手的数据赋值给mesh网格
vh.FillMesh(mesh);
//自动计算法线
mesh.RecalculateNormals();
//把mesh网格赋值给网格过滤器
GetComponent<MeshFilter>().mesh = mesh;
}
绘制圆柱 uv坐标贴图
于 2023-01-08 23:44:09 首次发布