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就行了。
然后赋值上材质,如下图所示:
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就行了。
然后赋值上材质,如下图所示:
相关文章推荐
- Mesh网格编程(一) 流体
- Mesh网格编程(四) 正6面体
- Mesh网格编程(二) 万能网格几何体
- 【Unity】Mesh网格编程(一)正二十面体
- Mesh网格编程(一) 流体水
- Mesh网格编程(二) 万能网格几何体
- Mesh网格编程(三) 正12面体
- 【Unity】Mesh网格编程(一)正二十面体
- Mesh网格编程(一) 流体
- 【Unity】Mesh网格编程(二)流体
- unity3d网格(mesh)编程的研究
- 【Unity】Mesh网格编程(四)麦比乌斯环
- Unity网格编程篇(二) 非常详细的Mesh编程入门文章
- 【Unity】Mesh网格编程(三)万能网格几何形体
- MeshBasicMaterial 网格基础材质
- 【编程网格无水题】之【最短歧义串】
- [Mesh]绘制交互网格
- Qt 网格编程
- unity 3d 之合并网格和贴图(combine mesh and texture)
- 万字长文|深度剖析Service Mesh服务网格新生代Istio