SharpGL - нарисуйте сферу с сеткой и придайте каждой из них цвет

Я создаю 3D-визуализацию в SharpGL (расширение для Visual Studio 2013, где мы можем использовать библиотеку OpenGL). Я хочу визуализировать тетраэдр. Его нужно создать из множества точек - пользователь при старте приложения определяет сумму векторов. У меня есть словарь с координатами для каждой вершины, которые я вычисляю в этих двух классах:

public class Matrix4
{
    private List<Tuple<int, int, int, int>> set = new List<Tuple<int, int, int, int>>();

    public Matrix4()
    {

    }

    public Matrix4(int vectorSum)
    {
        set = GiveMatrix4(vectorSum);
    }  

    public List<Tuple<int, int, int, int>> GiveMatrix4(int vectorSum)
    {
        List<Tuple<int, int, int, int>> set1 = new List<Tuple<int, int, int, int>>();

        for (int i = 0; i <= vectorSum; i++)
        {
            for (int j = 0; j <= vectorSum; j++)
            {
                for (int k = 0; k <= vectorSum; k++)
                {
                    for (int l = 0; l <= vectorSum; l++)
                    {
                        Tuple<int, int, int, int> vector = new Tuple<int, int, int, int>(i, j, k, l);

                        if (AddValuesFromVector4(vector) == vectorSum)
                        {
                            set1.Add(vector);
                            continue;
                        }
                    }
                }
            }
        }

        return set1;
    }

    public int AddValuesFromVector4(Tuple<int,int,int,int> vector)
    {
        int sum = 0;

        sum = vector.Item1 + vector.Item2 + vector.Item3 + vector.Item4;

        return sum;
    }


    public List<Tuple<int, int, int, int>> Matrix4Set
    {
        get { return set; }
    }
}

Класс Matrix3 вырезает одно измерение, и у меня есть векторы с 3 координатами:

public class Matrix3
    {
        private Matrix4 matrix4;
        private Dictionary<Tuple<int, int, int, int>, Tuple<int, int, int>> pairs = new Dictionary<Tuple<int, int, int, int>, Tuple<int, int, int>>();
        private int vectorSum;

        public Matrix3()
        {

        }

        public Matrix3(int vectorSum)
        {
            this.vectorSum = vectorSum;
            matrix4 = new Matrix4(vectorSum);
            pairs = CreateMatrix3(matrix4.Matrix4Set);
        }

        public int VectorSum
        {
            get { return vectorSum; }
        }

        public Dictionary<Tuple<int, int, int, int>, Tuple<int, int, int>> CreateMatrix3(List<Tuple<int, int, int, int>> set)
        {
            Tuple<int, int, int> vector;
            Dictionary<Tuple<int, int, int, int>, Tuple<int, int, int>> pair = new Dictionary<Tuple<int, int, int, int>, Tuple<int, int, int>>();

            foreach (var item in set)
            {
                vector = new Tuple<int, int, int>(item.Item1 - item.Item2 - item.Item3 + item.Item4, item.Item1 + item.Item2 - item.Item3 - item.Item4, item.Item1 - item.Item2 + item.Item3 - item.Item4);
                pair.Add(item, vector);
            }

            return pair;
        }

        public int Sum(Tuple<int, int, int> vector)
        {
            int suma = 0;

            suma = (int)(vector.Item1 + vector.Item2 + vector.Item3);

            return suma;
        }

        public Dictionary<Tuple<int, int, int, int>, Tuple<int, int, int>> Pairs
        {
            get { return pairs; }
        }

        public Matrix4 Matrix4
        {
            get { return matrix4; }
        }
    }

После этого я хочу создать точки/сферы из своего словаря, который я храню в классе Matrix3:

gl.Begin(OpenGL.GL_POINTS);

        gl.PointSize(10.0f);
        foreach (var item in matrix3.Pairs.Values)
        {               
            gl.Vertex((float)item.Item1, (float)item.Item2, (float)item.Item3);
        }

К сожалению, это не работает, я ничего не вижу на экране. Любые предложения будут очень признательны. После создания каждой точки/сферы мне нужно повернуть их и присвоить каждому отдельный цвет на основе мер, которые я буду вычислять в других классах (но это следующий шаг, прежде всего я хочу отобразить эти точки/сферы и повернуть их) .

Я совершенно новичок в OpenGL, поэтому я ищу любые образцы.

