绘制圆柱 uv坐标贴图

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;
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值