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