android - 如何让手机走向增强现实?

标签 android math augmented-reality compass-geolocation

可能的重复:Android getOrientation Azimuth gets polluted when phone is tilted


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

在网上搜索后,我非常确定我需要使用 remapCooperativeSystem,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-azimuth-gets-polluted-when-phone-is-tilted

但是如果我保持倾斜,结果又会不准确(这是平均值,所以这是正常的!) 我需要指南针随时工作......

我想我会使用TYPE_GYROSCOPE,但现在并非所有设备都有陀螺仪,所以我需要针对所有其他设备的另一种解决方案!

希望您能理解我的问题,并对我的英语不好表示歉意! (我是法国人)


解决方案

好吧,在 iOS 上调整应用程序后,我决定检查 Android 方法是否和我想象的一样好。一个月前,我发布了一个解决方案,但确实是错误的。我在 remapCooperativeSystem 上犯了一个巨大的错误:我使用 AXIS_XAXIS_Y 来获取我的矩阵,并尝试用不同的值纠正我的值。正如 @HoanNguyen 所建议的,我们只需使用 AXIS_X 和 AXIS_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);

与设备方向无关。然后,调用 getOrientation() 时的方位角给出手机相对于磁北的方向。

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

关于android - 如何让手机走向增强现实?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21452025/

相关文章:

java.lang.ClassNotFoundException : android. 支持.v4.view.TintableBackgroundView

android - Firebase C++ 消息在启动时崩溃

math - 简单不平衡搜索树的平均渐近深度是多少?

java - 安卓/Java : Sigmoid function to update double value

ios - 使用 ARToolkit ios+sdk 进行触摸,将 3d AR 对象旋转 360 度

ios11 - 转换后的 SCN 文件(来自 DAE 文件)未显示在 sceneView 中

android - 为什么 Android 上的 Google Chrome 浏览器呈现我的表格与桌面或 Firefox 不同?

Android:我可以在 TextView 中使用混合格式文本吗

math - 求解递推关系 T(n) = √n T(√n) + n

swift - Scenekit snapshot() 不包括相机曝光设置