2012-06-22 20 views
2

是否有可能偏航歐拉角使用轉換偏航歐拉角在範圍[-90,90]至[0,360]

btTransform trans; 
trans.getBasis().getEulerYPR(rx, ry, rz); 

到範圍[0 Bullet物理引擎得到轉換, 360]。否則,對於360度旋轉,我得到歐拉角從0-> 90-> 0-> -90-> 0變化,但我想從0-> 90-> 180-> 270-> 0

我的圖形API只接受的旋轉角度在0至360


那麼,0-> 90-> 0-> -90是音高值。這裏是我現在使用的代碼:

trans.getBasis().getEulerYPR(yaw, pitch, roll); 
y1 = (pitch >= 0) ? pitch : (PI2 + pitch); 

我想爲音高的負值添加180,但這並不奏效。那麼看來我需要找到另一種方式來使用歐拉角度平滑地旋轉網格。


更新:看來我不應該直接使用子彈功能。一個更好的選擇是直接處理基礎矩陣:

btMatrix3x3 m_el = trans.getBasis(); 
ry = btAtan2(m_el[0].z(), m_el[0].x()); 
if(ry < 0) 
    ry += SIMD_PI; 

因此,這給了我關於y軸的旋轉。現在關於其他2 ....唷!

+0

是我的答案,你找什麼呢? http://stackoverflow.com/questions/29869130/how-to-get-the-euler-rotation-of-a-rigid-body-between-0-to-360-in-bullet-physics/37506181#37506181 – Andrew

回答

0

否,讀盤上的不同角度的結構域,或在歐拉角一般。兩個有其域[0,2 PI]通常偏航和橫滾和一個[0,PI]通常間距。

+0

所以我想,如果我想流暢地進行轉動使用歐拉角單獨一個網格,這將是不可能的。因爲當歐拉角度超過90°並開始下降時,網格會向後旋轉!奇怪的是我得到一個範圍[-90,90] –

+0

@ safe-malloc如果你想要平滑旋轉我建議使用四元數。與歐拉角相比,四元數在SO(3)上是一個2-> 1的映射,這意味着在域中不存在引起像萬向節鎖的副作用的極點。另外,在兩個方向之間旋轉的[interpolate](http://en.wikipedia.org/wiki/Slerp)與四元數直接相關。退房'void btMatrix3x3 :: getRotation(btQuaternion&q)const' ...'btQuaternion btQuaternion :: slerp(...)'已經實現...很好 – Bort