Вершина не читается в opengl

У меня вопрос, что делать, когда какая-то часть вершины не читается opengl? Я имею в виду, что когда я запускаю код, он не следует моей координатной сетке, которую я делал на миллиметровой бумаге, и даже после того, как я удалил эту вершину, он по-прежнему показывал тот же результат. Я хотел сделать кленовый лист.

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

Допустим, я установил для вершины A(-0,44, 0,16) B(-0,46, 0,16) C(-0,52, 0,18) D(-0,54, 0,24), вместо перехода от A к B к C он пропустил B и С и пошел на Д.

#include <windows.h>
#include <gl/glut.h>

void display() {

    glClearColor(0.3, 0.1, 0.1, 0.2);
    glClear(GL_COLOR_BUFFER_BIT);

    //glTranslatef(0.5, 0, 0);
    //glScalef(0.5, 0.5, 0);
    //glRotatef(0, 0, 0, 0);

    //Unifolié also known as Maple Leaf
    glBegin(GL_POLYGON);
    glColor3f(1, 0, 0);
    glVertex2f(0.00, 0.00);
    glVertex2f(0.00, 0.90);
    glVertex2f(-0.08, 0.70);
    glVertex2f(-0.12, 0.66);
    glVertex2f(-0.16, 0.66);
    glVertex2f(-0.20, 0.68);
    glVertex2f(-0.24, 0.74);
    glVertex2f(-0.22, 0.64);
    glVertex2f(-0.22, 0.62);
    glVertex2f(-0.24, 0.56);
    glVertex2f(-0.26, 0.54);
    glVertex2f(-0.30, 0.54);
    glVertex2f(-0.34, 0.56);
    glVertex2f(-0.36, 0.60);
    glVertex2f(-0.36, 0.56);
    glVertex2f(-0.38, 0.54);
    glVertex2f(-0.40, 0.54);
    glVertex2f(-0.42, 0.54);
    glVertex2f(-0.56, 0.60);
    glVertex2f(-0.52, 0.54);
    glVertex2f(-0.50, 0.50);
    glVertex2f(-0.48, 0.44);
    glVertex2f(-0.48, 0.42);
    glVertex2f(-0.50, 0.38);
    glVertex2f(-0.54, 0.34);
    glVertex2f(-0.48, 0.32);
    glVertex2f(-0.44, 0.28);
    glVertex2f(-0.42, 0.22);
    glVertex2f(-0.42, 0.20);
    glVertex2f(-0.44, 0.16);
    glVertex2f(-0.46, 0.16); //this 1st
    glVertex2f(-0.52, 0.18);
    glVertex2f(-0.54, 0.24);
    glVertex2f(-0.54, 0.20);
    glVertex2f(-0.56, 0.16);
    glVertex2f(-0.60, 0.14);
    glVertex2f(-0.62, 0.14);
    glVertex2f(-0.70, 0.16);
    glVertex2f(-0.76, 0.20);
    glVertex2f(-0.78, 0.24);
    glVertex2f(-0.76, 0.18);
    glVertex2f(-0.74, 0.14);
    glVertex2f(-0.70, 0.08);
    glVertex2f(-0.68, 0.06);
    glVertex2f(-0.66, 0.02);
    glVertex2f(-0.66, 0.00);
    glVertex2f(-0.68, -0.04);
    glVertex2f(-0.64, -0.02);
    glVertex2f(-0.62, -0.02);
    glVertex2f(-0.56, -0.04);
    glVertex2f(-0.52, -0.08);
    glVertex2f(-0.48, -0.16);
    glVertex2f(-0.48, -0.20);
    glVertex2f(-0.50, -0.26);
    glVertex2f(-0.52, -0.30);
    glVertex2f(-0.58, -0.34);
    glVertex2f(-0.42, -0.32);
    glVertex2f(-0.30, -0.28);
    glVertex2f(-0.18, -0.22);
    glVertex2f(-0.10, -0.20);
    glVertex2f(0.00, -0.22);

    glVertex2f(0.10, -0.20);
    glVertex2f(0.18, -0.22);
    glVertex2f(0.30, -0.28);
    glVertex2f(0.42, -0.32);
    glVertex2f(0.58, -0.34);
    glVertex2f(0.52, -0.30);
    glVertex2f(0.50, -0.26);
    glVertex2f(0.48, -0.20);
    glVertex2f(0.48, -0.16);
    glVertex2f(0.52, -0.08);
    glVertex2f(0.56, -0.04);
    glVertex2f(0.62, -0.02);
    glVertex2f(0.64, -0.02);
    glVertex2f(0.68, -0.04);
    glVertex2f(0.66, 0.00);
    glVertex2f(0.66, 0.02);
    glVertex2f(0.68, 0.06);
    glVertex2f(0.70, 0.08);
    glVertex2f(0.74, 0.14);
    glVertex2f(0.76, 0.18);
    glVertex2f(0.78, 0.24);
    glVertex2f(0.76, 0.20);
    glVertex2f(0.70, 0.16);
    glVertex2f(0.62, 0.14);
    glVertex2f(0.60, 0.14);
    glVertex2f(0.56, 0.16);
    glVertex2f(0.54, 0.20);
    glVertex2f(0.54, 0.24);
    glVertex2f(0.52, 0.18);
    glVertex2f(0.46, 0.16);
    glVertex2f(0.44, 0.16);
    glVertex2f(0.42, 0.20);
    glVertex2f(0.42, 0.22);
    glVertex2f(0.44, 0.28);
    glVertex2f(0.48, 0.32);
    glVertex2f(0.54, 0.34);
    glVertex2f(0.50, 0.38);
    glVertex2f(0.48, 0.42);
    glVertex2f(0.48, 0.44);
    glVertex2f(0.50, 0.50);
    glVertex2f(0.52, 0.54);
    glVertex2f(0.56, 0.60);
    glVertex2f(0.42, 0.54);
    glVertex2f(0.40, 0.54);
    glVertex2f(0.38, 0.54);
    glVertex2f(0.36, 0.56);
    glVertex2f(0.36, 0.60);
    glVertex2f(0.34, 0.56);
    glVertex2f(0.30, 0.54);
    glVertex2f(0.26, 0.54);
    glVertex2f(0.24, 0.56);
    glVertex2f(0.22, 0.62);
    glVertex2f(0.22, 0.64);
    glVertex2f(0.24, 0.74);
    glVertex2f(0.20, 0.68);
    glVertex2f(0.16, 0.66);
    glVertex2f(0.12, 0.66);
    glVertex2f(0.08, 0.70);
    glVertex2f(0.00, 0.90);
    glEnd();


    glFlush();

}


