我有一個有趣的問題。我試圖追蹤用戶手機的角度,無論他們是否將其放在橫向或縱向或任何其中的任何位置。以地平線爲軸確定設備的角度-android
我目前正在使用SENSOR_ORIENTATION並獲取YAW,ROLL和Pitch。我也試圖讓用戶的角度看,使用偏航z軸端口,爲用戶卷糾正(風景,人像,或在兩者之間),我做了一些簡單的數學..:
double roll = phoneOri.getRoll();
double yaw = phoneOri.getYaw()+roll;
if (yaw>=360){
yaw = (yaw - 360);
}
if (yaw<0){
yaw = (yaw+360);
}
這個代碼糾正偏航,並給我適當的角度,無論輥位置是什麼..
但這種數學似乎不正確的瀝青。如果我將手機垂直放在地板上,無論是翻滾還是偏航,我總是希望得到0的音高,如果我直接面對電話的背面直到天空,並且平行於地面,我希望得到90,然後回到地面-90;
這裏是我如何得到俯仰滾轉和偏航:
double yaw;
double pitch;
double roll;
public void onSensorChanged(SensorEvent evt) {
int type=evt.sensor.getType();
if(type == Sensor.TYPE_ORIENTATION){
yaw = evt.values[0];
pitch = evt.values[1];
roll = evt.values[2];
}
if (type == Sensor.TYPE_MAGNETIC_FIELD) {
orientation[0]=(orientation[0]*1+evt.values[0])*0.5f;
orientation[1]=(orientation[1]*1+evt.values[1])*0.5f;
orientation[2]=(orientation[2]*1+evt.values[2])*0.5f;
} else if (type == Sensor.TYPE_ACCELEROMETER) {
acceleration[0]=(acceleration[0]*2+evt.values[0])*0.33334f;
acceleration[1]=(acceleration[1]*2+evt.values[1])*0.33334f;
acceleration[2]=(acceleration[2]*2+evt.values[2])*0.33334f;
}
if ((type==Sensor.TYPE_MAGNETIC_FIELD) || (type==Sensor.TYPE_ACCELEROMETER)) {
float newMat[]=new float[16];
//Toast toast = Toast.makeText(ctx.getApplicationContext(), "accel", Toast.LENGTH_SHORT);
//toast.show();
SensorManager.getRotationMatrix(newMat, null, acceleration, orientation);
if(displayOri==0||displayOri==2){
SensorManager.remapCoordinateSystem(newMat,SensorManager.AXIS_X*-1, SensorManager.AXIS_MINUS_Y*-1,newMat);
}else{
SensorManager.remapCoordinateSystem(newMat,SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X,newMat);
}
matrix=newMat;
SensorManager.getOrientation (newMat, orientationValues);
}
}
目前我得到如下結果:
間距= -90卷= ;
間距= 輥= ;
間距= 輥= -20;
間距= 輥= -90;
我想在這些位置的任何位置得到0的間距,然後當用戶在HORIZON軸上傾斜手機時分別得到-90和90之間的音高?
什麼想法?噢,我要補充一點,我的應用程序被鎖定爲橫向模式..
我很困惑如何實際得到這些?那是什麼傳感器類型? Sensor_ORIENTATION並沒有達到[5]它停在[2]更多的東西給了我一個錯誤.. 我正在更新我的代碼,告訴你我的整個傳感器更改方法.. – erik 2012-07-13 19:36:46
有沒有辦法得到那些據我所知 – erik 2012-07-14 22:12:27