簡體   English   中英

如何使用 glm::mat4 手動正確編寫旋轉矩陣?

[英]How to correctly write rotation matrices by hand using glm::mat4?

我正在編寫一個 OpenGL 程序,對於那個程序,我正在嘗試手動編寫一些旋轉矩陣(我知道glm::rotate ,但這是一個類,所以我不能使用該函數),但它沒有看起來不像我想要的那樣工作。

我正在繪制一個停車場和汽車分別繪制輪胎的場景,輪胎隨着相機移動而不是原地不動: 車 如您所見,輪胎朝向相機略微旋轉,看起來像。

編輯:此外,在繪制其他對象(旋轉的)時,它們似乎會傾斜:

歪斜的 注意高度傾斜的建築物。

據我了解,這就是旋轉矩陣的外觀:

矩陣

這就是我在代碼中所做的(為簡潔起見,省略了有關翻譯和縮放的部分):

//glm::mat4 rotXMatrix = glm::rotate(rotation.x, glm::vec3(1, 0, 0));
glm::mat4 rotXMatrix = glm::mat4(1.0f);
rotXMatrix[1][1] = cos(rotation.x);
rotXMatrix[1][2] = sin(rotation.x);
rotXMatrix[2][1] = -sin(rotation.x);
rotXMatrix[2][2] = cos(rotation.x);
//glm::mat4 rotYMatrix = glm::rotate(rotation.y, glm::vec3(0, 1, 0));
glm::mat4 rotYMatrix = glm::mat4(1.0f);
rotXMatrix[0][0] = cos(rotation.y);
rotXMatrix[0][2] = -sin(rotation.y);
rotXMatrix[2][0] = sin(rotation.y);
rotXMatrix[2][2] = cos(rotation.y);
//glm::mat4 rotZMatrix = glm::rotate(rotation.z, glm::vec3(0, 0, 1));
glm::mat4 rotZMatrix = glm::mat4(1.0f);
rotXMatrix[0][0] = cos(rotation.z);
rotXMatrix[0][1] = sin(rotation.z);
rotXMatrix[1][0] = -sin(rotation.z);
rotXMatrix[1][1] = cos(rotation.z);

glm::mat4 rotMatrix = rotZMatrix * rotYMatrix * rotXMatrix;
return posMatrix * rotMatrix * scaleMatrix;

當我不手動執行時它可以正常工作(使用glm::rot如注釋掉的部分所示,所以我想知道我對旋轉矩陣的構造方式有什么誤解。我很確定[]的順序是正確的,因為我可以使用相同的符號手動構建用於平移和縮放的矩陣,並且它可以正確縮放和移動對象。

編輯:請注意,這些變換矩陣適用於對象,而不是相機。

您正在修改錯誤的矩陣

glm::mat4 rotYMatrix = glm::mat4(1.0f);
rotXMatrix[0][0] = cos(rotation.y);
rotXMatrix[0][2] = -sin(rotation.y);
rotXMatrix[2][0] = sin(rotation.y);
rotXMatrix[2][2] = cos(rotation.y);

您正在構建rotYMatrix但修改rotXMatrix

暫無
暫無

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

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