Mesh 网格类

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)修改它们
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;
}
发布了12 篇原创文章 · 获赞 2 · 访问量 6064

猜你喜欢

转载自blog.csdn.net/qq_19533777/article/details/53457149