簡體   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