int sections = 2; int dimension = TerrainChunkGenerator.GetChunkDimension(sections); var vertices = TerrainChunkGenerator.GenChunkVertices(dimension); var normals = TerrainChunkGenerator.GenChunkNormals(dimension); var texcoords = TerrainChunkGenerator.GenChunkTexcoords(dimension); var indexes = TerrainChunkGenerator.GenChunkIndexes(dimension); using (var file = File.Create("./test.obj")) { using var writer = new StreamWriter(file); writer.WriteLine("o terrain-chunk"); writer.WriteLine("# Vertices"); for (int row = 0; row < dimension; row++) { for (int col = 0; col < dimension; col++) { writer.WriteLine(vertices[col + row * dimension].ToObjVertex()); } } writer.WriteLine("# Normals"); for (int row = 0; row < dimension; row++) { for (int col = 0; col < dimension; col++) { writer.WriteLine(normals[col + row * dimension].ToObjNormal()); } } writer.WriteLine("# Texcoords"); for (int row = 0; row < dimension; row++) { for (int col = 0; col < dimension; col++) { writer.WriteLine(texcoords[col + row * dimension].ToObjTexcoord()); } } writer.WriteLine("# Indexes"); writer.WriteLine("g terrain-chunk"); for (int i = 0; i < indexes.Length; i += 3) { writer.WriteLine("f " + string.Join(' ', indexes[i..(i + 3)].Select(index => $"{index}/{index}/{index}"))); } }