簡體   English   中英

如何在OpenGL C ++中旋轉旋轉軸?

[英]How to rotate rotation axis in OpenGL C++?

glm :: mat4模型= glm :: mat4(1.0f);

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

...

如果旋轉物體(汽車),我想將其移動到汽車的頭部。 現在,不管汽車的頭高,汽車都只能向上移動。 代碼如何使目錄旋轉?

更改旋轉中心可以通過以下方法實現:

  1. 請記住,將矩陣RIGHT TO LEFT相乘,第一個轉換在最右邊,最后一個在左邊

  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) relocate glm::mat4 relocate = glm::translate(relocate, center) relocate 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

完整的代碼看起來像這樣:(您也可以手動將矩陣相乘,但是GLM允許您將矩陣傳遞到transform translate()函數的args中,然后將轉換形式以當前形式應用於矩陣)

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()構造函數進行翻譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM