[Mesh]代码生成圆柱网格

原创 2016年06月01日 14:38:51

最终效果


基本知识

网格的顶点顺序


如果要生成上面的网格,需要4个点的坐标,需要一个顶点索引,顶点索引的顺序是,021 是一个三角面,123是一个三角面,而且还要生成UV,为一组vector2数组。当然一个网格信息可以包含权重,法线,切线,颜色等等其他信息。

顶点的信息是有限的

一个顶点,可以分配一个UV信息,也就是说如果生成一个6边的圆柱,你需要7个边的顶点,第一边和最后一边重合,来生成0-1之间的UV值,包括法线,切线,颜色等,如果你需要一个顶点有3个法线面向,那就需要在这个位置生成3个顶点。

源代码


        public Mesh CreateMesh(int edg_x, int edg_y, float rad, float len)
        {
            edg_x = Mathf.Max(2, edg_x);//保证最低2个边
            edg_y = Mathf.Max(2, edg_y);
            int _deglen = edg_x * edg_y + edg_y;
            normals = new Vector3[_deglen];
            verts = new Vector3[_deglen];
            uvs = new Vector2[_deglen];
            int[] trians = new int[edg_x * (edg_y - 1) * 6];
            float reg = 6.28318f / edg_x;
            float _len = len / (edg_y - 1);
            Vector2 uvStep = new Vector2(1f / edg_x, 1f / (edg_y - 1));
            for (int y = 0; y < edg_y; y++)
                for (int x = 0; x < edg_x + 1; x++)//多一个边来保存UV值
                {
                    int i = x + y * (edg_x + 1);
                    verts[i] = new Vector3(Mathf.Sin((reg * (x % edg_x) + angle) % 6.28318f) * rad, Mathf.Cos((reg * (x % edg_x) + angle) % 6.28318f) * rad, y * _len);//计算顶点坐标
                    normals[i] = -new Vector3(verts[i].x, verts[i].y, 0);//计算法线方向
                    int id = x % (edg_x + 1) * 6 + y * edg_x * 6;
                    if (x < edg_x + 1 && y < edg_y - 1 && (id + 5) < trians.Length)//计算顶点数组
                    {
                        trians[id] = i;
                        trians[id + 1] = trians[id + 4] = i + edg_x + 1;
                        trians[id + 2] = trians[id + 3] = i + 1;
                        trians[id + 5] = i + edg_x + 2;
                    }
                    if (edg_x != 2)//计算UV,考虑到2个边的情况
                        uvs[i] = new Vector2(x == edg_x ? 1f : uvStep.x * x, y == edg_y - 1 ? 1f : uvStep.y * y);
                    else
                        uvs[i] = new Vector2(x % edg_x, y == edg_y - 1 ? 1f : uvStep.y * y);
                }
            Mesh mesh = new Mesh();
            mesh.vertices = verts;
            mesh.triangles = trians;
            mesh.uv = uvs;
            mesh.normals = normals;
            return mesh;
        }


以上就是源码,如果有更好的方法欢迎指正,下一片,我们来弯曲这个网格。

版权声明:本文为博主原创文章,未经博主允许不得转载。

自动生成路径mesh

先看看效果图: 大多数形状都支持,但仍存在不少会生成奇怪形状的情形,到后面也没继续扩展维护了,只当看看好玩 在编辑器模式便能看到预览效果(Enable,Disable此脚本 Edi...

unity代码创建mesh

简介 Introduction  这个教程将让你学会如何创建一个星型控件以及如何制作这个控件的自定义编辑器。你将学会: 动态的建立Mesh。使用一个嵌套类。建立一个自定义编辑器。使...

unity 入门学习之(一)创建基本的3D游戏场景

1.准备工作,创建新工程2创建好的工程如下图中所示,在scene场景中包含一个主摄像机(main camera)和一个方向光(DirectionalLight),如下图右中所示,点击主摄像机在场景的右...

Unity之Handles绘制圆锥体立方体圆柱体五

Unity编辑器类在Scene下绘制圆锥体,立方体,球体 在Editor文件夹下创建脚本HandlerTest using UnityEngine; using System.C...

[unity]在unity中创建圆锥体

在国内百度不带还是去google了果然(哈哈我是大自然的搬运工) 解决方法有两个:  1)利用maya Blender等建模导入,太麻烦,看有没有其他方法,继续找。 2)国外网友贴了一个...

Unity3D技术之用程序生成网格几何体-示例–创建一个广告牌

示例 – 创建一个广告牌平面       Unity 自带一个平面 (Plane) 原始对象,但是更简单的平面在二维游戏或 GUI 中可能非常有用,在任何情况下可以做一个好的开始示例。一...

Unity3d之利用Mesh绘制几何图形实现

一、创建一个GameObject,并在上面挂两个组件(MeshFilter、MeshRenderer)   二、新建个脚本,并挂在刚才创建的GameObject上       using Unit...

【Unity】Mesh网格编程(四)麦比乌斯环

本文用Unity网格编程生成了麦比乌斯环。 /// 技术要点: /// 1. 通过生成、父子化和旋转空对象确认各个顶点位置 /// 2. 根据几何顶点位置生成网格顶点位置...

Unity插件 - MeshEditor(九) 模型涡流扭曲特效(黑洞吸引特效)

先上一张效果图:类似于将模型吸入一个涡流中心的效果,最开始我想做的是在一个球形区域产生吸引力,将模型整个拉扯成一堆堆的碎片,吸进去再混合搅拌......结果做出来不堪入目,感觉就是一堆面片被吸到某一区...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Mesh]代码生成圆柱网格
举报原因:
原因补充:

(最多只允许输入30个字)