影片是透過Xtion Pro進行Head Tracking的簡單展示.
現在透過Kinnect 或是Xtion Pro這類體感裝置,加上OpenNI的人體辨識功能,可以很容易的取得人眼的位置,並且將資訊回饋至3D的程式裡進行計算.不過一般的3D程式是假設人眼在螢幕正中間垂直看向螢幕,並且以此來設定投影矩陣. 進行Head tracking的時候,人眼位置不在正中間,因此投影矩陣的計算方式也得變化,下面是計算方式的推導過程.(OpenNI取得頭部位置的方法請參照人體骨架這篇文章)
首先假設螢幕的三個角落為Pa,Pb,Pc,
而人眼的位置為Pe.
透過Pa,Pb,Pc可以計算出螢幕的座標系統的單位向量Vr, Vu Vn,
,
與座標轉換矩陣 M.
而人眼Pe到螢幕的位置如圖也可以得到三個向量Va,Vb,Vc,
並且計算出人眼到螢幕的距離 d.
接著透過螢幕大小與 Near Plane距離等比例的關係可以計算出l,r,b,t ,
結合Near plane與Far plane距離的值便可以透過OpenGL的glFrustum設定出投影矩陣P.
不過螢幕與視線沒有正交時,還需要將螢幕的座標系統轉換成世界座標系統M-1,
並且加上人眼的位移矩陣 T,
所以最後投影矩陣的計算方式為:
參考資料:
Generalized Perspective Projection, Robert Kooima. August 2008, revised June 2009.