17

円錐をレンダリングしています。反時計回りに 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 回転" 機能付き?

4

3 に答える 3

47

モデル行列を掛ける必要があります。それは、モデルの位置、スケーリング、および回転があるべき場所だからです (これがモデル マトリックスと呼ばれる理由です)。

あなたがする必要があるのは(ここを見てください)

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)

度からラジアンに変換するには、次を使用することに注意してください。 glm::radians(degrees)

これは、モデル マトリックスを取得し、既にそこにあるすべての操作の上に回転を適用します。他の関数の変換とスケーリングは同じことを行います。このようにして、多くの変換を 1 つのマトリックスに組み合わせることができます。

注:以前のバージョンでは角度を度単位で受け入れていました。これは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)
于 2012-02-08T10:09:51.347 に答える
9

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));
于 2012-07-09T22:33:05.473 に答える