unity 脚本创建 MESH(网格)

来源:互联网 发布:手机淘宝兼职青青岛 编辑:程序博客网 时间:2024/04/29 09:33

Unity 脚本创建 Mesh
网格由点面 , 组成 , 每个面是三个顶点构成
代码如下:

using UnityEngine;using System.Collections;public class mesh01 : MonoBehaviour {    // Use this for initialization    void Start () {        CreatePlane ();    }    // Update is called once per frame    void Update () {    }    void  CreatePlane(){        GameObject plane = new GameObject ();        plane.name  = "plane";        //  添加组件        MeshFilter mfilter =plane.AddComponent<MeshFilter> ();        MeshRenderer render =   plane.AddComponent<MeshRenderer> ();        // 添加默认的材质        render.material=new Material(Shader.Find("Diffuse"));        //mfilter.mesh  = new Mesh ();        Mesh mesh = mfilter.mesh;        //  设置三个顶点        mesh .vertices = new Vector3[] {            new Vector3 (0, 0, 0),            new Vector3 (0, 1, 0),            new Vector3 (1, 1, 0)        };        //  设置三角形 (面)  这里 三个点的顺序 应该有(顺时针法则)        mesh.triangles = new int[]{            0,1,2        };        // 重新计算法线        mesh.RecalculateNormals ();    }}

运行结果

这里写图片描述

三角形面的顺时针法则 (这个法则是我个人的叫法 不知相关是否有特定的名称。)

我们修改一下代码 在每一个顶点上添加一个物体以作说明

void  CreatePlane(){        GameObject plane = new GameObject ();        plane.name  = "plane";        //  添加组件        MeshFilter mfilter =plane.AddComponent<MeshFilter> ();        MeshRenderer render =   plane.AddComponent<MeshRenderer> ();        // 添加默认的材质        render.material=new Material(Shader.Find("Diffuse"));        //mfilter.mesh  = new Mesh ();        Mesh mesh = mfilter.mesh;        //  设置三个顶点        mesh .vertices = new Vector3[] {            new Vector3 (0, 0, 0),            new Vector3 (0, 1, 0),            new Vector3 (1, 1, 0)        };        GameObject a0 = GameObject.CreatePrimitive (PrimitiveType.Cube);        a0.transform.position = mesh .vertices [0];        Vector3 miniScale = new Vector3 (0.1f, 0.1f, 0.1f);        a0.transform.localScale = miniScale;        a0.GetComponent<MeshRenderer> ().material.color = Color.red;        GameObject a1 = GameObject.CreatePrimitive (PrimitiveType.Sphere);        a1.transform.position = mesh .vertices [1];        a1.transform.localScale = miniScale;        a1.GetComponent<MeshRenderer> ().material.color = Color.green;        GameObject a2 = GameObject.CreatePrimitive (PrimitiveType.Cylinder);        a2.transform.position = mesh .vertices [2];        a2.transform.localScale = miniScale;        a2.GetComponent<MeshRenderer> ().material.color = Color.blue;        //  设置三角形 (面)        mesh.triangles = new int[]{            0,1,2        };        // 重新计算法线        mesh.RecalculateNormals ();    }

结果
这里写图片描述

0,1,2 顶点 分别是红方块 , 绿球 , 蓝圆柱

在这个角度 (主摄相机 是默认位置方向 位置(0,1,-10) 方向(0,0,0) )。就是在 Z 为-10 的位置看原点 (严格来说应该是看向 0,1,0 位置) 方向 是正Z 轴方向。 我们可以看到 0,1,2 顺序 的三角而 这时 是顺时针 下 —-> 上——> 右上 , 这时可以看到面


然后 我们 再设置一下主摄相机 的位置 和方向 位置 (0,1 ,10) 旋转(0,180,0)

结果
这里写图片描述

在这个结果 是摄相机 从Z =10 的位置看 原点, 方向为负Z轴, 0,1,2 的三角面 是逆时针

下 ——》上 ——》 上右 这时看不到三角面(因为三角面的背面是不渲染的)