Задать вопрос
@Obsessed111

Помощь с OpenGL?

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

Код:

#define GL_SILENCE_DEPRECATION // apple
#include <GLUT/glut.h>
#include <stdlib.h>

float T = 100; // Температура дна кастрюли
float T0 = 20; // Температура воды

int bubbleX[10]; // Массив для хранения координат X пузырьков
int bubbleY[10]; // Массив для хранения координат Y пузырьков
float bubbleSize[50]; // Массив для хранения размеров пузырьков
int numBubbles = 0; // Количество пузырьков

void display() {
    glClear(GL_COLOR_BUFFER_BIT);
    
    //  кастрюля
    glColor3f(0.5, 0.5, 0.5); //серый цвет
    glBegin(GL_POLYGON);
    glVertex2f(50, 50);
    glVertex2f(250, 50);
    glVertex2f(250, 250);
    glVertex2f(50, 250);
    glEnd();

    
    //  ручки
    glColor3f(0.5, 0.5, 0.5); //серый цвет
    glBegin(GL_POLYGON);
    glVertex2f(40, 150);
    glVertex2f(50, 150);
    glVertex2f(50, 170);
    glVertex2f(40, 170);
    glEnd();
        
    glColor3f(0.5, 0.5, 0.5);//серый цвет
    glBegin(GL_POLYGON);
    glVertex2f(250, 150);
    glVertex2f(260, 150);
    glVertex2f(260, 170);
    glVertex2f(250, 170);
    glEnd();
        
        // Вода
    glColor3f(0.5, 0.5, 1.0); // Синий цвет
    glBegin(GL_POLYGON);
    glVertex2f(60, 60);
    glVertex2f(240, 60);
    glVertex2f(240, 240);
    glVertex2f(60, 240);
    glEnd();

    
    for (int i = 0; i < numBubbles; i++) {
        if (bubbleY[i] < 230) { // вверх кастрюли
            bubbleY[i]+=10; // Пузырек двигается вверх
            bubbleSize[i] += 0.50; // увеличение пузырька
            glColor3f(1.0, 1.0, 1.0); // Белый цвет
            glBegin(GL_POLYGON);
            float x = bubbleX[i];
            float y = bubbleY[i];
            float size = bubbleSize[i];
            glVertex2f(x, y);
            glVertex2f(x + size, y);
            glVertex2f(x + size, y + size);
            glVertex2f(x, y + size);
            glEnd();
        } else {
            // удаление пузырька из массива при достижении верха
            for (int j = i; j < numBubbles - 1; j++) {
                bubbleX[j] = bubbleX[j + 1];
                bubbleY[j] = bubbleY[j + 1];
                bubbleSize[j] = bubbleSize[j + 1];
            }
            numBubbles--;
        }
    }

    
    glFlush();
}

void addBubble() {
    if (numBubbles < 15) { // Добавляем новый пузырек только если их количество меньше 15
        bubbleX[numBubbles] = rand() % 80 + 110; // Случайная координата X внутри кастрюли
        bubbleY[numBubbles] = 100; // Начальная координата Y - дно кастрюли
        bubbleSize[numBubbles] = 1.0; // Начальный размер пузырька
        numBubbles++;
    }
}

void timer(int value) {
    addBubble(); // Добавляем новый пузырек при каждом тике таймера
    glutPostRedisplay(); // Перерисовываем сцену
    glutTimerFunc(500, timer, 0); // Устанавливаем таймер на следующий тик через 500 миллисекунд
}

int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutCreateWindow("Кастрюля");
    glutInitWindowSize(400, 400);
    glutDisplayFunc(display);
    glOrtho(0, 400, 0, 400, -1, 1); // ортографическая проекция
    glutTimerFunc(500, timer, 0); // Устанавливаем таймер на первый тик через 500 миллисекунд
    glutMainLoop();
    
    return 0;
}
  • Вопрос задан
  • 62 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
bubbleY[numBubbles] = 100; // Начальная координата Y - дно кастрюли
Ну, вроде, очевидно, что проблема здесь. Вы уверены, что 100 — это реально дно кастрюли? По другим числам, используемым при отрисовке кастрюли и воды, не похоже на это.

int bubbleX[10]; // Массив для хранения координат X пузырьков
int bubbleY[10]; // Массив для хранения координат Y пузырьков
...
if (numBubbles < 15)
И массивы неправильного размера создаются.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы