Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 13.04.2020
Сообщений: 10

OpenGL C++ флаг

13.04.2020, 20:19. Показов 3552. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, написала код, но преподаватель говорит, что идет наложение слоев и зубья. Помогите, пожалуйста, исправить. Мб я неправильно сделала построение или в чем ошибка?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include<glut.h>
#include <cmath>
 
const double PI = 3.14159265358979323846;
 
//пересчитывает при изменении размеров окна
void ChangeSize(int w, int h) {
    if (h == 0)
        h = 1;
    float ratio = w * 1.0 / h;
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glViewport(0, 0, w, h);
    gluPerspective(45, ratio, 1, 1000);
    glMatrixMode(GL_MODELVIEW);
}
 
double p = 0;
 
void renderScene(void) {
 
    p += 0.01;
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
 
    gluLookAt(-5, 0, 45, 10, 0, 0, 0, 1, 0);
 
    double z = 0;
 
    int radius = 5;
    for (double x = 0; x <= 15; x += 0.001) {
        double y1 = sin(x + p) * 0.5;
        double y2 = 10 + sin(x + p) * 0.5;
        glBegin(GL_TRIANGLES);
        glColor3f(0.0, 0.5, 0.0);
        glVertex3d(x, y1, z);
        glColor3f(0.0, 0.5, 0.0);
        glVertex3d(x, y2, z);
        glColor3f(0.0, 0.5, 0.0);
        glVertex3d(x + 0.01, y2, z);
        glEnd();
 
        glBegin(GL_TRIANGLES);
        glColor3f(0.0, 0.5, 0.0);
        glVertex3d(x, y1, z);
        glColor3f(0.0, 0.5, 0.0);
        glVertex3d(x + 0.01, y1, z);
        glColor3f(0.0, 0.5, 0.0);
        glVertex3d(x + 0.01, y2, z);
        glEnd();
    }
 
    glutSwapBuffers();
    // по новой отрисовываем
    glutPostRedisplay();
}
 
int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("OpenGL");
    glutDisplayFunc(renderScene);
    glutReshapeFunc(ChangeSize);
    glEnable(GL_DEPTH_TEST); \
        // задаем серый фон
        glClearColor(0.5, 0.5, 0.5, 1.0);
    glutMainLoop();
    return 0;
}
Вложения
Тип файла: txt LAB_4 (3).txt (1.8 Кб, 10 просмотров)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.04.2020, 20:19
Ответы с готовыми решениями:

Создаю игру с научным уколоном на C++/opengl. Как подключить openGL и добиться кроссплатформенности
Я читал про opengl - для его инициализации нужно создавать windows - окно. Для linux видимо инициализация происходить по другому. как мне...

(2 главы перевода книги доступно) OpenGL Programming Guide, Version 4.3, 8th Edition - OpenGL
Продолжая тему с переводом книги https://www.cyberforum.ru/opengl/thread1551398.html Выкладываю для скачивания вторую переведенную главу...

Ошибки при подключение opengl, немного не связанные с opengl
#include &lt;windows.h&gt; #include &quot;stdafx.h&quot; #include &lt;gl/gl.h&gt; #include &lt;gl/glu.h&gt; #include &lt;stdio.h&gt; //#include &quot;TXLib.h&quot; ...

4
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
13.04.2020, 20:24
Зачем файл? Трудно код скопировать?
Цитата Сообщение от rita56 Посмотреть сообщение
Мб я неправильно сделала построение или в чем ошибка?
Построение чего?
И зачем 2 раза рисовать одно и то же?
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
13.04.2020, 22:52
Лучший ответ Сообщение было отмечено rita56 как решение

Решение

Цитата Сообщение от rita56 Посмотреть сообщение
наложение слоев
Обратите внимание на шаг по X в цикле (у вас 0.001) и размеры треугольников по оси X (0.01). Размер треугольника больше, чем смещение. Получается, что на 9/10 уже нарисованного треугольника будет накладываться следующий. Размер треугольника и шаг должны совпадать. Эта ошибка встречается в строках 31, 40, 47, 49. Для наглядности увеличил эти значения в 100 раз и добавил изменение цвета на каждой итерации цикла, слева - ваш вариант, справа - шаг по X и горизонтальные размеры треугольников сделаны равными.

Или, если не увеличивать шаг, но сдвинуть вторую часть треугольников ниже, то получается такая картина:

Слева видно, что при совмещении так же происходит наложение, справа - вторая часть зеркально отражает первую, при совмещении наложения нет.

