/// <summary> /// Generate a flat plane. /// </summary> /// <param name="size">Size of the plane.</param> /// <param name="vertexCount">Number of vertex per side.</param> /// <param name="textureRepeate">Number of texture repeate.</param> /// <returns>A flat plane.</returns> public static Model GeneratePlane(float size, int vertexCount, int textureRepeate, IHeightMap heightMap) { int count = vertexCount * vertexCount; Vertex[] vertecies = new Vertex[count]; int[] indices = new int[6 * (vertexCount - 1) * (vertexCount - 1)]; int vertexPointer = 0; for (int y = 0; y < vertexCount; y++) { for (int x = 0; x < vertexCount; x++) { Vector2 vertexPosition = new Vector2((size / (vertexCount - 1)) * x, (size / (vertexCount - 1)) * y); vertecies[vertexPointer] = new Vertex(new Vector3(vertexPosition.X, heightMap.GetHeight(x / (float)vertexCount, y / (float)vertexCount), vertexPosition.Y), heightMap.GetNormal(x / (float)vertexCount, y / (float)vertexCount), new Point2D(x / ((float)vertexCount - 1) * textureRepeate, (float)y / ((float)vertexCount - 1) * textureRepeate)); vertexPointer++; } } int pointer = 0; for (int y = 0; y < vertexCount - 1; y++) { for (int x = 0; x < vertexCount - 1; x++) { int topLeft = (y * vertexCount) + x; int topRight = topLeft + 1; int bottomLeft = ((y + 1) * vertexCount) + x; int bottomRight = bottomLeft + 1; indices[pointer++] = topLeft; indices[pointer++] = bottomLeft; indices[pointer++] = topRight; indices[pointer++] = topRight; indices[pointer++] = bottomLeft; indices[pointer++] = bottomRight; } } return(new Model(vertecies, indices)); }
public static Mesh3V3N CreateFromHeightMap(int columns, int rows, IHeightMap heightMap) { var vertices = new List <Vertex3V3N>(); for (var x = 0; x <= columns; x++) { for (var y = 0; y <= rows; y++) { var height = heightMap.GetHeight(x, y); vertices.Add(new Vertex3V3N { Position = new Vector3(x, (float)height, y), Normal = (Vector3)heightMap.GetNormal(x, y) }); } } var faces = CreateFaces(columns, rows); return(new Mesh3V3N(vertices, faces).Transformed(Matrix4.CreateTranslation(-columns / 2f, 0, -rows / 2f) * Matrix4.CreateScale((float)(1.0 / columns), 1, (float)(1.0 / rows)))); }
public static Mesh3V3N CreateFromHeightMap(int columns, int rows, IHeightMap heightMap) { var vertices = new List<Vertex3V3N>(); for (var x = 0; x <= columns; x++) { for (var y = 0; y <= rows; y++) { var height = heightMap.GetHeight(x, y); vertices.Add(new Vertex3V3N { Position = new Vector3(x, (float)height, y), Normal = (Vector3)heightMap.GetNormal(x, y) }); } } var faces = new List<Face3>(); for (var x = 0; x < columns; x++) { for (var y = 0; y < rows; y++) { var verticesInColumn = rows + 1; var v0 = x * verticesInColumn + y; var v1 = (x + 1) * verticesInColumn + y; var v2 = (x + 1) * verticesInColumn + y + 1; var v3 = x * verticesInColumn + y + 1; Face3 f0; Face3 f1; if (y % 2 == 0) { if (x % 2 == 0) { f0 = new Face3 { V0 = v0, V1 = v1, V2 = v2 }; f1 = new Face3 { V0 = v0, V1 = v2, V2 = v3 }; } else { f0 = new Face3 { V0 = v0, V1 = v1, V2 = v3 }; f1 = new Face3 { V0 = v1, V1 = v2, V2 = v3 }; } } else { if (x % 2 == 0) { f0 = new Face3 { V0 = v0, V1 = v1, V2 = v3 }; f1 = new Face3 { V0 = v1, V1 = v2, V2 = v3 }; } else { f0 = new Face3 { V0 = v0, V1 = v1, V2 = v2 }; f1 = new Face3 { V0 = v0, V1 = v2, V2 = v3 }; } } faces.Add(f0); faces.Add(f1); } } return new Mesh3V3N(vertices, faces).Transformed(Matrix4.CreateTranslation(-columns / 2, 0, -rows / 2) * Matrix4.CreateScale((float)(1.0 / columns), 1, (float)(1.0 / rows))); }