作者cjcat2266 (CJ Cat)
看板Flash
標題Re: [問題] 3D角度算式
時間Sat Aug 21 11:11:12 2010
昨天第一次放假從國軍online暫時登出...
推文中的方法是速解法沒錯
但是如果還是對正確的計算方式有興趣
那可以參考看看Quaternion和Matrix3D的概念
rotationX, Y, Z三者其實只是為了開發者方便而設計的三個setter methods
設定他們的值之後其實最後還是去修改背後的Matrix3D
最後畫面上的呈現還是以這個Matrix3D為主
各第三方API幾乎都有這三個setter methods
然後也有各自的Matrix3D換算方式
例如Stardust的Matrix3D從rotationX, Y, Z的換算方式
就是先算rotationZ、再算rotationY、最後是rotationX
實際式子可以參考Stardust的Matrix3D.set() method
http://bit.ly/bqgnt0
但是用三軸旋轉角度來表示3D空間的旋轉變形還是不夠
要指定任意軸的旋轉以及兩角度之間的內插很難計算
例如從(10, 20, 30)轉到(40, 30, 20)
絕不是直接把rotationX從10漸變到40, rotationY從20到30,rotationZ從30到20這麼容易
直接這樣做的結果看起來會是很奇怪的旋轉
這個時候就會需要用到Quaternion的概念
Quaternion是一種進階的數學運算方式
顧名思義,Quaternion的字根"Quat"有"四"之意
Quatenion中文翻譯為"四元數",你可以把他看成是一個四個數字一組的向量
可以大致想成是"旋轉軸方向的三軸分量+旋轉角度"
Quaterion有一個叫做SLERP (Spherical Linear Interpolation '球型內插法')的運算
可以準確的計算出兩個任意旋轉角度間的內插角度
當然這計算的input和output都是Quaternion
還需要將Quaternion轉換成Matrix3D,才可以正確的把畫面呈現
另外,也有將任意角度轉軸和任意旋轉角度換算成Quaternion的公式
於是,原po的問題解法就變成
1) 任意轉軸 = Y軸 (0, 1, 0)
旋轉角度 = 23.5度
2) 從Quaternion轉換成Matrix3D
以Stardust的Quaternion class來寫,大致就是這樣
Quaterinon.buildFromAxisRotation(new Vec3D(0, 1, 0), 23.5).toMatrix()
Stardust的Quaternion class請見
http://bit.ly/da2FJi
你可以自行比較看看rotationX, Y, Z轉換到Matrix3D
跟Quaterion轉換到Matrix3D
所需要的乘法和三角函數運算,總數差不多,所以不用擔心效能差距問題
但是如果要考慮到角度相加運算的話,那Quaternion就大幅勝過Matrix3D了
--
CJ Cat = Croa'J Cat = Cockroach Cat = 西街凱特 = 蜚蠊貓 = 蟑螂貓
Blog
http://cjcat.blogspot.com
Gallery
http://cjcat2266.deviantart.com
ptt2 Board CJWorkshop - 阿多比閃光(Adobe Flash)研討區
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.45.161.216
※ 編輯: cjcat2266 來自: 114.45.161.216 (08/21 11:14)
推 zswolf:大推!!!! 08/21 12:37
推 etrexetrex:推 08/21 13:09
推 kyzusmugoe:好深奧= =大推一下~! 08/21 15:09
推 interboard:看到高手只能推了 雖然我都看不懂= = 08/21 15:51
推 sextitanic:難得放假還熱心教學,大大推啊 08/21 15:59
推 uice:推~ 08/21 22:58
推 dontpkme:推 08/22 20:29
推 FLJX:CJ是我們的神! 08/24 18:58
推 dsmwang:雖然看不懂,還是推XD 08/25 01:06