首页
登录 | 注册

unity 脚本创建 MESH(网格)

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 ();
    }
}

运行结果

unity 脚本创建 MESH(网格)

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

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

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 ();
    }

结果
unity 脚本创建 MESH(网格)

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

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


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

结果
unity 脚本创建 MESH(网格)

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

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



2020 jeepxie.net webmaster#jeepxie.net
10 q. 0.009 s.
京ICP备10005923号