glm roteer gebruik in Opengl

Ik ben een kegel aan het renderen en ik zou hem graag 90 graden tegen de klok in draaien, zodat het puntige uiteinde naar het westen wijst! Ik gebruik OpenGL 3+.

Hier is mijn code tot nu toe in mijn 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 );

Niet alle code wordt weergegeven.

Kan iemand me door de rotatie leiden? Ik moet de View matrix toch vermenigvuldigen? met “glm roteer” functie ?


Antwoord 1, autoriteit 100%

U moet uw Modelmatrix vermenigvuldigen. Want daar zouden modelpositie, schaling en rotatie moeten zijn (daarom wordt het de modelmatrix genoemd).

Het enige wat u hoeft te doen is (zie hier)

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)

Houd er rekening meedat om van graden naar radialen te converteren, gebruikglm::radians(degrees)

Dat neemt de Modelmatrix en past rotatie toe bovenop alle bewerkingen die er al zijn. De andere functies vertalen en schalen doen hetzelfde. Op die manier is het mogelijk om veel transformaties in één matrix te combineren.

opmerking:eerdere versies accepteerden hoeken in graden. Dit is verouderd sinds 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)

Antwoord 2, autoriteit 21%

GLM heeft een goed voorbeeld van rotatie: 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));

Antwoord 3, autoriteit 14%

Ik heb gemerkt dat je ook fouten kunt krijgen als je de hoeken niet correct specificeert, zelfs als je glm::rotate(Model, angle_in_degrees, glm::vec3(x, y, z))kunt u nog steeds problemen tegenkomen. De oplossing die ik hiervoor vond, was het specificeren van het type als glm::rotate(Model, (glm::mediump_float)90, glm::vec3(x, y, z))in plaats van alleen maar te zeggen glm::rotate(Model, 90, glm::vec3(x, y, z))

Of schrijf het tweede argument, de hoek in radialen (voorheen in graden), als een float zonder cast nodig zoals in:

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

Je kunt glm::radians() toevoegen als je graden wilt blijven gebruiken. En voeg de omvat toe:

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

Other episodes