Ссылка на весь проект и просмотр того, что я хочу получить: https://drive.google.com/file/d/1IDwl46rdRa9IYxq7w8ZkF4LCeAsUH0mU/view?usp=sharing


person blackRose    schedule 26.09.2018    source источник
comment
этот код не связан с рендерингом, и теперь есть способ узнать, что происходит, без какого-либо отладочного вывода.   -  person Swift - Friday Pie    schedule 27.09.2018


Ответы (2)


Мой совет — создать способ (лучше, если он будет каким-то обобщенным) для дампа каких-то сигнатурных данных о ваших объектах, сцене, мешах. Дамп ограничивающих рамок 3d объектов, параметров проекции, видовых экранов и т.д.

Отсутствие изображения на экране означает, что некоторые из этих вещей не совпадают, в том числе порядок осей в системе координат может не соответствовать порядку вершин в каждом треугольнике\четырехугольнике\многоугольнике созданной сетки, или функция проверки глубины неверна. Если включено отсечение лиц, то лица, которые должны быть обращены в сторону от места проецирования, будут невидимы. Если включен тест глубины, но проекция направлена ​​не в ту сторону, ничего не будет видно. Очевидно, что если объект проецируется за пределы текущего окна просмотра, он не будет виден.

person Swift - Friday Pie    schedule 27.09.2018
comment
Есть ли у вас какие-либо образцы или статьи, которые могут быть полезны? Я обновил свой пост со ссылкой на проект. Я понял, что вы имеете в виду в целом, но из-за того, что я новичок в OpenGl, я не знаю, с чего начать - какие функции мне следует использовать. - person blackRose; 27.09.2018
comment
@blackRose Основным центром всего, что связано с OpenGl, является opengl.org. Sharpgl, вы найдете несколько примеров. Обратите внимание: если вы хотите иметь дело с 3D-графикой, независимо от того, какой API вы используете, вы должны понимать линейную алгебру. Точное использование функций зависит от того, какой режим профиля и какую платформу вы используете. В большинстве старых примеров используется фиксированный конвейер функций, где у вас есть glRotate, glTranslate, glScale и тому подобное. В современном API от них отказались ради возможности программиста иметь низкоуровневый контроль. - person Swift - Friday Pie; 27.09.2018

В любой программе openGL вам необходимо указать метод проекции, например, используя glOrtho() или glFrustrum(). Затем вы должны убедиться, что ваши координаты для отображения находятся в пределах определенных 3D-«полей».

glOrtho() имеет эту сигнатуру glOrtho(left, right, bottom, top, near, far), где слева, справа — максимальные пределы координат x, снизу, сверху — максимальные размеры координат y, а close, far — максимальные размеры координат z. +y вверх, и мы смотрим с +z на -z.

Если вы этого не сделаете, то openGL предположит, что вы имели в виду glOrtho(-1,1,-1,1,-1,1), что означает, что все координаты должны вписываться в куб 1x1x1 с центром в начале координат.

Наиболее вероятной причиной отсутствия отображения является то, что ваши координаты находятся за пределами этого диапазона.

Я предлагаю лучший способ начать сначала сделать тривиальный пример. Например, используйте glOrtho(-1,1,-1,1,-1,1) и нарисуйте несколько 3D-линий с введенными вручную координатами. Как только это сработает, вы можете поэкспериментировать с другими проекциями, а остальное должно быть легко.

Если вы выполняете поиск в Google, есть несколько хороших руководств по системам координат и проекциям openGL, которые необходимо понять, прежде чем начать. Дайте мне знать, если вам нужна дополнительная помощь.

person bcperth    schedule 27.09.2018
comment
в системах GL ES glOrtho не будет работать. Технически все фиксированные функции считаются устаревшими. - person Swift - Friday Pie; 27.09.2018
comment
ОК ты не упомянул была встроенная система (а может я не заметил!). Однако я согласен с Swift - Friday Pie, и я рекомендую вернуться на шаг назад и заставить работать действительно простой ручной набор координат (куб или треугольник), тогда его будет легко учесть в вашей более сложной системе для генерации и хранения координат. . - person bcperth; 27.09.2018
comment
@ bcperth О, извините, я добавил это для уточнения. OP использует SharpGL, современный порт для C#. По своей природе это что-то похожее на ES или, по крайней мере, ориентированное на современные системы и мобильные\встроенные системы. Я не писал на C# ничего, что использовало бы OpenGL, только две мои мысли. - person Swift - Friday Pie; 27.09.2018