Вопрос или проблема
Это должно быть простым вводным заданием для 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;
Разбор изменений
- Использование
glm::mat4
и функций GLM: Я заменил вашу матрицу и функции на GLM, так как это стандартный подход в OpenGL для работы с матрицами. Убедитесь, что в вашем проекте подключена библиотека GLM. - Создание единичной матрицы:
glm::mat4 world = glm::mat4(1.0f);
создает единичную матрицу, что необходимо перед изменением для вашего объекта. - Функция
glm::translate
: Эта функция используется для создания матрицы трансляции. Мы перемещаем треугольник по оси X на значениеScale
, которое постоянно обновляется. - Параметры передачи матриц:
&world[0][0]
правильно передает данные матрицы в шейдер.
Убедитесь в следующем
- Убедитесь, что у вас подключены необходимые заголовочные файлы GLM, такие как:
#include <glm/glm.hpp> #include <glm/gtc/matrix_transform.hpp>
- Проверьте, что ваш проект правильно настроен для работы с OpenGL и установленными библиотеками, такими как GLM.
С помощью вышеописанных изменений ваш треугольник должен корректно перемещаться влево и вправо. Если возникнут дополнительные ошибки или вопросы, не стесняйтесь задавать их!