У меня есть очень простая форма пирамиды, состоящая из 6 треугольников, определенных следующим образом:
unsigned int indices[] = {
0, 1, 2, // front triange
0, 3, 4, // back triangle
0, 3, 1, // left side triangle
0, 2, 4, // right side triangle
1, 3, 4, // square base triangle 1
4, 2, 1 // square base triangle 2
};
float pyramid[] = {
0.0f, 1.0f, 0.0f, // top of the pyramid
// base vertices (a square)
-1.0f, -1.0f, 1.0f, // left front
1.0f, -1.0f, 1.0f, // right front
-1.0f, -1.0f, -1.0f, // left back
1.0f, -1.0f, -1.0f, // right back
};
Я пытаюсь повернуть его вокруг оси Y, но когда я это делаю, он не вращается непрерывно, он вращается немного влево, а затем немного вправо, влево-вправо, влево-вправо и так далее, но никогда не совершает полного поворота на 360 градусов.
Мой код ротации:
glm::mat4 scale = glm::scale(glm::mat4(1.0f), glm::vec3(0.7f));
glm::mat4 rotate = glm::rotate(glm::mat4(1.0f), angle, glm::vec3(0.0f, 1.0f, 0.0f));
glm::mat4 worldView = rotate * scale;
glUniformMatrix4fv(hWorld, 1, GL_TRUE, glm::value_ptr(worldView));
angle
я увеличиваю его в каждом цикле:
static float angle = 0.0f;
angle += 0.001f;
Я сдаюсь, поэтому надеюсь, что кто-то сможет пролить свет на мою ошибку.
Мой вершинный шейдер:
#version 330
layout (location = 0) in vec3 pos;
uniform mat4 world;
out vec4 color;
void main()
{
gl_Position = world * vec4(0.5 * pos, 1.0f);
color = 8 * vec4(clamp(pos, 0.0f, 0.1f), 1.0f);
}
Зачем вы переводите матрицу в форму команды?
Используя glm, вам не нужно их транспонировать, так как по умолчанию они уже построены по основному столбцу.
Обновил вопрос с моим вершинным шейдером. Что касается униформы, я просто использую пример с: ogldev.atspace.co.uk/www/tutorial11/tutorial11.html
Я поменял его на FALSE, но все равно не работает должным образом.
Разрешается ли здесь линковать (прикреплять) полный исходник?
Насколько я понял в вашем коде, матрица
world
является матрицей модели, но где матрицы представления и проекции? Вы описываете проблему как неправильный визуальный вывод, который может быть вызван другими причинами, а не самим вращением. Кроме того, вы можете отладить, работает ли вращение внутри хоста, распечатав любую вершину вашей пирамиды, умноженную на матрицу модели, и посмотреть, является ли результат ожидаемым.Ожидаемый вид — это конус, плавающий и вращающийся в трехмерном пространстве. Сейчас попробовал портировать как мог, а у меня все прыгает. Я также задал свой вопрос здесь: opengl.org/discussion_boards/showthread.php/…
Я не знал, что порядок вершин имеет значение!! :/
Я испортил их.