Hey! While coding my way through my first little game, I came across fractal Terrain-Generation.
Would be nice as I do not want to built many Planet-Models and Skulp them etc. (I wanna make em random).
For this, it is prefered to use Icospheres as planets due to the static size of triangles.
I started to look around for Tutorials and read throug the Theory of a Icosphere-Creator.
I see it like this: Built a Icosphere with 12 Vertices and 20 Faces made by Indices.
For Refining:
Go through each Index, Calculate the Middle between Point 1 and 2, Point 2 and 3, Point 3 and 1 and add
the resulting vertices with the middle-coords to the Vertex-Stack and get the Indices of the Vertices (called a,b and c).
Make a new List of indices:
Add
Index of Point1, a, c
Index of Point2, b, a
Index of Point3, c, b
a,b,c
to the List
After the whole for-loop
replace indices-list with the new indices-list
BUT: This won't work, for some reasons I do not understand!
I tried to change order of the Indices as I came to the Idea, the vertices was drawn the wrong order but no good.
This is what I wrote:
List<VertexPositionColor> vertices = new List<VertexPositionColor>();
float t = (float)(1.0+Math.Sqrt(5.0f)) /2.0f;
vertices.Add(new VertexPositionColor(new Vector3(-1, 0, t), Color.Gray));
vertices.Add(new VertexPositionColor(new Vector3(1, 0, t), Color.Gray));
vertices.Add(new VertexPositionColor(new Vector3(-1, 0, -t), Color.Gray));
vertices.Add(new VertexPositionColor(new Vector3(1, 0, -t), Color.Gray));
vertices.Add(new VertexPositionColor(new Vector3(0, t, 1), Color.Gray));
vertices.Add(new VertexPositionColor(new Vector3(0, t, -1), Color.Gray));
vertices.Add(new VertexPositionColor(new Vector3(0, -t, 1), Color.Gray));
vertices.Add(new VertexPositionColor(new Vector3(0, -t, -1), Color.Gray));
vertices.Add(new VertexPositionColor(new Vector3(t, 1, 0), Color.Gray));
vertices.Add(new VertexPositionColor(new Vector3(-t, 1, 0), Color.Gray));
vertices.Add(new VertexPositionColor(new Vector3(t, -1, 0), Color.Gray));
vertices.Add(new VertexPositionColor(new Vector3(-t, -1, 0), Color.Gray));
//short[] indices = new short[60];
List<short> indices = new List<short>();
indices.Add(0); indices.Add(6); indices.Add(1);
indices.Add(0); indices.Add(11); indices.Add(6);
indices.Add(1); indices.Add(4); indices.Add(0);
indices.Add(1); indices.Add(8); indices.Add(4);
indices.Add(1); indices.Add(10); indices.Add(8);
indices.Add(2); indices.Add(5); indices.Add(3);
indices.Add(2); indices.Add(9); indices.Add(5);
indices.Add(2); indices.Add(11); indices.Add(9);
indices.Add(3); indices.Add(7); indices.Add(2);
indices.Add(3); indices.Add(10); indices.Add(7);
indices.Add(4); indices.Add(8); indices.Add(5);
indices.Add(4); indices.Add(9); indices.Add(0);
indices.Add(5); indices.Add(8); indices.Add(3);
indices.Add(5); indices.Add(9); indices.Add(4);
indices.Add(6); indices.Add(10); indices.Add(1);
indices.Add(6); indices.Add(11); indices.Add(7);
indices.Add(7); indices.Add(10); indices.Add(6);
indices.Add(7); indices.Add(11); indices.Add(2);
indices.Add(8); indices.Add(10); indices.Add(3);
indices.Add(9); indices.Add(11); indices.Add(0);
List<short> indices2 = new List<short>();
for (int i = 0; i < indices.Count; i++)
{
Vector3 p1 = vertices[indices[i]].Position;
short p1I = (short)i++;
Vector3 p2 = vertices[indices[i]].Position;
short p2I = (short)i++;
Vector3 p3 = vertices[indices[i]].Position;
short p3I = (short)i;
short a = (short)vertices.Count;
vertices.Add(new VertexPositionColor(new Vector3((p1.X + p2.X) / 2, (p1.Y + p2.Y) / 2, (p1.Z + p2.Z) / 2), Color.Black));
short b = (short)vertices.Count;
vertices.Add(new VertexPositionColor(new Vector3((p2.X + p3.X) / 2, (p2.Y + p3.Y) / 2, (p2.Z + p3.Z) / 2), Color.Black));
short c = (short)vertices.Count;
vertices.Add(new VertexPositionColor(new Vector3((p3.X + p1.X) / 2, (p3.Y + p1.Y) / 2, (p3.Z + p1.Z) / 2), Color.Black));
indices2.Add(indices[p1I]); indices2.Add(a); indices2.Add(c);
indices2.Add(indices[p2I]); indices2.Add(b); indices2.Add(a);
indices2.Add(indices[p3I]); indices2.Add(c); indices2.Add(b);
indices2.Add(a); indices2.Add(b); indices2.Add(c);
}
indices = indices2;
vertexList = new VertexPositionColor[vertices.Count];
for (int i = 0; i < vertices.Count; i++)
{
vertexList[i] = vertices[i];
}
short[] indexList = new short[indices.Count];
for (int i = 0; i < indices.Count;i++ )
{
indexList[i] = indices[i];
}
vertexBuffer = new VertexBuffer(GraphicsDevice, typeof(VertexPositionColor),12,BufferUsage.WriteOnly);
vertexBuffer.SetData<VertexPositionColor>(vertexList);
indexBuffer = new IndexBuffer(graphics.GraphicsDevice, typeof(short), indexList.Length, BufferUsage.WriteOnly);
indexBuffer.SetData(indexList);
Could anyone see through the code and show me my obvious error?
Thanks!
Edit:
I tried it on a single Triangle. Result: It worked. But on the Ico, it won't :/ whats wrong with it?