//Здесь происходит вся работа. MarchCubesPrimitive - реализация GeometricPrimitive из примера XNA. isolevel - уровень на изоповерхности. public static void Process(GraphicsDevice graphicsDevice, double isolevel, ref CubePrimitive primitive) { //Очищаем буферы вершин и индексов //primitive.Clear(); int triNum = 0; for (int i = 0; i < _size; i++) { for (int j = 0; j < _size; j++) { for (int k = 0; k < _size; k++) { //Заполняем _triangles и получаем количество треугольников triNum = Polygonise(i, j, k, isolevel); if (triNum > 0) { Build(ref primitive, triNum);//А здесь заполняем буферы } } } } if (primitive.CurrentVertex == 0) { primitive.isDrawable = false; } else { primitive.InitializePrimitive(graphicsDevice); } }
public static GeometricPrimitive Process(GraphicsDevice graphicsDevice, double isolevel) { var res = new CubePrimitive(); Process(graphicsDevice, isolevel, ref res); return(res); }
//Опять же все тривиально, перебираем индексы и вершины для полученных треугольников и добавляем в буфер объекта static void Build(ref CubePrimitive res, int tianglesNum) { for (int i = 0; i < tianglesNum; i++) { res.AddIndex(res.VertexCount + 0); res.AddIndex(res.VertexCount + 1); res.AddIndex(res.VertexCount + 2); //Считаем простую нормаль, для всех вершин треугольника одна Vector3 normal = Vector3.Cross(_triangles[i].P[1] - _triangles[i].P[0], _triangles[i].P[2] - _triangles[i].P[0]); res.AddVertex(_triangles[i].P[0], normal); res.AddVertex(_triangles[i].P[1], normal); res.AddVertex(_triangles[i].P[2], normal); } }