2012-07-10 54 views
0

對於LookAt函數,MSDN(http://msdn.microsoft.com/zh-cn/library/windows/desktop/bb281710%28v=vs.85%29.aspx)是這樣的數學運算:LookAt函數後面的數學

zaxis = normal(cameraTarget - cameraPosition) 
xaxis = normal(cross(cameraUpVector, zaxis)) 
yaxis = cross(zaxis, xaxis) 

xaxis.x   yaxis.x   zaxis.x   0 
xaxis.y   yaxis.y   zaxis.y   0 
xaxis.z   yaxis.z   zaxis.z   0 
-dot(xaxis, cameraPosition) -dot(yaxis, cameraPosition) -dot(zaxis, cameraPosition) 1 

據我所知最後一行是翻譯。你能解釋一下爲什麼不能在這一行上放置cameraPosition並且需要點函數嗎?

回答

3

這是因爲視圖矩陣將物體從世界空間轉換爲相機空間。這不是將相機置於其位置的轉換。這將是相反的轉變。 考慮一個簡單的二維座標系:

Coordinate system

黑色座標系是世界體系。藍色的是與其系統相機。綠色箭頭是世界空間中相機的平移向量。

查看矩陣會將相機從當前位置返回到原點。第一個步驟是一個旋轉,從而使這兩個系統的根據軸指向同一方向:

Coordinate system transformed

這是由矩陣(m_11到m_33)的其他條目來實現的。

現在還沒有留下一個翻譯。但翻譯矢量被轉換。幸運的是,我們知道,如何。翻譯向量等於攝像機位置(注意,是DirectX的採用換位矩陣爲了展示背後的數學,我轉回來。):

/ xAxis.x xAxis.y xAxis.z ...\ /camPos.X \ /camPos.x * xAxis.x + camPos.Y * xAxis.y + camPos.z * xAxis.z \ 
| yAxis.x yAxis.y yAxis.z ...| | camPos.Y | | camPos.x * yAxis.x + camPos.Y * yAxis.y + camPos.z * yAxis.z | 
| zAxis.x zAxis.y zAxis.z ...| * | camPos.Z | = | camPos.x * zAxis.x + camPos.Y * zAxis.y + camPos.z * zAxis.z | 
\ 0  0   0  .../ \ 0 / \      0         /

如果你看看結果:

camPos.X * xAxis.x + xamPos.Y * xAxis.y + camPos.z * xAxis.z 

然後你看,這是等於

dot (camPos, xAxis) 

結論,點積用於補償旋轉。沒有它,照相機會有些偏移(在這個例子中,右上角太遠了)。