2012-01-13 3 views
8

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

Вот мой код в моем 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); 

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

Может ли кто-нибудь вести меня через поворот? Мне нужно умножить матрицу вида прямо? с функцией «rot rot rot»?

+11

В чем проблема? Вы должны сказать нам, в чем проблема. Несправедливо не только то, что мы хотим сказать вам * решение *, но и хотим, чтобы мы выяснили * проблему *. –

ответ

30

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

Все, что вам нужно сделать, это:

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) 

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

8

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)); 
+0

Ссылка на пример кода GLM: [https://glm.g-truc.net/0.9.1/api/a00006.html](https://glm.g-truc.net/0.9.1/api/a00006. html) – befzz

5

Я заметил, что вы также можете получить ошибки, если вы не задаете углы правильно, даже при использовании 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" 
+0

Возможно, это сделало 90 90. – RobC

+0

В соответствии с [документацией] (http://glm.g-truc.net/0.9.4/api/a00206.html#ga3eed13fc5bcaff2f2204b12013bb83bf) угол, который требуется, равен градусам. Таким образом, передача «3.14f» вращается на небольшое количество (3 градуса, а не на 180 градусов). Кроме того, функция является шаблоном, поэтому передача целого числа в качестве угла делает тип аргумента неоднозначным (что дает ошибку времени компиляции). Указание '180.0f', вероятно, будет тем, что вы имели в виду. –

 Смежные вопросы

  • Нет связанных вопросов^_^