У меня вопрос, что делать, когда какая-то часть вершины не читается 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;
}
о да, true2 я должен был просто следовать от последней вершины с левой стороны и продолжать до верхней вершины, верно?
Да, я думаю, вы скопировали-вставили левые вершины и вручную инвертировали координаты x. Ваш способ сэкономить время был слишком коротким. Вам все еще нужно создать согласованную форму с постоянным порядком намотки и непрерывностью между половинами. (Обратный порядок вершин с правой стороны поможет, но будьте осторожны с вертикальной линией от (0,0, 0,0) до (0,0, 0,9) — в этом нет необходимости, если лист представляет собой замкнутую форму.)
я уже пробовал наоборот, заканчивая полный полигон, а не создавая 2 полигона, которые симметричны друг другу, но логическая ошибка все еще возникает
Что такое "логическая ошибка", что вы подразумеваете под этим? "этот 1-й" ничего не значит для меня. Он не описывает, что вы ожидали по сравнению с тем, что произошло на самом деле, или если вы получаете какое-то сообщение об ошибке. Пожалуйста, убедитесь, что все детали указаны в самом вопросе, чтобы кто-то мог дать соответствующий объективно правильный ответ.
я хочу сделать какую-то кривую, используя прямую линию, уменьшив значение y для этой конкретной вершины, но когда я запускаю код, вместо того, чтобы сделать линию с координатой, которую я уже установил, она пропустила эту вершину, которую я установил, и перешла к другую вершину и создайте прямую линию. Мне очень жаль, что мой английский не так хорош, мне трудно объяснить ситуацию.
.Допустим, я установил для вершины A(-0,44, 0,16) B(-0,46, 0,16) C(-0,52, 0,18) D(-0,54, 0,24), вместо перехода от A к B он пропустил B и C и пошел к Д.
А, теперь я понял. Вы не разбиваете свою форму на треугольники и ваша форма не выпуклая, поэтому тесселяция по умолчанию сделает что-то неожиданное (для вас) в вогнутых частях.
Можно ли сделать мозаику кленового листа? Я пытаюсь сделать кленовый лист, но поскольку возникает эта ошибка, я точно не знаю, что делать. Я мог бы просто создать еще один лист, который намного проще, чем кленовый. В любом случае, большое спасибо за объяснение. Возможно, мне придется провести больше исследований о тесселяции и вогнутости/выпуклости. Большое спасибо.
Возможно, вы могли бы использовать GL_TRIANGLE_FAN вместо GL_POLYGON и ввести центральную точку в середине вашего листа. В этом случае даже кленовый лист может быть отрисован правильно.
@Scheff'sCat Я сам нарисовал данные вручную, и нет центральной точки, из которой можно построить веер, поэтому необходима тесселяция.
@Wyck и вводить - центральная точка. ;-)
@Scheff'sCat Вы смотрели данные? Не каждая фигура имеет является такой возможной точкой. Дело не только в недостающей вершине. Топология фигуры может заключаться в том, что такая точка невозможна (представьте себе пончик или даже букву С). И действительно, этот так называемый Унифоли имеет такую форму из-за изогнутых кончиков листьев.
@Wyck Должен признаться, я не смотрел на данные. Увидев форму в вашем ответе сейчас, я должен признать, что GL_TRIANGLE_FAN не вылечил бы ее. Тесселяция вручную, вероятно, не так уж и сложна. Сделать это по алгоритму кажется более сложной задачей. (Кажется, я когда-то составлял такой алгоритм...)





Это ваш полигон:
Ваша форма не выпуклая и GL_POLYGON обуславливает:
GL_POLYGONDraws a single, convex polygon. Vertices 1 through N define this polygon.
Чтобы растрировать этот контур, вручную разбейте фигуру на треугольники или другие примитивные компоненты, такие как ТРЕУГОЛЬНИК или ТРЕУГОЛЬНИК. Это называется мозаика. Хотя GL_POLYGON выглядит заманчиво, он предназначен только для выпуклых форм.
(оригинальный источник изображения)
Для произвольных многоугольников вам нужно самостоятельно создать мозаику контура. Вы можете найти библиотеку для этого, например: https://github.com/mapbox/earcut.hpp Хорошая новость заключается в том, что вам нужно сделать это только один раз, и вы можете сделать это в автономном режиме (не во время выполнения). Как только ваш полигон будет тесселяции, вы сможете нарисовать его с помощью GL_TRIANGLES.
хорошо, сейчас попробую сделать. Большое спасибо за решение!
Не уверен, в чем проблема, но ваш лист имеет симметрию и имеет левые вершины в порядке против часовой стрелки, а правые вершины - в порядке по часовой стрелке. Все это должно быть единым многоугольником в одном порядке намотки. Поэтому вам может понадобиться изменить порядок вершин, составляющих правую сторону вашего листа. Если вы представляете себе рисование круга с вершинами в виде чисел на аналоговых часах, это как если бы вы рисовали круг, посещая вершины в следующем порядке: (12, 11, 10, 9, 8, 7, 6, 12, 1, 2, 3, 4, 5, 6 } Это создает ошибку «галстук-бабочка».