Вращение OpenGL, вращение в неправильном направлении, что не так?

avatar
user9613405
8 апреля 2018 в 00:34
425
1
-1

У меня есть очень простая форма пирамиды, состоящая из 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);
}
Источник
derhass
8 апреля 2018 в 00:39
0

Зачем вы переводите матрицу в форму команды?

Nadir
8 апреля 2018 в 01:28
1

Используя glm, вам не нужно их транспонировать, так как по умолчанию они уже построены по основному столбцу.

user9613405
8 апреля 2018 в 08:50
0

Обновил вопрос с моим вершинным шейдером. Что касается униформы, я просто использую пример с: ogldev.atspace.co.uk/www/tutorial11/tutorial11.html

user9613405
8 апреля 2018 в 10:14
0

Я поменял его на FALSE, но все равно не работает должным образом.

user9613405
8 апреля 2018 в 10:16
0

Разрешается ли здесь линковать (прикреплять) полный исходник?

Nadir
8 апреля 2018 в 11:33
0

Насколько я понял в вашем коде, матрица world является матрицей модели, но где матрицы представления и проекции? Вы описываете проблему как неправильный визуальный вывод, который может быть вызван другими причинами, а не самим вращением. Кроме того, вы можете отладить, работает ли вращение внутри хоста, распечатав любую вершину вашей пирамиды, умноженную на матрицу модели, и посмотреть, является ли результат ожидаемым.

user9613405
8 апреля 2018 в 16:12
0

Ожидаемый вид — это конус, плавающий и вращающийся в трехмерном пространстве. Сейчас попробовал портировать как мог, а у меня все прыгает. Я также задал свой вопрос здесь: opengl.org/discussion_boards/showthread.php/…

user9613405
8 апреля 2018 в 19:34
0

Я не знал, что порядок вершин имеет значение!! :/

user9613405
8 апреля 2018 в 19:45
0

Я испортил их.

Ответы (1)

avatar
user9613405
8 апреля 2018 в 21:15
0

Итак, проблема была в том, что я перепутал массивы вершин:

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
};

Должно быть:

   // index array
    unsigned int indices[] = {
        0, 1, 2,
        0, 3, 1,
        0, 4, 3,
        0, 2, 4,
        1, 3, 4,
        4, 2, 1 
    };

Порядок вершин должен идти против часовой стрелки.