0

請參閱下面的代碼,我從Game_Rotation_Vector傳感器事件有4個數字和我想要實現的是讓我的手機的軸旋轉角度。如何轉換遊戲旋轉矢量傳感器結果軸角

例如。如果我將手機屏幕計數器時鐘方向旋轉90度,我想從傳感器數據中獲得90deg的實際值。

任何人都可以提供代碼到4個遊戲旋轉矢量值轉換爲3軸的角度值?

+0

它看起來不錯除了RT的東西,那是什麼呢? – weston

+0

即將半徑轉換爲角度。如果我把手機調到180度,ya只會從-40改爲40.這應該是-90到90.不知道我的代碼有什麼問題。 – mind1n

+0

xa,xy和xz不是角度,它們是軸的座標,請在我的答案中閱讀鏈接。 – weston

回答

0

的值被放入單位四元數like so

sensors_event_t.data[0] = rot_axis.x*sin(theta/2); 
sensors_event_t.data[1] = rot_axis.y*sin(theta/2); 
sensors_event_t.data[2] = rot_axis.z*sin(theta/2); 
sensors_event_t.data[3] = cos(theta/2) 

所以,反向只是:

double theta = Math.acos(vals[3])*2; 
double sinv = Math.sin(theta/2); 

double xa = vals[0]/sinv; 
double ya = vals[1]/sinv; 
double za = vals[2]/sinv; 

但是 XA,XY,XZ和不角度它們是文檔中描述的座標軸。我不確定你想要什麼,你最好直接用單位四元數達到你未說明的目標。

使用unit quaternion的原因是爲了避免gimble lock,基本上可以不描述在三個角度,側傾/俯仰/偏轉,例如術語每一個可能的旋轉以一定的俯仰和偏航角可以喪失滾動的能力。

所以要利用這一種方法是轉換成旋轉矩陣:

Source

if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) { 
    // convert the rotation-vector to a 4x4 matrix. the matrix 
    // is interpreted by Open GL as the inverse of the 
    // rotation-vector, which is what we want. 
    SensorManager.getRotationMatrixFromVector(
      mRotationMatrix , event.values); 
} 
+0

感謝您的解釋,我誤解了軸角度的rot_axis。 那麼如何從四元數值得到軸角?我迷失在數學中,需要一些代碼示例。 – mind1n

+0

就像我說的,我認爲你最好不要這樣做,但我不知道更大的圖像,即你將如何處理角度? – weston

+0

角度將用於控制我的筆記本電腦的鼠標光標位置。 例如,如果我把我的頭從左向右,鼠標光標將遵循因爲我的電話和我的筆記本電腦屏幕之間的距離可以被測量並且被配置。 所以我真的需要知道我的手機轉過來的角度。謝謝。 – mind1n