int main(int argc, char* argv[]) {
    glutInit(&argc, argv);
    glutInitWindowSize(1000, 1000);
    glutInitWindowPosition(10, 10);
    glutCreateWindow("Maple Leaf");
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}

Не уверен, в чем проблема, но ваш лист имеет симметрию и имеет левые вершины в порядке против часовой стрелки, а правые вершины - в порядке по часовой стрелке. Все это должно быть единым многоугольником в одном порядке намотки. Поэтому вам может понадобиться изменить порядок вершин, составляющих правую сторону вашего листа. Если вы представляете себе рисование круга с вершинами в виде чисел на аналоговых часах, это как если бы вы рисовали круг, посещая вершины в следующем порядке: (12, 11, 10, 9, 8, 7, 6, 12, 1, 2, 3, 4, 5, 6 } Это создает ошибку «галстук-бабочка».

Wyck 12.05.2022 06:58

о да, true2 я должен был просто следовать от последней вершины с левой стороны и продолжать до верхней вершины, верно?

AMIRUL ASYRAAF SAIFUL AIZAM 12.05.2022 07:04

Да, я думаю, вы скопировали-вставили левые вершины и вручную инвертировали координаты x. Ваш способ сэкономить время был слишком коротким. Вам все еще нужно создать согласованную форму с постоянным порядком намотки и непрерывностью между половинами. (Обратный порядок вершин с правой стороны поможет, но будьте осторожны с вертикальной линией от (0,0, 0,0) до (0,0, 0,9) — в этом нет необходимости, если лист представляет собой замкнутую форму.)

Wyck 12.05.2022 07:09

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

AMIRUL ASYRAAF SAIFUL AIZAM 12.05.2022 07:10

Что такое "логическая ошибка", что вы подразумеваете под этим? "этот 1-й" ничего не значит для меня. Он не описывает, что вы ожидали по сравнению с тем, что произошло на самом деле, или если вы получаете какое-то сообщение об ошибке. Пожалуйста, убедитесь, что все детали указаны в самом вопросе, чтобы кто-то мог дать соответствующий объективно правильный ответ.

