예제 #1
0
        //Здесь происходит вся работа. 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);
            }
        }
예제 #2
0
        public static GeometricPrimitive Process(GraphicsDevice graphicsDevice, double isolevel)
        {
            var res = new CubePrimitive();

            Process(graphicsDevice, isolevel, ref res);
            return(res);
        }
예제 #3
0
        //Опять же все тривиально, перебираем индексы и вершины для полученных треугольников и добавляем в буфер объекта
        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);
            }
        }