web-dev-qa-db-fra.com

glm rotation utilisation dans Opengl

Je rends un cône, et je voudrais le faire pivoter de 90 degrés dans le sens inverse des aiguilles d'une montre, de sorte que l'extrémité pointue soit orientée vers l'ouest! J'utilise OpenGL 3+.

Voici mon code dans mon Cone.cpp jusqu'à présent:

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

Tout le code n'est pas affiché.

Quelqu'un peut-il me guider à travers la rotation? Je dois multiplier la matrice de vue non? avec la fonction "glm rotation"?

13
Test Test

Vous devez multiplier votre matrice de modèle. Parce que c'est là que devraient être la position, la mise à l'échelle et la rotation du modèle (c'est pourquoi on l'appelle la matrice du modèle).

Tout ce que vous devez faire est (voir ici )

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)

Notez que pour convertir des degrés en radians, utilisez glm::radians(degrees)

Cela prend la matrice du modèle et applique une rotation en plus de toutes les opérations qui s'y trouvent déjà. Les autres fonctions de traduction et d'échelle font de même. De cette façon, il est possible de combiner de nombreuses transformations dans une seule matrice.

note: les versions antérieures acceptaient les angles en degrés. C'est obsolète car .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)
37
the swine

GLM a un bon exemple de rotation: 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));
9
Anonymous

J'ai remarqué que vous pouvez également obtenir des erreurs si vous ne spécifiez pas correctement les angles, même lorsque vous utilisez glm::rotate(Model, angle_in_degrees, glm::vec3(x, y, z)), vous pouvez toujours rencontrer des problèmes. Le correctif que j'ai trouvé pour cela spécifiait le type comme glm::rotate(Model, (glm::mediump_float)90, glm::vec3(x, y, z)) au lieu de simplement dire glm::rotate(Model, 90, glm::vec3(x, y, z))

Ou écrivez simplement le deuxième argument, l'angle en radians (auparavant en degrés), sous la forme d'un flotteur sans transtypage nécessaire, comme dans:

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

Vous pouvez ajouter glm :: radians () si vous souhaitez continuer à utiliser des degrés. Et ajoutez les inclus:

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