web-dev-qa-db-ja.com

Openglのglm回転使用

コーンをレンダリングしていますが、先の尖った端が西を向くように、反時計回りに90度回転させたいと思います! OpenGL 3+を使用しています。

ここに私の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 );

すべてのコードが表示されるわけではありません。

誰かが私を回転させてくれますか?ビュー行列を右に乗算する必要がありますか? 「glm rotate」機能を使用して?

13
Test Test

モデル行列を乗算する必要があります。それがモデルの位置、スケーリング、回転があるべき場所だからです(それがモデル行列と呼ばれる理由です)。

あなたがする必要があるのは( here を参照)

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

度からラジアンに変換するには、useglm::radians(degrees)

これは、Modelマトリックスを取得し、既に存在するすべての操作の上に回転を適用します。他の関数は、同じように変換およびスケールします。そうすれば、単一のマトリックスで多くの変換を組み合わせることができます。

note:以前のバージョンでは、角度を度単位で受け入れていました。 .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には回転の良い例があります: 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

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))として型を指定することでした

または、2番目の引数、ラジアン単位の角度(以前は度単位)を、次のようなキャストを必要としない浮動小数点数として記述します。

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"
6
abe732