Mesh网格编程 正6面体
首先我们分析下原理:
1.所有模型都是由一个一个三角形面构成。那么我们先来创建一个三角形:
- 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.上面有了一个三角形的网格创建,现在咱们尝试建一个正方形。
- 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个三角形使用。这样这个三角形的数组设置起来就比较方便了。下面看代码:
- 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就行了。
然后赋值上材质,如下图所示: