[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 顶点的Normal

美术经常找程序撕逼,我做的顶点在max里面只有xxx那么少,但是程序说我再unity看到的就是有XXX那么多。为什么? 因为有些公共顶点直观感受是一个,实际上是应该按照三角面的个数来计数的。...

[shader]旋转,偏移,焚毁

旋转偏移+焚毁效果shader

Unity3D-Mesh创建

Mesh需要用代码创建。 using UnityEngine; using System.Collections; using UnityEditor; public class CreateMe...

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

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

Unity3D-Mesh创建中三角形索引的算法

解释一下上一篇中Mesh的三角形索引算法。 首先是要知道顶点数组是如何产生的: 如此图,一个大矩形,是由6个顶点,两个矩形构成的。 一般来讲,构建此矩形,需要知道每个顶点的位置,以及顶点...

Unity3D之跑酷地图弯曲效果

3D跑酷游戏,远处地表是弯曲的,形成视觉差,其实是通过shader来实现。 float4 vPos = mul (UNITY_MATRIX_MV, v.vertex); float zOff = vP...

出售冒名信用卡 电话18755340588 出售信用卡

电话:18755340588 联系QQ:1348182360  本公司永久承诺:为客户开的卡绝对没有任何交易记录,只要客户要卡,我们马上开卡发货, 为客户节省每一分钟时间,我们的宗旨是:质量+速度+信...

[Mesh]绘制交互网格

去年独立开发的可供策划编辑的游戏,玩法是模仿星之卡比,这里分享下画线的实现
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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