Wyck 12.05.2022 07:10

я хочу сделать какую-то кривую, используя прямую линию, уменьшив значение y для этой конкретной вершины, но когда я запускаю код, вместо того, чтобы сделать линию с координатой, которую я уже установил, она пропустила эту вершину, которую я установил, и перешла к другую вершину и создайте прямую линию. Мне очень жаль, что мой английский не так хорош, мне трудно объяснить ситуацию.

AMIRUL ASYRAAF SAIFUL AIZAM 12.05.2022 07:17

.Допустим, я установил для вершины A(-0,44, 0,16) B(-0,46, 0,16) C(-0,52, 0,18) D(-0,54, 0,24), вместо перехода от A к B он пропустил B и C и пошел к Д.

AMIRUL ASYRAAF SAIFUL AIZAM 12.05.2022 07:19

А, теперь я понял. Вы не разбиваете свою форму на треугольники и ваша форма не выпуклая, поэтому тесселяция по умолчанию сделает что-то неожиданное (для вас) в вогнутых частях.

Wyck 12.05.2022 07:24

Можно ли сделать мозаику кленового листа? Я пытаюсь сделать кленовый лист, но поскольку возникает эта ошибка, я точно не знаю, что делать. Я мог бы просто создать еще один лист, который намного проще, чем кленовый. В любом случае, большое спасибо за объяснение. Возможно, мне придется провести больше исследований о тесселяции и вогнутости/выпуклости. Большое спасибо.

AMIRUL ASYRAAF SAIFUL AIZAM 12.05.2022 07:40

Возможно, вы могли бы использовать GL_TRIANGLE_FAN вместо GL_POLYGON и ввести центральную точку в середине вашего листа. В этом случае даже кленовый лист может быть отрисован правильно.

Scheff's Cat 12.05.2022 07:49

@Scheff'sCat Я сам нарисовал данные вручную, и нет центральной точки, из которой можно построить веер, поэтому необходима тесселяция.

Wyck 12.05.2022 07:56

@Wyck и вводить - центральная точка. ;-)

Scheff's Cat 12.05.2022 07:57

@Scheff'sCat Вы смотрели данные? Не каждая фигура имеет является такой возможной точкой. Дело не только в недостающей вершине. Топология фигуры может заключаться в том, что такая точка невозможна (представьте себе пончик или даже букву С). И действительно, этот так называемый Унифоли имеет такую ​​форму из-за изогнутых кончиков листьев.

Wyck 12.05.2022 08:02

@Wyck Должен признаться, я не смотрел на данные. Увидев форму в вашем ответе сейчас, я должен признать, что GL_TRIANGLE_FAN не вылечил бы ее. Тесселяция вручную, вероятно, не так уж и сложна. Сделать это по алгоритму кажется более сложной задачей. (Кажется, я когда-то составлял такой алгоритм...)

Scheff's Cat 12.05.2022 10:04

@Scheff'sCat, правда. Хотя я бы не стал писать алгоритм с нуля. Я предложил использовать библиотеку вырез в ушах или любой подобный аналог. TBH Я бы нарисовал контур в Blender и экспортировал файл сетки, позволив ему сделать тесселяцию за меня.

Wyck 12.05.2022 15:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
15
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это ваш полигон:

Ваша форма не выпуклая и GL_POLYGON обуславливает:

GL_POLYGON

Draws a single, convex polygon. Vertices 1 through N define this polygon.

Чтобы растрировать этот контур, вручную разбейте фигуру на треугольники или другие примитивные компоненты, такие как ТРЕУГОЛЬНИК или ТРЕУГОЛЬНИК. Это называется мозаика. Хотя GL_POLYGON выглядит заманчиво, он предназначен только для выпуклых форм.

primitives

(оригинальный источник изображения)

Для произвольных многоугольников вам нужно самостоятельно создать мозаику контура. Вы можете найти библиотеку для этого, например: https://github.com/mapbox/earcut.hpp Хорошая новость заключается в том, что вам нужно сделать это только один раз, и вы можете сделать это в автономном режиме (не во время выполнения). Как только ваш полигон будет тесселяции, вы сможете нарисовать его с помощью GL_TRIANGLES.

хорошо, сейчас попробую сделать. Большое спасибо за решение!

AMIRUL ASYRAAF SAIFUL AIZAM 12.05.2022 08:11

Другие вопросы по теме