Переместите треугольник влево и вправо.

Вопрос или проблема

Это должно быть простым вводным заданием для OpenGL, я завершил 3 из 5 треугольников, осталось только выполнить трансляцию и вращение. Все находится в конструкции switch case, и мы не должны изменять ничего вне ее. Исходный код задания ниже:

            glUseProgram(shaderUniformColor);
            glUniformMatrix4fv(u_world, 1, GL_FALSE, ToFloat16(world).v);
            glUniform3f(u_color, 0.0f, 1.0f, 1.0f);
            glUniform1f(u_intensity, 1.0f);
            glDrawArrays(GL_TRIANGLES, 0, 3);
            break;

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

            glUseProgram(shaderUniformColor);
            static float Scale = 0.0f;
            static float Delta = 0.005f;

            Scale += Delta;
            if ((Scale > 1.0f) || (Scale < -1.0f))
            {
                Delta *= -1.0f;
            }

            world = Matrix(1.0f);
            world = translate(world, vec3(Scale, 0, 0, 0.0f));

            glUniformMatrix4fv(u_world, 1, GL_FALSE, &world[0][0]);
            glUniform3f(u_color, 1.0f, 0.0f, 1.0f);
            glUniform1f(u_intensity, 1.0f);
            glDrawArrays(GL_TRIANGLES, 0, 3);
            break;
  • Нет экземпляра конструктора Matrix::Matrix, соответствующего списку аргументов.
  • translate и vec3 не определены.
  • Нет операнда [], соответствующего этим операндам.

Исходный код лабораторной работы:

    static float Scale = 0.0f;
    static float Delta = 0.005f;

    Scale += Delta;
    if ((Scale > 1.0f) || (Scale < -1.0f))
    {
        Delta *= -1.0f;
    }

    glm::mat4 Model;
    Model = glm::mat4(1.0f);
    Model = glm::translate(Model, glm::vec3(Scale, 0, 0.0f));
    glUniformMatrix4fv(modelID, 1, GL_FALSE, &Model[0][0]);

Ответ или решение

Чтобы перевести треугольник влево и вправо в вашей реализации OpenGL, вам необходимо внести несколько изменений в исходный код, учитывая структуру вашей программы. Судя по предоставленным фрагментам кода, у вас есть некоторые неясности относительно используемых функций и библиотек.

Во-первых, необходимо убедиться, что вы используете правильные типы данных и функции для трансформации. В оригинальном лабораторном коде используются функции из библиотеки GLM (OpenGL Mathematics), которая широко применяется для математических операций в OpenGL. Исходя из предоставленной информации, давайте исправим ваш код:

Исправленный Код

glUseProgram(shaderUniformColor);
static float Scale = 0.0f;
static float Delta = 0.005f;

// Обновление значения Scale
Scale += Delta;
if ((Scale > 1.0f) || (Scale < -1.0f))
{
    Delta *= -1.0f;
}

// Инициализация матрицы трансформации 
glm::mat4 world = glm::mat4(1.0f); // Создание единичной матрицы
world = glm::translate(world, glm::vec3(Scale, 0.0f, 0.0f)); // Перемещение по оси X

// Передача матрицы в шейдер
glUniformMatrix4fv(u_world, 1, GL_FALSE, &world[0][0]);
glUniform3f(u_color, 0.0f, 1.0f, 1.0f);
glUniform1f(u_intensity, 1.0f);
glDrawArrays(GL_TRIANGLES, 0, 3);
break;

Разбор изменений

  1. Использование glm::mat4 и функций GLM: Я заменил вашу матрицу и функции на GLM, так как это стандартный подход в OpenGL для работы с матрицами. Убедитесь, что в вашем проекте подключена библиотека GLM.
  2. Создание единичной матрицы: glm::mat4 world = glm::mat4(1.0f); создает единичную матрицу, что необходимо перед изменением для вашего объекта.
  3. Функция glm::translate: Эта функция используется для создания матрицы трансляции. Мы перемещаем треугольник по оси X на значение Scale, которое постоянно обновляется.
  4. Параметры передачи матриц: &world[0][0] правильно передает данные матрицы в шейдер.

Убедитесь в следующем

  • Убедитесь, что у вас подключены необходимые заголовочные файлы GLM, такие как:
    #include <glm/glm.hpp>
    #include <glm/gtc/matrix_transform.hpp>
  • Проверьте, что ваш проект правильно настроен для работы с OpenGL и установленными библиотеками, такими как GLM.

С помощью вышеописанных изменений ваш треугольник должен корректно перемещаться влево и вправо. Если возникнут дополнительные ошибки или вопросы, не стесняйтесь задавать их!

Оцените материал
Добавить комментарий

Капча загружается...