Так же появился вопрос к y1 и y2. Думаю, нет смысла вычислять y2 для смещенного вверх края фигуры. А вот для смещенной вправо вершины треугольника вполне можно вычислить y2, т.к. значение функции sin() там будет уже другое. Без этого ребра получаются параллельны оси X:
Название: Screenshot_20200414_002244.png
Просмотров: 110

Размер: 9.2 Кб
Если для правой точки заново вычислить значение y, то ребра намного точнее повторяют форму синусоиды даже при большом шаге:
Название: Screenshot_20200414_004042.png
Просмотров: 110

Размер: 8.8 Кб

Немного поправил функцию рендера с учетом описанных выше замечаний:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
void renderScene(void) {
 
    p += 0.01;
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
 
    gluLookAt(-5, 0, 45, 10, 0, 0, 0, 1, 0);
 
    const double z = 0;
    const double STEP_X = 0.1; // Шаг по оси X и горизонтальные размеры треугольников.
    const double HEIGHT = 10; // Высота фигуры (смещение по Y).
 
    int radius = 5;
    for (double x = 0; x <= 15; x += STEP_X) {
        double y1 = sin(x + p) * 0.5; // Значение y для x.
        double y2 = sin(x + p + STEP_X) * 0.5; // Значение y для (x + STEP_X).
 
        glBegin(GL_TRIANGLES);
        glColor3f(0.0, 0.5, 0.0);
        glVertex3d(x, y1, z);
        glColor3f(0.0, 0.5, 0.0);
        glVertex3d(x, y1 + HEIGHT, z);
        glColor3f(0.0, 0.5, 0.0);
        glVertex3d(x + STEP_X, y2 + HEIGHT, z);
        glEnd();
 
        glBegin(GL_TRIANGLES);
        glColor3f(0.5, 0.0, 0.0);
        glVertex3d(x, y1, z);
        glColor3f(0.5, 0.0, 0.0);
        glVertex3d(x + STEP_X, y2, z);
        glColor3f(0.5, 0.0, 0.0);
        glVertex3d(x + STEP_X, y2 + HEIGHT, z);
        glEnd();
    }
 
    glutSwapBuffers();
    // по новой отрисовываем
    glutPostRedisplay();
}
Результат (верхняя и нижняя части разными цветами, чтобы убедиться в отсутствии наложений):

На мой взгляд, неплохо получается даже при значении STEP_X=0.1.
2
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
14.04.2020, 08:28
Что это вообще за жесть? Причем тут треугольники для модели флага на ветру?
Рисуете флаг равномерной сеткой с квадратной ячейкой, в плоскости OXY, больше ячеек больше деталей анимации.
Создаете функцию z=f(x,y) возвращающую высоту Z точки над флагом.
Придумываете значения и количество синусоид\косинусоид играя с амплитудой, частотой и фазой в любом мат пакете. Анимируете изменение угла в формуле и добиваетесь волн похожих на трепыхание от ветра. Добавляете формулу в прогу и по таймеру обновляете Z вершин.

Более продвинутый вариант нужно в проге симуляторе физики ткань и ветер и гравитация сделать нормальную анимацию….и экспортировать в прогу файлом.

Добавлено через 17 минут
Можно взять еще Gerstner waves вместо примитивных голых sin\cos
https://en.wikipedia.org/wiki/Trochoidal_wave
Там есть хитрый сдвиг вершин по поверхности сферы, имитирует волны на воде от ветра.
По идее годно для простой имитации растяжения ткани от колебания на ветру.
0
Just Do It!
 Аватар для XLAT
4189 / 2644 / 654
Регистрация: 23.09.2014
Сообщений: 8,901
Записей в блоге: 3
09.09.2021, 16:09
OpenGL Shading Language:
оставлю здесь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.09.2021, 16:09
Помогаю со студенческими работами здесь

OpenGL - VS2008 Инициализация OpenGL (Glut)
Правильно ли я написал код для выведения 3d изображения на экран? Вот пару недель наверно искал метод - можно ли окно как то создать без...

Сильно отличаются OpenGL ES и OpenGL и как?
Сильно отличаются OpenGL ES и OpenGL и как?

Не загружается текстура в OpenGL (OpenGL + Классы)
Здравствуйте! Пишу движок для игры. Первый прототип я сделал процедурно. Все работает как надо. Сейчас переписываю в классах....

OpenGL + GlTools по книге OpenGL Суперкнига
В главе 4 есть пример с отрисовкой 3хмерного вращающегося тора. Вот код: void RenderScene(void) { GLTMatrix transformationMatrix; ...

OpenGL и OpenGL ES в чём разница функционала?
Здравствуйте! Чем отличается функционал OpenGL от OpenGL ES? Можно делать игры на pc используя OpenGL ES?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru