2016-11-29 104 views
0

glm :: mat4 Model = 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 

...

如果我旋轉對象(車),我想將它移動到汽車的頭。現在,無論車頭如何,車輛只會向上移動。 代碼如何使dir旋轉?

+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. 現在應用所需的旋轉(S)這個轉換矩陣並將其存儲在一個新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)。至少,構造一個空的mat4以與glm::mat4()構造函數進行翻譯。