討論區快速選單
知識庫快速選單
程式設計俱樂部Facebook粉絲團 掌握Salesforce雲端管理秘訣 軟體開發過程中有哪些資安漏洞?
[ 回上頁 ] [ 討論區發言規則 ]
四元數如何轉回尤拉角
更改我的閱讀文章字型大小
作者 : xxxun(xun)
[ 貼文 32 | 人氣 3067 | 評價 70 | 評價/貼文 2.19 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/5/17 下午 03:28:00
D3DXQUATERNION q1 , q2;

D3DXQuaternionRotationYawPitchRoll( &q1, 3.1415927f , 0.0f , 0.0f ) ; //轉y軸180度

FLOAT fYaw = atan2( 2 * (q.x*q.y + q.w*q.z) , q.w*q.w + q.x*q.x - q.y*q.y - q.z*q.z ) ;
FLOAT fPitch = asin ( -2 * (q.x*q.z - q.w*q.y) ) ;
FLOAT fRoll = atan2( 2 * (q.y*q.z + q.w*q.x) , q.w*q.w - q.x*q.x - q.y*q.y + q.z*q.z ) ;

D3DXQuaternionRotationYawPitchRoll( &q2, fYaw , fPitch , fRoll ) ;

結果:
fYaw = 3.1415927
fPitch = 0.0
fRoll = 3.1415927 //多了180度

q1.x = 0.0
q1.y = 1.0
q1.z = 0.0
q1.w = 0.0

//再轉回去的也不對
q2.x = 1.0
q2.y = 0.0
q2.z = 0.0
q2.w = 0.0


轉角度的公式我是參考OGRE跟電玩物理學一書(兩者做法是一樣的)..
但求出的結果卻跟原本的角度不一樣..
請問各位知道問題出在在哪嗎..
作者 : xxxun(xun)
[ 貼文 32 | 人氣 3067 | 評價 70 | 評價/貼文 2.19 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/5/17 下午 03:46:21
順便再問一下..
各位大大在旋轉矩陣時是使用什麼方法..
是用3個尤拉角,還是四元數,或是繞任意軸旋轉的方法..
作者 : dorkas(aming) VC++優秀好手遊戲程式設計卓越專家DirectX頂尖高手C++優秀好手貼文超過2000則
[ 貼文 2624 | 人氣 4536 | 評價 11810 | 評價/貼文 4.5 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人xxxun註記此篇回應為最佳解答 2005/5/17 下午 04:23:26

     float fPitch, fYaw, fRoll;
     float r11, r21, r31, r32, r33, r12, r13;
     float q00, q11, q22, q33;
     float tmp;
    
     q00 = w * w;
     q11 = x * x;
     q22 = y * y;
     q33 = z * z;
    
     r11 = q00 + q11 - q22 - q33;
     r21 = 2 * (x*y + w*z);
     r31 = 2 * (x*z - w*y);
     r32 = 2 * (y*z + w*x);
     r33 = q00 - q11 - q22 + q33;
    
     tmp = _fabs(r31);
     if(tmp > 0.999999)
     {
     r12 = 2 * (x*y - w*z);
     r13 = 2 * (x*z + w*y);
    
    
     fPitch = 0.0f;
    
     fYaw = (float)-((cePI/2) * r31/tmp);
    
     fRoll = (float)atan2(-r12, -r31*r13);
     }
     else
     {
    
     fPitch = (float)atan2(r32, r33);
    
     fYaw = (float)asin(-r31);
    
     fRoll = (float)atan2(r21, r11);
     }

作者 : dorkas(aming) VC++優秀好手遊戲程式設計卓越專家DirectX頂尖高手C++優秀好手貼文超過2000則
[ 貼文 2624 | 人氣 4536 | 評價 11810 | 評價/貼文 4.5 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人xxxun註記此篇回應為很有道理 2005/5/17 下午 04:34:22
r31 = 2 * (x*z - w*y); //r31= -2
 tmp = _fabs(r31); //取絕對值 tmp=2
 if(tmp > 0.999999) // 2> 0.999999
//所以會進入下面的算式
 {
     r12 = 2 * (x*y - w*z);
     r13 = 2 * (x*z + w*y);
    
    
     fPitch = 0.0f;
    
     fYaw = (float)-((_PI/2) * r31/tmp);
    
     fRoll = (float)atan2(-r12, -r31*r13);
 }

作者 : xxxun(xun)
[ 貼文 32 | 人氣 3067 | 評價 70 | 評價/貼文 2.19 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/5/17 下午 05:30:37
嗯嗯...有道理...
被ORGE陷害了...
在90度時好像都會出錯...
不應該偷機直接展開...
作者 : xxxun(xun)
[ 貼文 32 | 人氣 3067 | 評價 70 | 評價/貼文 2.19 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/5/17 下午 07:09:29
老大(aming是我師父)..
電玩物理學裡向量的定義跟DirectX 不一樣..
他的 x 是滾轉角 = D3DXVECTOR3.z
     Y 是俯仰角 = D3DXVECTOR3.x
     Z 是偏轉角 = D3DXVECTOR3.y

所以公式要改過,真是敗給他了
作者 : dorkas(aming) VC++優秀好手遊戲程式設計卓越專家DirectX頂尖高手C++優秀好手貼文超過2000則
[ 貼文 2624 | 人氣 4536 | 評價 11810 | 評價/貼文 4.5 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/5/17 下午 08:24:22
DirectX 座標定義不一樣

一個Y朝上,一個Z朝上

作者 : vegita(vegita) 貼文超過200則人氣指數超過50000點
[ 貼文 263 | 人氣 62238 | 評價 370 | 評價/貼文 1.41 | 送出評價 59 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/5/17 下午 10:51:23
什麼是四元數與尤拉角?
可以參考哪本書或網站?
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/5/18 下午 07:27:08
所謂 Euler Angle (尤拉角), 是用來量化立體模型的旋轉的, 但是, 實際應用時, 大概會有多過一次的旋轉, 但是, 當多過一個 以 Euler Angle 定義的旋轉 組合起來, 就會發生所謂 Gimbal Lock 的情況, 即是, 某方向的旋轉失效. 而且, 以 Euler Angle 定義的旋轉, 也不能有效的作插值... ...

因此, 就出現了 Axis Angle 的定義, 就是說, 對著某方向來作自旋, 這樣, 加上一點應用的小技巧, 就可以把 Gimbal Lock 的問題解決.

但是, Axis Angle 仍然是不夠好, 因為, 仍然不能夠有效的完成插值的動作, 因此, Axis Angle 就再被延伸成 Quaternion (四元數), 以 Quaternion 來定義旋轉, 不僅可以解決 Gimbal Lock 的問題, 而且可以有效的做 插值, 因此, 現在當我們要定義旋轉時, 都會用 Quaternion 了.


http://mathworld.wolfram.com/EulerAngles.html
http://mathworld.wolfram.com/Quaternion.html
 板主 : 小呆 , 冷眼
 > 遊戲程式設計 - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - 遊戲程式設計 - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
遊戲程式設計
1 aming 2280 
2 冷眼 1450 
3 阿西德倫 510 
4 PLAYER 390 
5 garf 340 
6 Akira 330 
7 白老鼠(Gary) 290 
8 BlueTulip 270 
9 東昇 250 
10 CCL 240 
遊戲程式設計
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.0625