绘制平面三角形
创建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;
}
}