unity Mesh绘制基础3D立体图形 三角形 正方形 正方体 球体

绘制平面三角形

创建mesh网格对象,获取MeshFilter属性赋值

创建存储三角形顶点集合,集合添加三个顶点,自定义三个顶点

注意:这里顶点添加集合顺时针添加,映射三角形为相机正面,相反为反面 

        Mesh mesh = new Mesh();
        GetComponent<MeshFilter>().mesh = mesh;
        List<Vector3> vector3s = new List<Vector3>();
        vector3s.Add(new Vector3(0, 0, 0));
        vector3s.Add(new Vector3(0, 1, 0));
        vector3s.Add(new Vector3(1, 1, 0));

  mesh.triangles 添加三角形索引,进行绘制

  mesh.triangles = new int[]
       {
           0,1,2
       };

 转为v3数组

  mesh.vertices = vector3s.ToArray();

  添加MeshCollider组件,用于碰撞使用

代码获取组件

GetComponent<MeshCollider>().sharedMesh = mesh;

 绘制平面正方形

 正方形内置两个三角形,三角形是三个顶点 正方形为四个顶点


        vector3s.Add(new Vector3(0, 0, 0));
        vector3s.Add(new Vector3(0, 1, 0));
        vector3s.Add(new Vector3(1, 1, 0));
        vector3s.Add(new Vector3(1, 0, 0));

为两个三角形

0,2,1,
0,3,2,

 绘制正方体

 正方体为八个顶点 六个边 12个三角形 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MeshCube : MonoBehaviour
{
    void Start()
    {
        Mesh mesh = new Mesh();
        GetComponent<MeshFilter>().mesh = mesh;
        List<Vector3> vector3s = new List<Vector3>();
        vector3s.Add(new Vector3(0, 0, 0));
        vector3s.Add(new Vector3(0, 1, 0));
        vector3s.Add(new Vector3(1, 1, 0));
        vector3s.Add(new Vector3(1, 0, 0));
        vector3s.Add(new Vector3(0, 0, 1));
        vector3s.Add(new Vector3(0, 1, 1));
        vector3s.Add(new Vector3(1, 1, 1));
        vector3s.Add(new Vector3(1, 0, 1));
        mesh.vertices = vector3s.ToArray();
        mesh.triangles = new int[]
        {
            0,2,1,
            0,3,2,
            3,6,2,
            3,7,6,
            7,5,6,
            7,4,5,
            5,0,1,
            5,4,0,
            5,1,2,
            5,2,6,
            3,4,7,
            3,0,4,
        };
        GetComponent<MeshCollider>().sharedMesh = mesh;
    }
}
 绘制球体
public class MeshMySphere : MonoBehaviour
{
    //维度长度
    public int wd_len = 16;
    //经度长度
    public int jd_len = 16;
    public List<GameObject> list_ball;

    void Start()
    {
        list_ball = new List<GameObject>();
        Mesh mesh = new Mesh();
        GetComponent<MeshFilter>().mesh = mesh;

        List<Vector3> listdd = new List<Vector3>();//顶点存储
        List<int> listindex = new List<int>(); //存储三角行的索引
        for (int i = 0; i <= wd_len; ++i)
        {
            float wd =(float) i / (float)wd_len;
            float wd_jijiao = wd * Mathf.PI;
            for (int j = 0; j <= jd_len; ++j)
            {
                float jd = (float)j / (float)jd_len;
                float jd_jijiao = jd * Mathf.PI*2;
                //算出x y z坐标
                float x = Mathf.Sin(wd_jijiao) * Mathf.Cos(jd_jijiao);
                float y = Mathf.Cos(wd_jijiao);
                float z = Mathf.Sin(wd_jijiao) * Mathf.Sin(jd_jijiao);

                listdd.Add(new Vector3(x, y, z));

            }
        }
        for (int i = 0; i < wd_len; ++i)
        {
            for (int j = 0; j < jd_len; ++j)
            {
                //计数顶点的索引
                int index1 = i * (jd_len + 1) + j;
                //计数下一个的位置
                int index2 = index1 + jd_len + 1;
                listindex.Add(index1);
                listindex.Add(index2 + 1);
                listindex.Add(index1 + 1);

                listindex.Add(index1);
                listindex.Add(index2);
                listindex.Add(index2 + 1);
            }
        }
       

        mesh.vertices = listdd.ToArray();
        mesh.triangles = listindex.ToArray();

        mesh.RecalculateNormals();   // 重新计算法线,用于渲染时的光照效果
        mesh.RecalculateBounds();    // 重新计算边界,用于物体的碰撞检测等*
        GetComponent<MeshCollider>().sharedMesh = mesh;
    }
}

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值