您的位置:首页 > 编程语言

Mesh网格编程 正6面体

2017-11-03 10:31 309 查看
首先我们分析下原理:

1.所有模型都是由一个一个三角形面构成。那么我们先来创建一个三角形:

[csharp] view
plain copy

using UnityEngine;  

using System.Collections;  

  

public class example : MonoBehaviour  

{  

    void Start()  

    {  

        gameObject.AddComponent<MeshFilter>();  

        gameObject.AddComponent<MeshRenderer>();  

        Mesh mesh = GetComponent<MeshFilter>().mesh;  

        mesh.Clear();  

        mesh.vertices = new Vector3[] { new Vector3(0, 0, 0), new Vector3(0, 1, 0), new Vector3(1, 1, 0) };  

        mesh.uv = new Vector2[] { new Vector2(0, 0), new Vector2(0, 1), new Vector2(1, 1) };  

        mesh.triangles = new int[] { 0, 1, 2 };  

    }  

}  

其中的mesh.trangles就是这个三角形,为什么是3个int类型的数呢?因为trangles是一个包含顶点数组索引的三角形列表。

因此这个数组的的大小必须是3的倍数,顶点可以通过简单的索引同一顶点来共享。

建议先赋值顶点数组后再赋值三角形数组,避免数组越界的错误。

2.上面有了一个三角形的网格创建,现在咱们尝试建一个正方形。

[csharp] view
plain copy

using UnityEngine;  

using System.Collections;  

  

public class example : MonoBehaviour  

{  

    void Start()  

    {  

        gameObject.AddComponent<MeshFilter>();  

        gameObject.AddComponent<MeshRenderer>();  

        Mesh mesh = GetComponent<MeshFilter>().mesh;  

        mesh.Clear();  

        mesh.vertices = new Vector3[] { new Vector3(0, 0, 0), new Vector3(0, 1, 0), new Vector3(1, 1, 0), new Vector3(1, 0, 0) };  

        mesh.uv = new Vector2[] { new Vector2(0, 0), new Vector2(0, 1), new Vector2(1, 1) };  

        mesh.triangles = new int[] { 0, 1, 2, 0, 2, 3 };  

    }  

}  

我们发现这个代码,就比三角形多了一个顶点和一个三角形,我们输出图片后就明白三角形为什么这么设置了。



两个三角形的顶点,根据三角形的位置来划分。

3.有了前面两个基础了,下面我们来创建一个立方体(六面体)。

好在六面体是一个非常规则的图形,我们可以计算出,每个定点的位置,共8个定点。但是前面提到了,每个三角形被3个定点公用,我们一个顶点坐标需要有3个,分别被3个三角形使用。这样这个三角形的数组设置起来就比较方便了。下面看代码:

[csharp] view
plain copy

using UnityEngine;  

using UnityEditor;  

  

public class BoxEditor : Editor  

{  

    static Mesh mesh;            // 网格  

    static Vector3[] Vs;         // 模型顶点坐标数组  

    static int[] Ts;             // 三角形的点序列  

    static float lenght = 1f;  

  

    [MenuItem("GameObject/Create Other/Box")]  

    static void CreateRegular()  

    {  

        lenght /= 2f;  

        //网格定点,8个顶点,每个定点被3个三角形公用,共24个定点  

        Vs = new Vector3[]{  

            new Vector3(lenght, -lenght, lenght),  

            new Vector3(-lenght, -lenght, lenght),  

            new Vector3(lenght, lenght, lenght),  

            new Vector3(-lenght, lenght, lenght),  

            new Vector3(lenght, lenght, -lenght),  

            new Vector3(-lenght, lenght, -lenght),  

            new Vector3(lenght, -lenght, -lenght),  

            new Vector3(-lenght, -lenght, -lenght),  

            new Vector3(lenght, lenght, lenght),  

            new Vector3(-lenght, lenght, lenght),  

            new Vector3(lenght, lenght, -lenght),  

            new Vector3(-lenght, lenght, -lenght),  

            new Vector3(lenght, -lenght, -lenght),  

            new Vector3(lenght, -lenght, lenght),  

            new Vector3(-lenght, -lenght, lenght),  

            new Vector3(-lenght, -lenght, -lenght),  

            new Vector3(-lenght, -lenght, lenght),  

            new Vector3(-lenght, lenght, lenght),  

            new Vector3(-lenght, lenght, -lenght),  

            new Vector3(-lenght, -lenght, -lenght),  

            new Vector3(lenght, -lenght, -lenght),  

            new Vector3(lenght, lenght, -lenght),  

            new Vector3(lenght, lenght, lenght),  

            new Vector3(lenght, -lenght, lenght) };  

  

        //三角形的面,(顶点索引构成,每3个顶点一个面,)  

        Ts = new int[] {   

            0, 2, 3,  

            0, 3, 1,  

            8, 4, 5,  

            8, 5, 9,  

            10, 6, 7,  

            10, 7, 11,  

            12, 13, 14,  

            12, 14, 15,  

            16, 17, 18,  

            16, 18, 19,  

            20, 21, 22,  

            20, 22, 23, };  

          

        // 调用创建对象函数  

        CreateObjectByMesh("Box");  

    }  

  

    // 创建对象函数(这个功能提出来,方便以后扩展)  

    static void CreateObjectByMesh(string name)  

    {  

        GameObject regular = new GameObject();  // 创建游戏对象  

        regular.name = name;                    // 根据参数命名  

        regular.AddComponent<MeshFilter>();     // 添加MeshFilter组件  

        regular.AddComponent<MeshRenderer>();   // 添加MeshRenderer组件  

  

        mesh = new Mesh();                      // 创建网格  

        mesh.vertices = Vs;                     // 网格的顶点  

        mesh.triangles = Ts;                    // 网格的三角形  

        regular.GetComponent<MeshFilter>().mesh = mesh; // 添加网格  

    }  

}  

这是一个编辑器脚本,写完后放到你的Editor文件夹下,然后选择Unity上面的菜单栏,GameObject->Create Other->Box就行了。

然后赋值上材质,如下图所示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网格 编程 unity 算法