mesh使用 unity3d_unity3d构建3d曲线mesh - CSDN
  • unity3d 改变mesh网格

    2020-07-30 23:33:24
    提供一个可以个工大家学习unity3d 过程中,可能需要改变mesh网格的一个小工程供大家学习参考
  • Unity3DMesh基础

    2018-05-28 20:57:38
    教程一Unity3DMesh绘制多边形一些知识点的说明记录与补充:1、总的来说绘制平面的思想十分简单,就是将需要的平面拆分成几个三角形然后进行绘制就可以啦,主要的思路就在于三角形的拆分。如果说一个平面有7个顶点...

    教程一


    Unity3D之Mesh绘制多边形

    一些知识点的说明记录与补充:

    1、

    总的来说绘制平面的思想十分简单,就是将需要的平面拆分成几个三角形然后进行绘制就可以啦,主要的思路就在于三角形的拆分。如果说一个平面有7个顶点,我们把它们分别编号0到6,拆分情况如图所示:

    即:如果用n来表示顶点的个数,那么在同一个平面内,可以分割的三角形个数是:n-2;

    2、

    在这里,我们选择应用Mesh Filter组件来进行绘制,Mesh Filter组件里的Mesh属性就是我们这次主要操作的对象,在这里,我们用到:

      mesh.vertices数组 和 mesh.triangles数组,第一个是vector3的数组,第二个是int的数组。

      其中mesh.vertices存储的就是平面的顶点信息,对应上图就是0到6号这六个点的坐标。

      mesh.triangles存储的是平面绘制时,绘制三角形的顶点顺序,对应上图应该是:

      061 651 521 542 432(顺时针)

      每三个一组代表一个三角形,但是大家在这里要注意一下,就是最终绘制出的小三角形是单向图,就是一面可以看到,另一面是看不到的,所以,为了保证所有的小三角形朝向一至,要对mesh.triangles数组在进行调整,调整结果如下:

      016 156 125 245 234(逆时针)

      就是保证小三角形顶点都是按顺时针或者逆时针读取~大家想想就明白了~

      故:基本算法思想就是:

      入口参数:vector3[] vertices,储存平面定点信息,顶点需按顺序储存

      算法思想:从数组首尾向中间遍历,生成triangles顶点ID数组(下列代码中注释的部分)


     

    步驟:

    1、創建一個empty 的gameobject;

    2、添加一個脚本給這個game object;

    算法实现代码如下:

     

    复制代码
    using UnityEngine;
    using System.Collections;
    [RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
    public class quad : MonoBehaviour
    {
        /*
        creat a triangle by using Mesh 
         2016/11/21
                     ————Carl    
        */
        void Start()
        {
            creatPolygon();
        }
    
       
        private void creatPolygon()
        {
            /* 1. 顶点,三角形,法线,uv坐标, 绝对必要的部分只有顶点和三角形。  
                  如果模型中不需要场景中的光照,那么就不需要法线。如果模型不需要贴材质,那么就不需要UV */
            Vector3[] vertices =
            {
             new Vector3 (2f,0,0),
             new Vector3(4f, 0, 0),
             new Vector3(6f, 0, 0),
             new Vector3(10f, 0, 0),
             new Vector3(10f, 20f, 0),
             new Vector3(6f,10f, 0),
             new Vector3(4f, 4f, 0)
            
            };
    
            Vector3[] normals =
            {
                Vector3.up,
                Vector3.up,
                Vector3.up,
                Vector3.up,
                Vector3.up,
                Vector3.up,
                Vector3.up
               
            };
    
            Vector2[] uv =
            {
                Vector2.zero,
                -Vector2.left,
                Vector2.one,
                Vector2.right,
                Vector2.zero,
                -Vector2.left,
                Vector2.one
              
            };
            /*2. 三角形,顶点索引:  
             三角形是由3个整数确定的,各个整数就是角的顶点的index。 各个三角形的顶点的顺序通常由下往上数, 可以是顺时针也可以是逆时针,这通常取决于我们从哪个方向看三角形。 通常,当mesh渲染时,"逆时针" 的面会被挡掉。 我们希望保证顺时针的面与法线的主向一致 */
            int[] indices = new int[15];
            indices[0] = 0;
            indices[1] = 6;
            indices[2] = 1;
    
            indices[3] = 6;
            indices[4] = 2;
            indices[5] = 1;
    
            indices[6] =6;
            indices[7] = 5;
            indices[8] = 2;
    
            indices[9] = 5;
            indices[10] = 4;
            indices[11] = 2;
    
            indices[12] = 4;
            indices[13] = 3;
            indices[14] = 2;
            
           
    
            Mesh mesh = new Mesh();
                mesh.vertices = vertices;
                mesh.normals = normals;
                mesh.uv = uv;
                mesh.triangles = indices;
    
                MeshFilter meshfilter = this.gameObject.GetComponent<MeshFilter>();
                meshfilter.mesh = mesh;
            }
    
        }
    复制代码

    效果图:

     





    教程二

    //通过object对象名 face 得到网格渲染器对象   
    MeshFilter meshFilter = (MeshFilter)GameObject.Find("face").GetComponent(typeof(MeshFilter));  
              
    //通过渲染器对象得到网格对象   
    Mesh mesh = meshFilter.mesh;  
          
    //API中写的不是提清楚,我详细的在说一遍   
              
    //设置顶点,这个属性非常重要   
    //三个点确定一个面,所以Vector3数组的数量一定是3个倍数   
    //遵循顺时针三点确定一面   
    //这里的数量为6 也就是我创建了2个三角面   
    //依次填写3D坐标点   
    mesh.vertices = new Vector3[] {new Vector3(500), new Vector3(050), new Vector3(005),new Vector3(-500), new Vector3(0, -50), new Vector3(00, -5)};  
    //mesh.vertices = new Vector3[] {new Vector3(5, 0, 0), new Vector3(0, 5, 0), new Vector3(0, 0, 5)};  
          
    //设置贴图点,因为面确定出来以后就是就是2D    
    //所以贴纸贴图数量为Vector2    
    //第一个三角形设置5个贴图   
    //第二个三角形设置一个贴图   
    //数值数量依然要和顶点的数量一样   
    mesh.uv = new Vector2[] {new Vector2(00), new Vector2(05), new Vector2(55)};  
    //mesh.uv = new Vector2[] {new Vector2(0, 0), new Vector2(0, 1), new Vector2(1, 1)};
              
    //设置三角形索引,这个索引是根据上面顶点坐标数组的索引   
    //对应着定点数组Vector3中的每一项   
    //最后将两个三角形绘制在平面中   
    //数值数量依然要和顶点的数量一样   
    mesh.triangles= new int []{0,1,2};  
    复制代码

     
    我测试时导入了一个立方体,测试时发现导入的立方体顶点是由4*6组成的,也就是说4个点组成一个面,立方体共6个面

    顶点是由4*6组成的,但u3d还是会以三角网去解析,关键就是triangles,它负责存储每个三角网的顶点,也就是立方体的一个面由两个三角形组成

    复制代码
    MeshFilter meshFilter = (MeshFilter)GameObject.Find("box").GetComponent(typeof(MeshFilter));
    Mesh mesh = meshFilter.mesh;
    string strVertices = "";
    foreach(Vector3 v3 in mesh.vertices){
        if (strVertices==""){
            strVertices = v3.ToString();
        }
        else{
            strVertices += "," + v3.ToString();
        }
    }
    Debug.Log(mesh.vertices.Length + " " + strVertices);

    string strUV = "";
    foreach(Vector2 v2 in mesh.uv){
        if (strUV==""){
            strUV = v2.ToString();
        }
        else{
            strUV += "," + v2.ToString();
        }
    }
    Debug.Log(mesh.uv.Length + " "+ strUV);
            
    string strTriangles = "";
    foreach(int t in mesh.triangles){
        if (strTriangles==""){
            strTriangles = t.ToString();
        }
        else{
            strTriangles += "," + t.ToString();
        }
    }
    Debug.Log(mesh.triangles.Length + " " + strTriangles);
    复制代码

    输出的信息如下:

    (0.6, -0.6, 0.0),(-0.6, -0.6, 0.0),(0.6, 0.6, 0.0),(-0.6, 0.6, 0.0),
    (0.6, -0.6, 0.7),(-0.6, -0.6, 0.7),(0.6, 0.6, 0.7),(-0.6, 0.6, 0.7),
    (0.6, -0.6, 0.0),(-0.6, -0.6, 0.7),(-0.6, -0.6, 0.0),(0.6, -0.6, 0.7),
    (-0.6, -0.6, 0.0),(-0.6, 0.6, 0.7),(-0.6, 0.6, 0.0),(-0.6, -0.6, 0.7),
    (-0.6, 0.6, 0.0),(0.6, 0.6, 0.7),(0.6, 0.6, 0.0),(-0.6, 0.6, 0.7),
    (0.6, 0.6, 0.0),(0.6, -0.6, 0.7),(0.6, -0.6, 0.0),(0.6, 0.6, 0.7)

    (0.6, 0.1),(0.4, 0.1),(0.6, 0.4),(0.4, 0.4),
    (0.4, 0.4),(0.6, 0.4),(0.4, 0.6),(0.6, 0.6),
    (0.6, 0.4),(0.9, 0.6),(0.9, 0.4),(0.6, 0.6),
    (0.3, 0.7),(0.6, 0.9),(0.6, 0.7),(0.3, 0.9),
    (0.6, 0.7),(0.9, 0.9),(0.9, 0.7),(0.6, 0.9),
    (0.1, 0.4),(0.3, 0.6),(0.3, 0.4),(0.1, 0.6)

    2,0,3,
    3,0,1,
    5,4,7,
    7,4,6,
    10,8,9,
    9,8,11,
    14,12,13,
    13,12,15,
    18,16,17,
    17,16,19,
    22,20,21,
    21,20,23


    可以看出第一个平面是由0,1,2,3这四个点组成,在triangles中指定2,0,3这三个点绘制一个三角网,3,0,1这三个点绘制一个三角网。



    展开全文
  • Unity3D Mesh 创建(一)

    2018-05-03 11:29:04
    1.《Unity3D 动态创建Mesh(一)》http://www.cnblogs.com/kyokuhuang/p/4191169.html 练习会 明白其中的左手螺旋定则的左手拇指代表的单个面的正面法线方向的概念。(这个概念也就是链接中定义vertices[0,1,2,3,4...

    1.《Unity3D 动态创建Mesh(一)》

    http://www.cnblogs.com/kyokuhuang/p/4191169.html 练习会 明白其中的左手螺旋定则的左手拇指代表的单个面的正面法线方向的概念。(这个概念也就是链接中定义vertices[0,1,2,3,4……]等顺序的原因所在。) 

    注意:

    1. Vector3[] vertices 和 int[] triangles,这两个数组之间的关系,vertices的下标 和triangles的值之间的关系。triangles的下标三个代表一个三角形。

    2.按照链接中弄出来的cube是朝外的面可见,朝内的面(视角进入cube内,就会发现啥都看不到)没有绘制的。也就是单面的cube。如需双面的增加 int[] triangles = new int[36]到 int[] triangles = new int[72],并增加如下代码:


    2.《Unity3D Mesh小课堂(一)三角形》 

    https://blog.csdn.net/ecidevilin/article/details/52431530  学习三角形的画法,并且深入学习Gizmos中的Static Properties和Static Method

    注意:public static float Cos(float rad); //rad为弧度=Mathf.Deg2Rad * angleDegree(已知夹角角度)

    3.《unity, Gizmos.DrawMesh一个坑》

    https://www.cnblogs.com/wantnon/p/6426890.html

    其中正确写法1中的mesh.normals=...赋值要给他vector3[]{},例如如下2句都可以绘制出面朝上的三角形():


    mesh.normals=new Vector3[] {(mesh.vertices[1]- mesh.vertices[0]),(mesh.vertices[2] - mesh.vertices[1]),(mesh.vertices[0] - mesh.vertices[2]) };(符合左手定则)

    // mesh.SetNormals(new System.Collections.Generic.List<Vector3>() { (mesh.vertices[1] - mesh.vertices[0]), (mesh.vertices[2] - mesh.vertices[1]), (mesh.vertices[0] - mesh.vertices[2]) });(符合左手定则

            //mesh.normals = new Vector3[] { (mesh.vertices[0] - mesh.vertices[1]), (mesh.vertices[1] - mesh.vertices[2]), (mesh.vertices[2] - mesh.vertices[0]) };(不符合左手定则,但是也是能从正面看到的,这个有点奇怪。待研究ing

    // mesh.SetNormals(new System.Collections.Generic.List<Vector3>() { (mesh.vertices[0] - mesh.vertices[1]), (mesh.vertices[1] - mesh.vertices[2]), (mesh.vertices[2] - mesh.vertices[0]) });(不符合左手定则,但是也是能从正面看到的,这个有点奇怪。待研究ing

    展开全文
  • Unity 3D 创建Mesh(一)

    2015-05-19 14:58:29
    Unity 3D 创建Mesh 一、Unity 3D 创建面片(MeshMesh是一种网格,可以产生像地形那样震撼的效果,那么怎样创建Mesh呢?那就要知道Mesh包含什么! Mesh(网格):顶点、三角形、段数(一条直线有段)。 如图所示:...

    Unity 3D 创建Mesh(一)


    一、Unity 3D 创建面片(Mesh)

    Mesh是一种网格,可以产生像地形那样震撼的效果,那么怎样创建Mesh呢?那就要知道Mesh包含什么!
    Mesh(网格):顶点、三角形、段数。
    如图所示:该网格该如何表示呢?
    顶点(vertexes) 16=4*4
    段数(segment) 3*3
    三角形(triangles) 18
    但是,三角形数目不是自己数,而是计算出来的。

    二、创建Mesh属性

    我们来创建一个长宽为100m*100m,高度为0m,段数为3*3的网格,如上图所示
    /*  Mesh属性
         *      长宽
         *      段数
         *      高度
         */
        private Vector2 size;//长度和宽度
        private float height= 0;//高度
        private Vector2 segment;//长度的段数和宽度的段数
    /*  顶点属性
         *      顶点
         *      uv
         *      三角形 
         */
        private Vector3[] vertexes;//顶点数
        private int[] triangles;//三角形索引


    
    
        /*计算顶点,存入顶点数组*/
        private void computeVertexes()
        {
            int sum = Mathf.FloorToInt((segment.x + 1) * (segment.y + 1));//顶点总数
            float w = size.x / segment.x;//每一段的长度
            float h = size.y / segment.y;
     
            GetTriangles();//计算三角形索引顶点序列
    
            int index = 0;
            vertexes = new Vector3[sum];
            for (int i = 0; i < segment.y + 1;i++ )
            {
                for (int j = 0; j < segment.x + 1; j++)
                {
                    float tempHeight = 0;
                    vertexes[index] = new Vector3(j*w, 0, i*h);//计算完顶点
                    index++;
                }
            }
        }
    /*计算三角形的顶点索引*/
    private int[] GetTriangles()
        {
            int sum = Mathf.FloorToInt(segment.x * segment.y * 6);//三角形顶点总数:假设是1*1的网格,会有2个顶点复用,因此是6个顶点。假设是2*2的网格,则是4个1*1的网格,即4*6即2*2*6!
            triangles = new int[sum];
            uint index = 0;
            for (int i = 0; i < segment.y; i++)
            {
                for (int j = 0; j < segment.x; j++)
                {
                    int role = Mathf.FloorToInt(segment.x) + 1;
                    int self = j + (i * role);
                    int next = j + ((i + 1) * role);
                    //顺时针
    //第一个三角形
                    triangles[index] = self;
                    triangles[index + 1] = next + 1;
                    triangles[index + 2] = self + 1;
    //第二个三角形
                    triangles[index + 3] = self;
                    triangles[index + 4] = next;
                    triangles[index + 5] = next + 1;
                    index += 6;
                }
            }
            return triangles;
        }
    
    
    
    
    到此:顶点、三角形计算完成!接下来是渲染。

    三、渲染网格

    在Unity 3D中,一个GameObject只有一个transform组件。我们在程序中,声明一个GameObject变量,通过添加MeshFilter来增加Mesh属性,通过MeshRenderer渲染出来,在MeshRenderer中,我们使用默认材质球。
        private GameObject mMesh;
        private Material mMaterial;
    mMesh = new GameObject();
            mMesh.name = "CreateMesh";
    </pre><pre code_snippet_id="655703" snippet_file_name="blog_20150429_12_2096575" name="code" class="cpp">    private void DrawMesh()
        {
            Mesh mesh = mMesh.AddComponent<MeshFilter>().mesh;//网格
            mMesh.AddComponent<MeshRenderer>();//网格渲染器
    
            mMaterial = new Material(Shader.Find("Diffuse"));//材质
    
            mMesh.GetComponent<Renderer>().material = mMaterial;
    
            /*设置mesh*/
            mesh.Clear();//更新
            mesh.vertices = vertexes;
            //mesh.uv 
            mesh.triangles = triangles;
    
            mesh.RecalculateNormals();
            mesh.RecalculateBounds();
    
        }

    
    
    
    

    四、完整代码(有点不一样,扩充了点,拖在摄像机下面即可)

    using UnityEngine;
    using System.Collections;
    
    /*仅仅创建Mesh
     *
     *
     */
    public class CreatMesh : MonoBehaviour {
    
        private GameObject mMesh;
        private Material mMaterial;
    
        /*  Mesh属性
         *      长宽
         *      段数
         *      高度
         *      高度差
         */
        private Vector2 size;//长度和宽度
        private float minHeight = -10;//最小高度
        private float maxHeight = 10;//最大高度
        private Vector2 segment;//长度的段数和宽度的段数
        private float unitH;//最小高度和最大高度只差,值为正
    
        /*  顶点属性
         *      顶点
         *      uv
         *      三角形 
         */
        private Vector3[] vertexes;//顶点数
        private Vector2 uvs;//uvs坐标
        private int[] triangles;//三角形索引
    
    	void Start () {
            creatMesh(100, 100, 3, 3, -10, 10);
    	}
    	
        private void creatMesh(float width, float height, uint segmentX, uint segmentY,int min, int max)
        {
            size = new Vector2(width, height);
            maxHeight = max;
            minHeight = min;
            unitH = maxHeight - minHeight;
            segment = new Vector2(segmentX, segmentY);
    
            if (mMesh != null)
            {
                Destroy(mMesh);
            }
            mMesh = new GameObject();
            mMesh.name = "CreateMesh";
    
            computeVertexes();
            DrawMesh();
        }
    
        private void computeVertexes()
        {
            int sum = Mathf.FloorToInt((segment.x + 1) * (segment.y + 1));//顶点总数
            float w = size.x / segment.x;//每一段的长度
            float h = size.y / segment.y;
     
            GetTriangles();
    
            int index = 0;
            vertexes = new Vector3[sum];
            for (int i = 0; i < segment.y + 1;i++ )
            {
                for (int j = 0; j < segment.x + 1; j++)
                {
                    float tempHeight = 0;
                    vertexes[index] = new Vector3(j*w, 0, i*h);
                    index++;
                }
            }
        }
    
        private void DrawMesh()
        {
            Mesh mesh = mMesh.AddComponent<MeshFilter>().mesh;//网格
            mMesh.AddComponent<MeshRenderer>();//网格渲染器
    
            mMaterial = new Material(Shader.Find("Diffuse"));//材质
    
            mMesh.GetComponent<Renderer>().material = mMaterial;
    
            /*设置mesh*/
            mesh.Clear();//更新
            mesh.vertices = vertexes;
            //mesh.uv 
            mesh.triangles = triangles;
    
            mesh.RecalculateNormals();
            mesh.RecalculateBounds();
    
        }
    
        private int[] GetTriangles()
        {
            int sum = Mathf.FloorToInt(segment.x * segment.y * 6);//三角形顶点总数
            triangles = new int[sum];
            uint index = 0;
            for (int i = 0; i < segment.y; i++)
            {
                for (int j = 0; j < segment.x; j++)
                {
                    int role = Mathf.FloorToInt(segment.x) + 1;
                    int self = j + (i * role);
                    int next = j + ((i + 1) * role);
                    //顺时针
                    triangles[index] = self;
                    triangles[index + 1] = next + 1;
                    triangles[index + 2] = self + 1;
                    triangles[index + 3] = self;
                    triangles[index + 4] = next;
                    triangles[index + 5] = next + 1;
                    index += 6;
                }
            }
            return triangles;
        }
    }
    




    展开全文
  • 1.Mesh、MeshFilter、MeshRenderer关系整理 ...在Unity3D中创建一个Cube,在Inspector可以看到其中含有MeshFilter、MeshRenderer组件。 MeshFilter含有一个Public成员 Mesh。 在Mesh中存储着三维模型的数据...

    转自:https://www.cnblogs.com/kyokuhuang/p/4191169.html

    1.Mesh、MeshFilter、MeshRenderer关系整理

    在Unity3D中创建一个Cube,在Inspector可以看到其中含有MeshFilter、MeshRenderer组件。

    MeshFilter含有一个Public成员 Mesh。

    在Mesh中存储着三维模型的数据:vertices(顶点数据数组Vector3[])、triangles(三角形顶点索引数组,int[])、normals(法线向量数组,Vector3[])、uv(纹理坐标数组,Vector2[])。

    2.使用Mesh创建一个Cube

    创建一个脚本dyn3d.cs,成为Main Camera的组件,点击运行即可看到动态生成的Cube

     

    using UnityEngine;
    using System.Collections;
    
    public class dyn3d : MonoBehaviour {
    
        // Use this for initialization
        void Start () {
        
            CreateCube();
        }
        
        // Update is called once per frame
        void Update () {
    
        }
    
        void CreateCube()
        {
    
            GameObject obj=new GameObject("cube");
            MeshFilter mf=obj.AddComponent<MeshFilter>();
            MeshRenderer mr=obj.AddComponent<MeshRenderer>();
            
            
            Vector3[] vertices=new Vector3[24];
            int[] triangles=new int[36];
    
            //forward
            vertices[0].Set(0.5f,-0.5f,0.5f);
            vertices[1].Set(-0.5f,-0.5f,0.5f);
            vertices[2].Set(0.5f,0.5f,0.5f);
            vertices[3].Set(-0.5f,0.5f,0.5f);
            //back
            vertices[4].Set(vertices[2].x,vertices[2].y,-0.5f);
            vertices[5].Set(vertices[3].x,vertices[3].y,-0.5f);
            vertices[6].Set(vertices[0].x,vertices[0].y,-0.5f);
            vertices[7].Set(vertices[1].x,vertices[1].y,-0.5f);
            //up
            vertices[8]=vertices[2];
            vertices[9]=vertices[3];
            vertices[10]=vertices[4];
            vertices[11]=vertices[5];
            //down
            vertices[12].Set(vertices[10].x,-0.5f,vertices[10].z);
            vertices[13].Set(vertices[11].x,-0.5f,vertices[11].z);
            vertices[14].Set(vertices[8].x,-0.5f,vertices[8].z);
            vertices[15].Set(vertices[9].x,-0.5f,vertices[9].z);
            //right
            vertices[16]=vertices[6];
            vertices[17]=vertices[0];
            vertices[18]=vertices[4];
            vertices[19]=vertices[2];
            //left
            vertices[20].Set(-0.5f,vertices[18].y,vertices[18].z);
            vertices[21].Set(-0.5f,vertices[19].y,vertices[19].z);
            vertices[22].Set(-0.5f,vertices[16].y,vertices[16].z);
            vertices[23].Set(-0.5f,vertices[17].y,vertices[17].z);
            
            int currentCount=0;
            for(int i=0;i<24;i=i+4)
            {
                triangles[currentCount++]=i;
                triangles[currentCount++]=i+3;
                triangles[currentCount++]=i+1;
                
                triangles[currentCount++]=i;
                triangles[currentCount++]=i+2;
                triangles[currentCount++]=i+3;
                
            }
    
            mf.mesh.vertices=vertices;
            mf.mesh.triangles=triangles;
            
        }
    }

    在这里定义vertices数组存储顶点坐标信息,定义triangles数组存储三角形顶点索引。但是这个Mesh不包含normals和uv信息,所以显示出来的正方体是无纹理贴图,并且不能反应环境光照的。

     3.冗余的顶点坐标

    正方体6个面,每个面由2个三角形组成,所以共需要36个三角形顶点索引。但是正方体只有8个顶点,为什么需要24个顶点坐标数据呢?

    答案是:Unity3D的Mesh.triangles是三角形索引数组,不仅依靠这个索引值索引三角形顶点坐标,而且索引纹理坐标,索引法线向量。即正方体的每个顶点都参与了3个平面,而这3个平面的法线向量是不同的,该顶点在渲染这3个平面的时候需要索引到不同的法线向量。而由于顶点坐标和法线向量是由同一个索引值triangles[Index]取得的,例如,根据triangles[0],triangles[14],triangles[17]在vertices中索引到的顶点都为(0.5,-0.5,0.5),但是在normals中索引到的法向量值各不相同。这就决定了在正方体中一个顶点,需要有3份存储。(如果你需要创建其它模型,需要根据实际情况决定顶点坐标的冗余度。实质上顶点坐标的冗余正是方便了法线坐标、纹理坐标的存取。)

    4.三角形的渲染

    准则:三角形有两面,正面可见,背面不可见。三角形的渲染顺序与三角形的正面法线呈左手螺旋定则

    这就决定了,如果我们需要渲染如下一个正方形面,那么就需要保证组成这个正方形的两个小三角形的正面法线都是指向屏幕外的。

    我在程序中的顶点顺序为,三角形1: 0->3->1,三角形2: 0->2->3 。

    int currentCount=0;
    for(int i=0;i<24;i=i+4)
    {
            //三角形1
        triangles[currentCount++]=i;
        triangles[currentCount++]=i+3;
        triangles[currentCount++]=i+1;
        //三角形2        
        triangles[currentCount++]=i;
        triangles[currentCount++]=i+2;
        triangles[currentCount++]=i+3;
    }

     

    这段代码保证了正方体的6个面,12个三角形的都正确被渲染(正面法线朝外)。

    展开全文
  • unity3d 画弧面mesh,抛物线mesh 废话不多,直接上图,有图有真相 直接上代码 using UnityEngine; using System.Collections; public class CreateArcSurface : MonoBehaviour { [Header("【开始点位置】...
  • 操作环境:Win7操作系统、Unity3D 4.0 创建网格面的核心就是为其添加2个组件:Mesh Renderer(网格渲染器)和Mesh Filter(网格过滤器)。 添加组件的方法有2种: (Ⅰ)选择一个游戏对象,然后执行Component...
  • Unity3D开发之创建mesh

    2017-09-01 16:23:49
    之前写的创建mesh其实是有问题的,我只给mesh赋上顶点信息,并没有赋上发现信息以及uv信息。所以,本片博客着重讲下创建mesh过程。 首先我们需要获取到顶点信息,也就是组成这个mesh的所有三角形顶点信息。这里提醒...
  • 在游戏开发过程中不免会遇到自己动态生成Mesh的操作,下面的代码中在运行之后会动态的生成一个面片,本例中只设置了顶点、顶点颜色、uv以及三角形顺序。 using System.Collections; using System.Collections....
  • Unity3d mesh合并,网格合并具体用法教程 Unity开发Mesh合并网格 Chinar-本文提供全流程,中文翻译。 助力快速理解 Unity 中合并网格的概念与流程 Unity 开发中,如果我们需要做性能优化 或者是一些项目需求,需要将...
  • 尽管unity3D中直接有模块画圆柱体,但画圆面仍旧需要自己使用mesh来绘制。使用mesh画图一般分为四个步骤。 1.顶点 2.三角形 3.UV 4.负载属性与mesh 自己绘制一个简单的平面代码如下: Mesh Createmeshp(float...
  • Unity3DMesh的基本单位是三角形,而圆形就是由许许多多的三角形组成的。我们绘制N个等腰三角形,把它们拼起来,就形成了一个圆。 而圆环则是由N个等腰梯形组成,而每个梯形则是由两个三角形组成。
  • 假如我们要创建如下一个网格,该怎么做呢? 这是个4x4的网格,一共有25个顶点,16x2个三角形。 建个坐标系如下图: 1.创建顶点: 如坐标系所示,我们的25个顶点为: ...(0,1)(1,1)(2,1)(3,1)(4,1...
  • 操作环境:Win7操作系统、Unity3D 4.0 创建网格面的核心就是为其添加2个组件:Mesh Renderer(网格渲染器)和Mesh Filter(网格过滤器)。 添加组件的方法有2种: (Ⅰ)选择一个游戏对象,然后执行Component→Mesh→...
  • Unity3D合并Mesh

    2020-07-30 23:30:23
    Unity3D里合并Mesh,参考博客http://blog.csdn.net/ecidevilin/article/details/52490960
  • 从官方手册中可以知道,想要使用代码来创建Mesh需要至少四个步骤: 设置顶点数组(想要创建的面一共有多少个顶点) 设置三角形信息(每三个顶点确定一个三角形,要顺时针的设置) 设置法线信息(可以通过mesh的方法...
  • MeshUnity内的一个组件,称为网格组件。 ◦ Mesh 网格 ◦ MeshFilter 网格过滤器 ◦ Mesh Renderer 网格渲染器 Mesh:是指模型的网格,建模就是建网格。细看Mesh,可以知道Mesh的主要属性内容包括顶点坐标,法线,...
  • 如果要把unity3D的工程,转到flash平台,是有一些限制的,其中,unity3d的地形不能使用,这就是一个很大的问题。 所以,使用mesh来替代unity自带的地形,就变成首选的解决方案。 问题接着而来,mesh怎么像unity...
  • Unity3d生成Mesh

    2017-08-01 21:42:17
    因为项目需要导入已知点,根据已知点生成一个类似于圆胎的Mesh,所以想了下Mesh生成物体的代码逻辑。 假设现在有9个Vertice(Vector3),横向HorizontalNumber=3,纵向Horizontal=3,那么按照三角形生成原理,有...
  • Unity3D 动态创建Mesh

    2016-04-28 17:34:03
    转载:http://www.cnblogs.com/kyokuhuang/p/4191169.html
1 2 3 4 5 ... 20
收藏数 9,125
精华内容 3,650
关键字:

mesh使用 unity3d