当做一个地球的时候,可以使用六面体,八面体和20面体来画一个球体,它们的算法都是相同的,下面是20面体画球体的代码
欧拉定理(欧拉公式) V + F- E = 2 (简单多面体的顶点数 V,棱数 E 和面数 F).
1、这种方法的原理是:
对每一个三角面进行一次
public GameObject GetSphere(int subdivision = 5, float radius = 1.0f)
{
GameObject go = new GameObject ("Pentagon");
MeshFilter filter = go.AddComponent<MeshFilter> ();
Mesh mesh = new Mesh();
filter.mesh = mesh;
List<Vector3> vertices = new List<Vector3>()
{
new Vector3(0.000000f, -1.000000f, 0.000000f),
new Vector3(0.723600f, -0.447215f, 0.525720f),
new Vector3(-0.276385f, -0.447215f, 0.850640f),
new Vector3(-0.894425f, -0.447215f, 0.000000f),
new Vector3(-0.276385f, -0.447215f, -0.850640f),
new Vector3(0.723600f, -0.447215f, -0.525720f),
new Vector3(0.276385f, 0.447215f, 0.850640f),
new Vector3(-0.723600f, 0.447215f, 0.525720f),
new Vector3(-0.723600f, 0.447215f, -0.525720f),
new Vector3(0.276385f, 0.447215f, -0.850640f),
new Vector3(0.894425f, 0.447215f, 0.000000f),
new Vector3(0.000000f, 1.000000f, 0.000000f),
};
int[] triangles =
{
0, 1, 2,
1, 0, 5,
0, 2, 3,
0, 3, 4,
0, 4, 5,
1, 5, 10,
2, 1, 6,
3, 2, 7,
4, 3, 8,
5, 4, 9,
1, 10, 6,
2, 6, 7,
3, 7, 8,
4, 8, 9,
5, 9, 10,
6, 10, 11,
7, 6, 11,
8, 7, 11,
9, 8, 11,
10, 9, 11
};
for (int s = 0; s < subdivision; s++)
{
//这将存储连接中已经存在的所有顶点,因此不存在重复/重叠的顶点
List<VertOnEdge> connected = new List<VertOnEdge>();
//细分后的面数
int[] newTriangles = new int[triangles.Length * 4];
//遍历三角形面数
for (int i = 0; i < triangles.Length / 3; i++)
{
//获取一个面的三个顶点
int A = triangles[i * 3];
int B = triangles[i * 3 + 1];
int C = triangles[i * 3 + 2];
int ab = -1;
int bc = -1;
int ca = -1;
List<int> connectionToBeRemoved = new List<int>(); //需要删除的连接