94 lines
2.7 KiB
C#
94 lines
2.7 KiB
C#
// This is free and unencumbered software released into the public domain.
|
|
// For more information, please refer to <http://unlicense.org/>
|
|
|
|
using System;
|
|
using UnityEngine;
|
|
|
|
// Based on http://blog.andreaskahler.com/2009/06/creating-icosphere-mesh-in-code.html
|
|
// Currently unused but planned for use with future features like seam-free mono capture.
|
|
namespace CapturePanorama
|
|
{
|
|
public static class Icosphere
|
|
{
|
|
|
|
// Use this for initialization
|
|
public static Mesh BuildIcosphere(float radius, int iterations)
|
|
{
|
|
Mesh result = BuildIcosahedron(radius);
|
|
for (int i = 0; i < iterations; i++)
|
|
Refine(result);
|
|
return result;
|
|
}
|
|
|
|
public static Mesh BuildIcosahedron(float radius) // radius is distance to each vertex from origin
|
|
{
|
|
Mesh result = new Mesh();
|
|
|
|
// create 12 vertices of a icosahedron
|
|
float t = (float)((1.0 + Math.Sqrt(5.0)) / 2.0);
|
|
|
|
Vector3[] vertices = new Vector3[]
|
|
{
|
|
new Vector3(-1.0f, t, 0.0f),
|
|
new Vector3( 1.0f, t, 0.0f),
|
|
new Vector3(-1.0f, -t, 0.0f),
|
|
new Vector3( 1.0f, -t, 0.0f),
|
|
|
|
new Vector3( 0.0f, -1.0f, t),
|
|
new Vector3( 0.0f, 1.0f, t),
|
|
new Vector3( 0.0f, -1.0f, -t),
|
|
new Vector3( 0.0f, 1.0f, -t),
|
|
|
|
new Vector3( t, 0.0f, -1.0f),
|
|
new Vector3( t, 0.0f, 1.0f),
|
|
new Vector3( -t, 0.0f, -1.0f),
|
|
new Vector3( -t, 0.0f, 1.0f),
|
|
};
|
|
|
|
float scale = radius / new Vector3(1.0f, t, 0.0f).magnitude;
|
|
for (int i = 0; i < vertices.Length; i++)
|
|
vertices[i] *= scale;
|
|
|
|
result.vertices = vertices;
|
|
|
|
result.triangles = new int[]
|
|
{
|
|
// 5 faces around point 0
|
|
0, 11, 5,
|
|
0, 5, 1,
|
|
0, 1, 7,
|
|
0, 7, 10,
|
|
0, 10, 11,
|
|
|
|
// 5 adjacent faces
|
|
1, 5, 9,
|
|
5, 11, 4,
|
|
11, 10, 2,
|
|
10, 7, 6,
|
|
7, 1, 8,
|
|
|
|
// 5 faces around point 3
|
|
3, 9, 4,
|
|
3, 4, 2,
|
|
3, 2, 6,
|
|
3, 6, 8,
|
|
3, 8, 9,
|
|
|
|
// 5 adjacent faces
|
|
4, 9, 5,
|
|
2, 4, 11,
|
|
6, 2, 10,
|
|
8, 6, 7,
|
|
9, 8, 1,
|
|
};
|
|
|
|
return result;
|
|
}
|
|
|
|
private static void Refine(Mesh m)
|
|
{
|
|
throw new Exception("TODO");
|
|
}
|
|
}
|
|
}
|