2016-11-29 23 views
0

glm :: mat4モデル= glm :: mat4(1.0f);OpenGL C++で回転軸を回転す​​る方法は?

float dir_x = 0.0f, dir_y = 1.0f, dir_z = 0.0f; 

do { 

    // Clear the screen 

    glClear(GL_COLOR_BUFFER_BIT); 

    // Use our shader 

    glUseProgram(programID); 

    GLuint MatrixID = glGetUniformLocation(programID, "MVP"); 

    glm::mat4 Projection = glm::perspective(glm::radians(45.0f), 4.0f/3.0f, 0.1f, 100.0f); 

    //glm::mat4 Projection = glm::ortho(-1.0f,1.0f,-1.0f,1.0f,0.0f,100.0f); // In world coordinates 



    // Camera matrix 

    glm::mat4 View = glm::lookAt(

     glm::vec3(0.5, 0.5, 3), // Camera is at (4,3,3), in World Space 

     glm::vec3(0.5, 0.5, 0), // and looks at the origin 

     glm::vec3(0, 1, 0) // Head is up (set to 0,-1,0 to look upside-down) 

    ); 

    float rot_angle = 0.0f; 

    const float speed = 0.01f; 





    glm::vec3 dir = glm::vec3(dir_x, dir_y, dir-z); 



    if (glfwGetKey(window, GLFW_KEY_LEFT) == GLFW_PRESS) 

    { 

     rot_angle = -1.0f; 

     Model = glm::translate(tri_center)* glm::rotate(glm::mat4(), glm::radians(rot_angle), glm::vec3(0, 0, -1))*glm::translate(-tri_center)*Model; 

     //dir left 

...

私はオブジェクト(車を)回転させた場合、私は車のヘッドにそれを移動したいです。さて、車の頭に関係なく、車は上に動くだけです。 コードはどのように回転するのですか?回転の中心を変更

+0

実際に何をしたいのかを明確にすることはできますか?申し訳ありませんが、私は体からそれをかなり捕まえていませんでした。あなたはオブジェクトの回転の中心を変更するつもりですか? –

+0

申し訳ありませんが、私は英語が上手ではありません。あなたの考えは正しいです。私はオブジェクトの回転の中心を変更するつもりです – user6842178

+0

私の答えはそれからうまくいったのですか?あなたはそれが正しい回転に持っていますか? –

答えて

1

は、以下を達成することができる。

  1. 行列に最初の一番右側に変換、を左に右、左

  2. の最後を掛け、覚えておいてください

    まず、回転の中心をシーンの原点(0、0、0)に変換する変換を作成します。これは基本的にx、y、zのそれぞれを逆にします。ですから、例えばセンターvec3(1.0, 2.3, -5.2)ための翻訳がglm::mat4 origin = glm::translate(origin, glm::vec3(-1.0, -2.3, 5.2);

  3. 店このベクトルで、我々は今、行列を変換し、それらを保存これに所望の回転(複数可)を適用するメッシュ
  4. 内のすべてのポイントのためにこれを使用しようとしています新しいMAT4、そうでください: 最後にglm::mat4 final = glm::rotate(..) * origin
  5. は、以下でのVector3と同一の翻訳を作成することによって、元の位置に戻すセンター(およびモデルの残りの部分)を持参: glm::mat4 relocate = glm::translate(relocate, center)、その後 glm::mat4 final = relocate * glm::rotate(..) * origin
  6. を本質的に何ここでは、モデルの中心を原点に戻し、すべての点をそれに関連させて変換し、中心(これは現在の原点です)の周りを回転させて、元の距離に戻します。
  7. この変換をすべてのモデルポイントに適用します。これは明らかに頂点シェーダで行います。モデルがの場合、実際にはと小さくても、コード内で実行できますが、ほとんどのメッシュではメモリが不安定になります。別の行列を追加したくない場合は、このmat4をモデル行列に適用することができます。 model = model * final //note, first do transformations, then scale for the model

完全なコードは次のようなものになります(あなたも手動でmatriciesを掛けることができますが、GLMはあなたがtranslate()関数の引数に行列を渡すことができますが、それは、ちょうど現在の形でのマトリックスに変換を適用します)

glm::vec3 center = vec3(1.0, 2.3, -5.2); 
glm::mat4 finalTransform = glm::translate(finalTransform, glm::vec3(-1.0, -2.3, 5.2)); //first bring everything to origin, notice this is a mat4 
finalTransform = glm::rotate(finalTransform, ...); //rotate how you want 
finalTransform = glm::translate(finalTransform, center); //return to center 
model = model * finalTransform; //apply this transformation to be calculated by the vertex shader for the object 
glUniformMatrix4fv(glGetUniformLocation(sp, "model"), 1, GL_FALSE, glm::value_ptr(model)); //pass model matrix into shader program 

また、現在のコードでは正しいアイデアがあるようですが、翻訳機能が正しく使用されていないようです。このように呼び出す必要があります:glm::translate(mat4, vec3)。少なくともglm::mat4()コンストラクタで変換する場合は、空のmat4を作成してください。

関連する問題