GLM Rotate использование в OpenGL - PullRequest
13 голосов
/ 13 января 2012

Я рендерил конус и хотел бы повернуть его на 90 градусов против часовой стрелки, чтобы заостренный конец был направлен на запад!Я использую OpenGL 3 +.

Вот мой код в моем Cone.cpp на данный момент:

//PROJECTION
    glm::mat4 Projection = glm::perspective(45.0f, 1.0f, 0.1f, 100.0f);

    //VIEW
    glm::mat4 View = glm::mat4(1.);
    View = glm::translate(View, glm::vec3(2.0f,4.0f, -25.0f));

    //MODEL
    glm::mat4 Model = glm::mat4(1.0);
    //Scale by factor 0.5
    Model = glm::scale(glm::mat4(1.0f),glm::vec3(0.5f));

    glm::mat4 MVP = Projection * View * Model;
    glUniformMatrix4fv(glGetUniformLocation(shaderprogram_spaceship, "MVP_matrix"), 1, GL_FALSE, glm::value_ptr(MVP));

    glClearColor(0.0, 0.0, 0.0, 1.0);

    glDrawArrays(GL_LINE_STRIP, start_cone, end_cone );

Не весь код показан.

Может кто-нибудьвести меня через поворот?Я должен умножить матрицу вида правильно?с функцией "glm rotate"?

Ответы [ 3 ]

36 голосов
/ 08 февраля 2012

Вам нужно умножить матрицу модели.Потому что именно там должно быть положение модели, масштабирование и поворот (поэтому она называется матрицей модели).

Все, что вам нужно сделать, это (см. здесь )

Model = glm::rotate(Model, angle_in_radians, glm::vec3(x, y, z)); // where x, y, z is axis of rotation (e.g. 0 1 0)

Примечание , чтобы преобразовать градусы в радианы, использовать glm::radians(degrees)

, который принимает матрицу модели и применяет вращение сверхуиз всех операций, которые уже там.Другие функции переводят и масштабируют то же самое.Таким образом, можно объединить много преобразований в одну матрицу.

примечание: более ранние версии принимали углы в градусах.Это устарело с 0.9.6

Model = glm::rotate(Model, angle_in_degrees, glm::vec3(x, y, z)); // where x, y, z is axis of rotation (e.g. 0 1 0)
9 голосов
/ 10 июля 2012

GLM имеет хороший пример поворота: http://glm.g -truc.net / code.html

glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.f);
glm::mat4 ViewTranslate = glm::translate(
    glm::mat4(1.0f),
    glm::vec3(0.0f, 0.0f, -Translate)
);
glm::mat4 ViewRotateX = glm::rotate(
    ViewTranslate,
    Rotate.y,
    glm::vec3(-1.0f, 0.0f, 0.0f)
);
glm::mat4 View = glm::rotate(
    ViewRotateX,
    Rotate.x,
    glm::vec3(0.0f, 1.0f, 0.0f)
);
glm::mat4 Model = glm::scale(
    glm::mat4(1.0f),
    glm::vec3(0.5f)
);
glm::mat4 MVP = Projection * View * Model;
glUniformMatrix4fv(LocationMVP, 1, GL_FALSE, glm::value_ptr(MVP));
6 голосов
/ 02 августа 2016

Я заметил, что вы также можете получить ошибки, если вы не укажете углы правильно, даже при использовании glm::rotate(Model, angle_in_degrees, glm::vec3(x, y, z)) вы все равно можете столкнуться с проблемами.Исправление, которое я нашел для этого, указывало тип как glm::rotate(Model, (glm::mediump_float)90, glm::vec3(x, y, z)) вместо того, чтобы просто сказать glm::rotate(Model, 90, glm::vec3(x, y, z))

Или просто написать второй аргумент, угол в радианах (ранее в градусах), как число с плавающей точкой без приведениянеобходимо, например:

glm::mat4 rotationMatrix = glm::rotate(glm::mat4(1.0f), 3.14f, glm::vec3(1.0));

Вы можете добавить glm :: radians (), если хотите продолжать использовать градусы.И добавить включает в себя:

#include "glm/glm.hpp"
#include "glm/gtc/matrix_transform.hpp"
...