OpenGL glm :: translate не переводит матрицу, как ожидалось - PullRequest
0 голосов
/ 09 октября 2018

Мне нужно масштабировать куб в 50 раз и перемещать его вдоль оси Z на 3.0f единиц:

glm::mat4 model(1.0f);
model = glm::scale(model, glm::vec3(50.0f, 50.0f, 50.0f));
model = glm::translate(model, glm::vec3(0.0f, 0.0f, 3.0f));

Но в результате я получил это: enter image description here

Я ожидал, что блок будет почти в центре, но это не так.Что я делаю не так?
Мой вершинный шейдер:

const char *vertexShaderSource = "#version 330 core\n"
"layout(location = 0) in vec3 aPos;\n"

"uniform mat4 model;\n"
"uniform mat4 view;\n"
"uniform mat4 projection;\n"

"void main()\n"
"{\n"
"   gl_Position = projection * view * model * vec4(aPos, 1.0f);\n"
"}\n\0";

Матрицы моего вида и проекции:

glm::vec3 cameraPos = glm::vec3(-300.0f, 0.0f, 0.0f);
glm::vec3 cameraFront = glm::vec3(1.0f, 0.0f, 0.0f);
glm::vec3 cameraUp = glm::vec3(0.0f, 1.0f, 0.0f);
glm::mat4 projection = glm::infinitePerspective(glm::radians(45.0f), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.001f);
glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "projection"), 1, GL_FALSE, glm::value_ptr(projection));
glm::mat4 view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);
glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "view"), 1, GL_FALSE, glm::value_ptr(view));

Мои массивы:

float vertices[] = {
        0.5f,  0.5f, -0.5f,
        0.5f, -0.5f, -0.5f,
        -0.5f, -0.5f, -0.5f,
        -0.5f,  0.5f, -0.5f,
        0.5f,  0.5f, 0.5f,
        0.5f, -0.5f, 0.5f,
        -0.5f, -0.5f, 0.5f,
        -0.5f,  0.5f, 0.5f,
    };
    unsigned int indices[] = {
        0, 1, 2,
        2, 3, 0,
        1, 0, 4,
        1, 4, 5,
        3, 7, 4,
        3, 4, 0,
        6, 2, 1,
        6, 1, 5,
        6, 7, 3,
        6, 3, 2,
        5, 4, 7,
        5, 7, 6,
    };

1 Ответ

0 голосов
/ 09 октября 2018

См. Документацию по glm API для translate():

Создает матрицу перевода 4 * 4, созданную из вектора из 3 компонентов.

Параметры

m Матрица ввода, умноженная на эту матрицу перевода
v Координаты вектора перевода.

Это означает, что матрица модели может быть выражена как:

model = scale * translate

Это приводит к тому, что перевод умножается на шкалу.Обратите внимание, умножение должно быть «прочитано» слева направо.(См. Программирование GLSL / Векторные и матричные операции )

Поменяйте масштаб и перевод, чтобы решить вашу проблему:

glm::mat4 model(1.0f);
model = glm::translate(model, glm::vec3(0.0f, 0.0f, 3.0f));
model = glm::scale(model, glm::vec3(50.0f, 50.0f, 50.0f));
...