2013-03-16 67 views
3
private Mat4 calcLookAtMatrix(Vec3 cameraPt, Vec3 lookPt, Vec3 upPt) { 
    Vec3 lookDir = Glm.normalize(Vec3.sub(lookPt, cameraPt)); 
    Vec3 upDir = Glm.normalize(upPt); 

    Vec3 rightDir = Glm.normalize(Glm.cross(lookDir, upDir)); 
    Vec3 perpUpDir = Glm.cross(rightDir, lookDir); 

    Mat4 rotMat = new Mat4(1.0f); 
    rotMat.setColumn(0, new Vec4(rightDir, 0.0f)); 
    rotMat.setColumn(1, new Vec4(perpUpDir, 0.0f)); 
    rotMat.setColumn(2, new Vec4(Vec3.negate(lookDir), 0.0f)); 

    rotMat = Glm.transpose(rotMat); 

    Mat4 transMat = new Mat4(1.0f); 
    transMat.setColumn(3, new Vec4(Vec3.negate(cameraPt), 1.0f)); 

    return rotMat.mul(transMat); 
} 

這段代碼生成一個世界到攝像頭矩陣,它將與openGL一起用於渲染。需要幫助瞭解這個旋轉矩陣數學代碼

我明白除旋轉矩陣形成方式之外的所有內容。基本上,它把歸一化的向量和轉置的矩陣,並以某種方式與旋轉矩陣出來。解釋數學。

+0

在http://math.stackexchange.com/這裏可能會更好。 – Austin 2013-03-16 08:50:40

回答

6

變換矩陣將頂點從一個空間轉換到另一個空間。假設初始空間是空間A並且最終空間是空間B.

空間A和空間B都由series of basis vectors定義。所以空間A有一些基本向量和一個原點。但是,如果你想用數字來談論基本向量,你必須談論它們相對於其他空間。否則,這些數字沒有意義,因爲空格定義了向量中的數字意味着

從空間A到空間B的變換矩陣是相對於空間B表示的空間A 的基向量。變換的第一列是空間A相對於空間B的X軸方向。第二列是A的Y軸,第三列是A的Z軸。

代碼正在做什麼是相對於給定的世界空間(由它給出的三個向量定義)產生相機空間的基向量。所以它建立了一個矩陣,它在攝像機空間中佔據頂點並將它們吐出世界空間。

然而,它想要生成的矩陣是從世界空間到相機空間的轉換。所以它反轉之前的矩陣; A到B矩陣的倒數是B到A矩陣。有趣的事實:純旋轉矩陣的逆與其轉置相同,這也更容易計算。

+1

+1我已經使用過,但從來不知道爲什麼它可以工作到現在。 – 2013-03-19 23:12:40