如何获取电话标题以增强现实



可能的重复:Android GetIrientation Azimuth在手机倾斜时被污染


我是Android开发的新手,我尝试使用户面对。

在网络上搜索后,我很确定我需要使用remapCoordinateSystem,Android文档表示可以用于增强现实应用程序。

我尝试使用一些现有代码来确保这是一种好方法。

(最后我想创建一个增强现实应用程序)

以下代码应返回用户面对的程度:

代码:

        Sensor sensor = event.sensor;
        if (sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            gravity = event.values.clone();
        }else if (sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
            geomagnetic = event.values.clone();
        }
        
        if (gravity != null && geomagnetic != null){
            _rM = SensorManager.getRotationMatrix (R, null, gravity, geomagnetic);  
                if(_rM){
                    
                    int mScreenRotation = activity.getWindowManager().getDefaultDisplay().getRotation(); // get user orientation mode
                    switch (mScreenRotation) { // Handle device rotation (landscape, portrait)
                        case Surface.ROTATION_0:
                            axisX = SensorManager.AXIS_X;
                            axisY = SensorManager.AXIS_Y;
                            break;
    
                        case Surface.ROTATION_90:
                            axisX = SensorManager.AXIS_Y;
                            axisY = SensorManager.AXIS_MINUS_X;
                            break;
    
                        case Surface.ROTATION_180: // not handled by my phone so I can't test
                            axisX = SensorManager.AXIS_MINUS_X;
                            axisY = SensorManager.AXIS_MINUS_Y;
                            break;
    
                        case Surface.ROTATION_270:
                            axisX = SensorManager.AXIS_MINUS_Y;
                            axisY = SensorManager.AXIS_X;
                            break;
    
                        default:
                            break;
                    }
                    SensorManager.remapCoordinateSystem (R, axisX, axisY, outR);
                    SensorManager.getOrientation (outR, gO);
            }
        }
        
        
        userFacing = (float) Math.toDegrees(gO[0]); // Radian to degree
        if(userFacing<0) { userFacing+=360; } // -180;180 to 0;360
        return userFacing;

实际上,当手机面对面时,我能够获得准确的指南40°...

我看到了此链接:https://stackoverflow.com/questions/17979238/android-getOrientation-emportation-azimuth-gets-poluted-when-phone-phone-is-is-is-is-tilted

但是,如果我保持倾斜,结果再次不准确(这是平均水平,所以很正常!)我随时需要指南针...

我认为我将使用TYPE_GYROSCOPE,但并非所有设备都有陀螺仪,因此我需要其他所有设备的解决方案!

希望您能理解我的问题,并为我的英语不好而感到抱歉!(我是法语)


解决方案

好的,因此在iOS上调整应用程序后,我决定检查Android方法是否与我一样好。一个月前,我发布了一个解决方案,这确实错了。我在remapCoordinateSystem上犯了一个巨大的错误:我使用AXIS_XAXIS_Y来获取我的Matrice,并试图用不同的值纠正我的值。正如@hoannguyen所建议的那样,我们只需要使用AXIS_XAXIS_Z和Android处理其余的。

所以这是最终代码。更短,更容易:

    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
        gravity = lowPass(event.values.clone(), gravity);
    }
    else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
        geomagnetic = lowPass(event.values.clone(), geomagnetic);
    }
    
    if (geomagnetic != null && gravity != null) {
        if (SensorManager.getRotationMatrix (R_in, null, gravity, geomagnetic)) {               
            SensorManager.remapCoordinateSystem (R_in, SensorManager.AXIS_X, SensorManager.AXIS_Z, R_out);
            SensorManager.getOrientation (R_out, gO);
        }
    }

要北部磁性,您只需要使用gO[0],例如heading = gO[0]; (谨慎,返回的值在弧度中)

希望它可以在这里有人!

如果通过"朝向",您发现的代码和解决方案都是错误的,这是指设备z坐标的相反方向。对于增强现实,您只会致电

remapCoordinateSystem(inR, AXIS_X, AXIS_Z, outR);

独立于设备方向。然后,呼叫getIrientation()中的方位角给出了相对于磁性北的电话的方向。

这2个调用等同于设备z坐标到世界xy平面的投影,然后计算结果向量的方向。

最新更新