No sub title
在3D游戲開發中,該變換時常發生。下面記錄下,以備隨時查詢用。說明:1) 已經向量v就不用說,可以是3維空間中的任意向量。(不論位置在哪都沒關系,因為向量是與位置無關的)2) 繞已知向量n旋轉。此處的n向量,最好要規范化成單位向量。為什么需要此要求呢?其實很簡單,如果不規范化成單位向量,那么變換后的結果向量(假如稱為v'),其模就不會等于原向量v的模。因此就會出錯。(當然,如果非要用非規范化的單位向量參與計算的話,我們也是可以通過將v'進行一些處理,而得到最終想要的向量。)下面,確認一下,變換矩陣以及變化公式所需的參數信息:v(vx , vy , vz) : 為已經向量n(nx , ny , nz) : 為v向量繞n旋轉的“基向量”R(n , angle) : 為旋轉所需的變換矩陣。(注釋:angle就是角度,本來可以直接用那些希臘字母,結果發現用了,在此,我就輸入不了中文與英文字符了。蛋疼)v'(vx' , vy' , vz') : 為變換后最終要得到的結果向量根據3D變換基礎知識,可得如下公式:v' = vR(n, angle)其中,v向量已知。R(n, angle)根據推導,可得如下式子: [ p' ] [ nx2(1 - cos(angle)) + cos(angle) nxny(1 - cos(angle)) + nzsin(angle) nxnz(1 - cos(angle)) - nysin(angle) ]R(n, angle) = | q' | = | nxny(1 - cos(angle)) - nzsin(angle) ny2(1 - cos(angle)) + cos(angle) nynz(1 - cos(angle)) + nxsin(angle) | [ r' ] [ nxnz(1 - cos(angle)) + nysin(angle) nynz(1 - cos(angle)) - nxsin(angle) nz2(1 - cos(angle)) + cos(angle) ]所以,可得最終的v'向量。具體如下:v' = vR = (vx, vy, vz)R;vx' = vx * (nx2(1 - cos(angle)) + cos(angle));vx' += vy * (nxny(1 - cos(angle)) - nzsin(angle));vx' += vz * (nxnz(1 - cos(angle)) + nysin(angle));vy' = vx * (nxny(1 - cos(angle)) + nzsin(angle));vy' += vy * (ny2(1 - cos(angle)) + cos(angle));vy' += vz * (nynz(1 - cos(angle)) - nxsin(angle));vz' = vx * (nxnz(1 - cos(angle)) - nysin(angle));vz' += vy * (nynz(1 - cos(angle)) + nxsin(angle));vz' += vz * (nz2(1 - cos(angle)) + cos(angle));-----------------------------------------------------------------有了上面的知識,現在就可以很容易理解。如下一段旋轉攝像機方向的代碼了:(注:代碼出自徐明亮作者所著《opengl游戲編程》一書中的內容)
Copyright @ Jacc.Kim Powered by: .Text and ASP.NET Theme by: .NET Monster