2012-01-13 32 views
8

¡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+.uso de rotación de glm en Opengl

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

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

No todo el código.

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

+11

¿Cuál es el problema? Necesitas decirnos cuál es el problema. No es justo no solo querer que le digamos * la solución *, sino también querer que descubramos * el problema *. –

Respuesta

30

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 necesita 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) 

que toma la matriz de modelo, y se aplica la rotación en la parte superior de todas las operaciones que ya existen en. Las otras funciones de traducir y escalar hacen lo mismo. De esta forma, es posible combinar muchas transformaciones en una sola matriz.

8

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

Enlace de ejemplo de código 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

me di cuenta de que también se puede obtener errores si no se especifica correctamente los ángulos, incluso cuando se utiliza glm::rotate(Model, angle_in_degrees, glm::vec3(x, y, z)) todavía podría encontrarse con problemas. La solución que encontré para esto era que especifica el tipo que glm::rotate(Model, (glm::mediump_float)90, glm::vec3(x, y, z)) en vez de decir glm::rotate(Model, 90, glm::vec3(x, y, z))

o simplemente escribir el segundo argumento, el ángulo en radianes (previamente en grados), como un flotador sin molde necesario, 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" 
+0

Haciendo eso 90 a 90.0f podría haberlo hecho. – RobC

+0

Según la [documentación] (http://glm.g-truc.net/0.9.4/api/a00206.html#ga3eed13fc5bcaff2f2204b12013bb83bf), el ángulo que toma es en grados. Así que pasar '3.14f' gira en una pequeña cantidad (3 grados en lugar de 180 grados). Además, la función es una plantilla que pasa un entero ya que el ángulo hace que el tipo de argumento sea ambiguo (lo que produce un error en tiempo de compilación). Especificar '180.0f' probablemente sea lo que quieres decir. –

Cuestiones relacionadas