簡體   English   中英

OpenGL-在Matrix 4x4上本地顯示嗎?

[英]OpenGL - Local Up and Right From Matrix 4x4?

我以以下方式構建了一個轉換矩陣4x4:

glm::mat4 matrix;
glm::quat orientation = toQuaternion(rotation);
matrix*= glm::mat4_cast(orientation);
matrix= glm::translate(matrix, position);
matrix= glm::scale(matrix, scale);

orientation = toQuaternion(localRotation);
matrix*= glm::mat4_cast(orientation);
matrix= glm::scale(matrix, localScale);

其中旋轉,位置,比例,localRotation和localScale均為vector3。 根據許多不同論壇上許多不同問題的建議, 應該有可能像這樣從結果矩陣中找出本地路線:

right   = glm::vec3(matrix[0][0], matrix[0][1], matrix[0][2]);
up      = glm::vec3(matrix[1][0], matrix[1][1], matrix[1][2]);
forward = glm::vec3(matrix[2][0], matrix[2][1], matrix[2][2]);

所有這些方向均已標准化。 然后,我使用這些方向來獲得如下視圖矩陣:

glm::lookAt(position, position + forward, up);

一切都很好-例外:當我在一個場景中飛行時,正確的矢量和向上的矢量完全是錯誤的。 前進方向始終與應有的方向完全一致。 當我在0、0,-1處看着0、0、0時,所有方向都是正確的。 但是,當我朝不同的方向看(除了從0,0,-1看原點的逆過程)時,向右和向上不一致。 它們不是世界向量,也不是局部向量。 他們似乎幾乎是隨機的。 我要去哪里錯了? 如何從4x4變換矩陣中獲得一致的局部上向量和局部右向量?

matrix是局部到世界的轉換,而視圖矩陣是局部到世界的轉換,這意味着在這種情況下, matrix是視圖矩陣的矩陣。 您當前擁有的代碼僅適用於視圖矩陣。 只需交換行和列:

right   = glm::vec3(matrix[0][0], matrix[1][0], matrix[2][0]);
up      = glm::vec3(matrix[0][1], matrix[1][1], matrix[2][1]);
forward = glm::vec3(matrix[0][2], matrix[1][2], matrix[2][2]);

它適用於(0, -1, 0)的可能原因是,視圖矩陣的旋轉/縮放部分看起來像:

1 0 0
0 0 1
0 1 0

matrix的相應部分是上面的逆,當然是相同的。 換個方向嘗試一下。

暫無
暫無

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

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