Mesh 网格类
- 一个允许通过脚本来创建和修改meshes的类.
- 网格(meshes)包括顶点和多个三角形数组。
- 三角形数组仅仅是顶点的索引数组,每个三角形包含三个索引。
- 每个顶点可以有一条法线,两个纹理坐标,及颜色和切线。虽然这些是可选的,但是也可以去掉。所有的顶点信息是被储存在单独的同等规格的数组中,所以如果你的网格(mesh)有10个顶点,你同样应该有大小为10的数组来存储法线和其它属性。
1.新建立一个网格 :(
应该总是按照这个顺序来做
)
1)为顶点数组赋值
2)为三角形数组赋值
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public Vector3[] newVertices;
public Vector2[] newUV;
public int[] newTriangles;
void Start() {
Mesh mesh = new Mesh();
GetComponent<MeshFilter>().mesh = mesh;
mesh.vertices = newVertices;//网格顶点
mesh.uv = newUV;
mesh.triangles = newTriangles;//
所有三角形的数组,
这个数组是包含顶点数组索引的三角形列表。三角形数组的大小是3的倍数。顶点可以通过简单的索引同一顶点来共享。如果网格包含多个子网格(材质),三角形列表将包含所有子网格的所有三角形。当你赋值三角形数组,subMeshCount设置为1。如果你想要有多个子网格,使用subMeshCount and SetTriangles。
}
}
也可以直接赋值:
2.每帧修改定点属性
1)获取顶点数组
2)修改它们
1)获取顶点数组
2)修改它们
3)把它们放回网格
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void Update() {
Mesh mesh = GetComponent<MeshFilter>().mesh;
Vector3[] vertices = mesh.vertices;
Vector3[] normals = mesh.normals;
int i = 0;
while (i < vertices.Length) {
vertices[i] += normals[i] * Mathf.Sin(Time.time);
i++;
}
mesh.vertices = vertices;
}
}
3.连续的改变网格的三角形数组值和顶点值(改变顶点数组的长度等)
1)使用Clean刷新
(
调用Clean函数在赋予新的顶点值和三角形索引值之前是非常重要的,Unity总是检查三角形的索引值,判断它们是否超出边界。
调用Clear函数后,给顶点赋值,再给三角形数组赋值,以确保没有超出数组的边界。
)
2)赋予顶点值和其他属性
3)赋予索引值
注:1.当改变顶点数组长度时,其他属性数组长度也会改变
(法线,颜色,切线,纹理坐标),另外,
在为顶点赋值时,如果这个网格的顶点有没有被赋值的那么RecalculateBounds将自动被调用。
2.至于mesh.RecalculateNormals();
在修改完顶点后,通常会更新法线来反映新的变化。法线是根据共享的顶点计算出来的。导入到网格有时不共享所有的顶点。例如:一个顶点在一个纹理坐标的接缝处将会被分成两个顶点。因此这个 RecalculateNormals函数将会在纹理坐标接缝处创建一个不光滑的法线。RecalculateNormals不会自动产生切线,因此bumpmap着色器在调用RecalculateNormals之后不会工作。然而你可以提取你自己的切线。
3.建议先赋值顶点数组之后再赋值三角形数组,为了避免越界的错误。
var newVertices : Vector3[];
var newUV : Vector2[];
var newTriangles : int[];
function Update () {
var mesh : Mesh = GetComponent(MeshFilter).mesh;
mesh.Clear();
// Do some calculations...
// 做一些运算
mesh.vertices = newVertices;
mesh.uv = newUV;
mesh.triangles = newTriangles;
}