繁体   English   中英

确定以地平线为轴的设备的角度-android

[英]determining angle of device with horizon as axis -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横滚= 0 ;

在此处输入图片说明

俯仰= 0滚= 90 ;

在此处输入图片说明

俯仰= 90滚= -20 ;

在此处输入图片说明

俯仰= 0滚= -90 ;

我试图在这些位置中的任何一个位置将音高设置为0,然后在用户将手机沿HORIZON轴倾斜时分别获得-90和90之间的音高?

有任何想法吗? 哦,我应该补充一点,我的应用程序已锁定为横向模式。

这些常数可能有累积误差。 尝试改用数学函数...

有趣的问题

您是否尝试过获取此处所述的x,y和z的绝对值(与手机的方向无关),使用该方法,您应该获取想要的y绝对值

公共抽象无效onSensorChanged(int传感器,float []值)

>重要说明:当设备的屏幕方向改变时,轴将被交换。 要访问未交换的值,请在values []中使用索引3、4和5。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM