con c++ opengl glm

c++ - con - glm rotar el uso en Opengl



glm github (3)

GLM tiene un buen ejemplo de rotación: 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));

Estoy renderizando un cono, y me gustaría rotarlo 90 grados en sentido contrario a las agujas del reloj, de modo que el extremo puntiagudo esté orientado hacia el oeste. Estoy usando OpenGL 3+.

Aquí está mi código en mi Cone.cpp hasta el momento:

//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 );

No se muestra todo el código.

¿Puede alguien guiarme a través de la rotación? Tengo que multiplicar la matriz de Vista ¿verdad? con la función "glm rotate"?


Necesita multiplicar su matriz de modelo. Porque ahí es donde debe estar la posición del modelo, la escala y la rotación (por eso se llama matriz del modelo).

Todo lo que necesitas hacer es:

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)

Eso toma la matriz del modelo y aplica la rotación sobre todas las operaciones que ya están allí. Las otras funciones de traducir y escalar hacen lo mismo. De esta forma, es posible combinar muchas transformaciones en una sola matriz.


Noté que también puedes obtener errores si no especificas los ángulos correctamente, incluso cuando usas glm::rotate(Model, angle_in_degrees, glm::vec3(x, y, z)) aún podrías tener problemas. La solución que encontré para esto fue especificar el tipo como glm::rotate(Model, (glm::mediump_float)90, glm::vec3(x, y, z)) lugar de simplemente decir glm::rotate(Model, 90, glm::vec3(x, y, z))

O simplemente escriba el segundo argumento, el ángulo en radianes (anteriormente en grados), como un flotador sin necesidad de conversión, como en:

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

Puede agregar glm :: radianes () si desea seguir usando grados. Y agregue el incluye:

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