2016-06-22 91 views
2

我正試圖學習如何在OpenGL中的3D點上進行一些轉換。使用this cheat sheet我相信我有正確的矩陣乘以我想要旋轉的向量。但是,當我乘坐並打印新的座標時,我認爲這是不正確的。 (旋轉1,0,0 90度cc應該導致0,1,0正確?)爲什麼這不起作用?爲什麼我的矢量不能正確旋轉OpenGL/GLM?

我的代碼:

glm::vec4 vec(1.0f, 0.0f, 0.0f, 1.0f); 
glm::mat4 trans = { 
    1.0f, 0.0f, 0.0f, 0.0f, 
    0.0f, cos(glm::radians(90.0f)), -sin(glm::radians(90.0f)), 0.0f, 
    0.0f, sin(glm::radians(90.0f)), cos(glm::radians(90.0f)), 0, 
    0.0f, 0.0f, 0.0f, 1.0f 
}; 
vec = trans * vec; //I should get 0.0, 1.0, 0.0 right? 
std::cout << vec.x << ", " << vec.y << ", " << vec.z << std::endl; 

上面打印1.0, 0.0, 0.0表明沒有變化呢?我也嘗試在GLM中使用rotate函數生成我的矩陣,而不是手動指定,但我仍然沒有得到我認爲應該是正確的(我得到了一個不同的錯誤答案)。

glm::mat4 trans = glm::rotate(trans, 90.0f, glm::vec3(0.0, 0.0, 1.0)); //EDIT: my bad, should've been z axis not x, still not working 

上面打印:-2.14..e+08, -2.14..e+08, -2.14..e+08

(PS:我只是把幾何在上一學年,我道歉,如果數學是不正確我有矩陣和矩陣乘法,我選了一個基本的瞭解。今天學習OpenGL轉換,但其他的,然後我在這種排序)

+0

如果輸入是(1,0,0,1)並且輸出應該是(0,1,0,1),那麼你的旋轉應該在Z軸周圍。 –

+0

@HannesHauptmann好吧,我試着做出這樣的改變,但它仍然沒有返回正確答案'glm :: mat4 trans = glm :: rotate(trans,90.0f,glm :: vec3(0.0,0.0,1.0)) ;' –

+0

在左側看到OpenGL如何處理它。我是100%這是圍繞Z軸的旋轉:) –

回答

4

在你的代碼,你在x軸 繞X軸旋轉的單位矢量,並且不改變向量(想象 旋轉圍繞自身鉛筆,方向不改變,在所有)。

要達到你想要以前,你應該使用這樣的矩陣繞Z軸的 矢量:

glm::mat4 trans = { 
    cos(glm::radians(90.0f)), -sin(glm::radians(90.0f)), 0.0f, 0.0f, 
    sin(glm::radians(90.0f)), cos(glm::radians(90.0f)), 0.0f, 0.0f, 
    0.0f, 0.0f, 1.0f, 0.0f, 
    0.0f, 0.0f, 0.0f, 1.0f 
}; 

除此之外,glm::mat4 trans = glm::rotate(trans, 90.0f, glm::vec3(0.0, 0.0, 1.0));沒有返回,因爲反式需要得到期望的結果在傳遞給glm :: rotate之前進行初始化。試着這樣寫的:

glm::mat4 trans; // Default constructor called, trans is an identity matrix 
trans = glm::rotate(trans, glm::radians(90.0f), glm::vec3(0.0, 0.0, 1.0)); 

儘管如此,使用GLM ::弧度和cos /森時,你可能無法得到預期的載體(0.0F,1.0F,0.0F)因精度損失。在我的測試中,我得到了向量(-4.37113883e-008f,1.0f,0.0f),-4.37113883e-008實際上是-0.0000000437113883,這是一個非常接近於0的數字,即預期結果。

+0

啊,謝謝Jean。這也是@HannesHauptmann告訴我的。 –

+0

我認爲我對rotate()命令感到困惑的原因是因爲我習慣了java。我沒有意識到mat4是一個obj(因爲它不啓動w /大寫),也從未意識到它是用構造函數初始化的(因爲在java中你會使用new,然後顯式地調用構造函數)。看,這就是爲什麼C++會讓我迷惑 –

2

你自己的旋轉矩陣不改變輸入的原因很簡單:你的旋轉隻影響y和z座標,因爲那些爲零,結果與輸入完全相同。 X座標在輸出x座標中具有乘數1,因此保持不變。

例如,你可以使矢量1.0, 2.0, 3.0, 1.0,然後你會看到變化。

至於glm版本,不能說爲什麼會給出奇怪的結果,我從來沒有與他們的問題,但沒有用太多。

+0

感謝您的快速回答薩米人。 +1,因爲這有所幫助。我接受Jean的,因爲它有更多的信息(解釋爲什麼'rotate()')命令不起作用。我希望你不介意。 –

相關問題