我有一个有趣的问题。我试图找出一个用户手机的角度,无论他们是在横向或纵向还是在任何地方举行它们。
我目前正在使用SENSOR_ORIENTATION并获得YAW,ROLL和Pitch。我还试图使用偏航来获取zaxis上用户视图端口的角度,并且为了修正用户滚动(横向,纵向或中间),我做了一些简单的数学运算..:
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);
}
}
目前我得到以下结果:
pitch = -90 roll = 0 ;
pitch = 0 roll = 90 ;
pitch = 90 roll = -20 ;
pitch = 0 roll = -90 ;
我试图在这些位置中获得0的音高,然后当用户在HORIZON轴上倾斜手机时,分别得到-90到90之间的音高?
任何想法?哦,我应该补充一点,我的应用程序被锁定为横向模式..
答案 0 :(得分:1)
这些常数可能有累积错误。请尝试使用数学函数...
答案 1 :(得分:-1)
有趣的问题,
你试过获得绝对的x,y和z值(不论手机的方向如何)here,使用它,你应该得到你正在寻找的绝对y值
public abstract void onSensorChanged(int sensor,float [] values)
<强>&GT;重要说明:在设备屏幕上交换轴 方向变化。要访问未填充的值,请使用索引3,4 和值[]中的5。