Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 设备摄像机方向,不包括设备横向/纵向方向_Android_Ios_Orientation_Augmented Reality - Fatal编程技术网

Android 设备摄像机方向,不包括设备横向/纵向方向

Android 设备摄像机方向,不包括设备横向/纵向方向,android,ios,orientation,augmented-reality,Android,Ios,Orientation,Augmented Reality,我需要获得前向摄像头的方向,不包括设备方向(横向/纵向)。我试图用核心运动和访问设备的姿态来表示这一点。在这里,我尝试访问Euler角并排除偏航,但是,当旋转设备超过一个Euler角值时,这似乎不起作用。我也在考虑使用方向四元数,但我没有使用它们的经验。我需要以可序列化的方式获取这些信息,因为我以后需要确定其他设备的摄像头是否指向同一方向(该设备可能是iOS或Android) 重申:如果用户将手机摄像头(主摄像头不是自拍摄像头)指向自由女神像,那么无论用户手持手机是纵向还是横向,编码此信息的最佳

我需要获得前向摄像头的方向,不包括设备方向(横向/纵向)。我试图用核心运动和访问设备的姿态来表示这一点。在这里,我尝试访问Euler角并排除偏航,但是,当旋转设备超过一个Euler角值时,这似乎不起作用。我也在考虑使用方向四元数,但我没有使用它们的经验。我需要以可序列化的方式获取这些信息,因为我以后需要确定其他设备的摄像头是否指向同一方向(该设备可能是iOS或Android)


重申:如果用户将手机摄像头(主摄像头不是自拍摄像头)指向自由女神像,那么无论用户手持手机是纵向还是横向,编码此信息的最佳方式是什么,这样,如果另一个用户在同一个位置,他会知道他的相机指向哪个方向

共有4种类型。一种是不推荐的:

  • 公共静态最终整数方向_未定义=0
  • 公共静态最终整数方向_纵向=1
  • 公共静态最终整数方向\u横向=2:
  • @不推荐使用的公共静态最终整数方向_SQUARE=3 你可以用英语学习

    val orientation: Int = resources.configuration.orientation
    
    如果您想了解特定的角度和位置,您应该将传感器服务与
    this.sensorManager=getSystemService(Context.Sensor\u service)一起用作传感器管理器

    和准确的位置

    sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR)?。让{this.rotationVector=it}

    这个类也有不同的特性,比如

    TYPE_ACCELEROMETER
    
    测量在所有三个物理轴(x、y和z)上施加到设备上的加速度,单位为m/s2,包括重力

    运动检测(抖动、倾斜等)

    测量在所有三个物理轴(x、y、z)上施加到设备上的重力,单位为m/s2

    运动检测(抖动、倾斜等)

    测量设备绕三个物理轴(x、y和z)的旋转速率(以rad/s为单位)

    旋转检测(旋转、转弯等)

    在没有重力的情况下,测量在所有三个物理轴(x、y和z)上施加到设备上的加速度,单位为m/s2

    沿单轴监测加速度

    TYPE_ROTATION_VECTOR
    
    通过提供设备旋转矢量的三个元素来测量设备的方向


    运动检测和旋转检测。

    我相信为了实现这一点,您可以使用
    CLLocation
    。 由于您的主要目标是找到电话指向的基点,因此您可以执行以下操作:

    fun locationManager(umanager:CLLocationManager,didUpdateHeading:CLHeading){
    让角度=newHeading.trueHeading.toRadians//从度转换为弧度
    //请随意使用此信息
    }
    
    如下列文件所述:

    真航向是该矢量与从同一点开始但指向正北的矢量之间的角度。 如果你的手机正好指向正北,你会得到0度的航向,如果它指向东方,你会得到90度等等

    现在,如上所述,设备方向可能会导致一些问题:

    不幸的是,如果用户将设备定向到横向模式,报告的标题将不正确,或者至少在用户看来不正确。当你在本书后面看到增强现实接口时,这将变得特别重要;此类界面通常以横向左侧模式查看

    但是!此问题有一个解决方案:

    您可以使用类似这样的方法检索要查找的标题:

    -(浮动)磁加载:(浮动)航向
    fromOrientation:(UIDeviceOrientation)方向{
    航向=航向;
    开关(方向){1
    案例UIDeviceOrientation纵向:
    打破
    案例UIDeviceOrientation肖像向上向下:
    真航向=真航向+180.0f;
    打破
    案例UIDeviceOrientation和scapeLeft:
    真航向=真航向+90.0f;
    打破
    案例UIDeviceOrientation和scapeRight:
    真航向=真航向-90.0f;
    打破
    违约:
    打破
    }
    同时(realHeading>360.0f){
    realHeading=realHeading-360;
    }
    返回标题;
    }
    
    很抱歉使用了不同的语言(Swift-Objective C),但为了充分理解问题并找到完整的解决方案,我建议阅读以下来源:


    希望这有帮助!让我知道。

    在安卓系统中,我使用setRotation()方法损坏相机。

    setRotation(camera, parameters, requestedCameraId);
    
    private void setRotation(Camera camera, Camera.Parameters parameters, int cameraId) {
        WindowManager windowManager =
                (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
        int degrees = 0;
    
        //get current display rotation
        int rotation = windowManager.getDefaultDisplay().getRotation();
    
        switch (rotation) {
            case Surface.ROTATION_0:
                degrees = 0;
                break;
            case Surface.ROTATION_90:
                degrees = 90;
                break;
            case Surface.ROTATION_180:
                degrees = 180;
                break;
            case Surface.ROTATION_270:
                degrees = 270;
                break;
            default:
                Log.e(TAG, "Bad rotation value: " + rotation);
        }
    
        CameraInfo cameraInfo = new CameraInfo();
        Camera.getCameraInfo(cameraId, cameraInfo);
    
        int angle;
        int displayAngle;
        if (cameraInfo.facing == CameraInfo.CAMERA_FACING_FRONT) {
            angle = (cameraInfo.orientation + degrees) % 360;
            displayAngle = (360 - angle) % 360; // compensate for it being mirrored
        } else {  // back-facing
            angle = (cameraInfo.orientation - degrees + 360) % 360;
            displayAngle = angle;
        }
    
        // This corresponds to the rotation constants.
        // mRotation = angle / 90;
    
        camera.setDisplayOrientation(displayAngle);
        parameters.setRotation(angle);
    }
    

    我希望这对您有用。

    在哪里可以获得设备的航向和角度。。。如果我没弄错的话,这根本不能回答这个问题,横向左->
    -90.0f
    和横向右->
    +90.0f
    TYPE_LINEAR_ACCELERATION
    
    TYPE_ROTATION_VECTOR
    
    setRotation(camera, parameters, requestedCameraId);
    
    private void setRotation(Camera camera, Camera.Parameters parameters, int cameraId) {
        WindowManager windowManager =
                (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
        int degrees = 0;
    
        //get current display rotation
        int rotation = windowManager.getDefaultDisplay().getRotation();
    
        switch (rotation) {
            case Surface.ROTATION_0:
                degrees = 0;
                break;
            case Surface.ROTATION_90:
                degrees = 90;
                break;
            case Surface.ROTATION_180:
                degrees = 180;
                break;
            case Surface.ROTATION_270:
                degrees = 270;
                break;
            default:
                Log.e(TAG, "Bad rotation value: " + rotation);
        }
    
        CameraInfo cameraInfo = new CameraInfo();
        Camera.getCameraInfo(cameraId, cameraInfo);
    
        int angle;
        int displayAngle;
        if (cameraInfo.facing == CameraInfo.CAMERA_FACING_FRONT) {
            angle = (cameraInfo.orientation + degrees) % 360;
            displayAngle = (360 - angle) % 360; // compensate for it being mirrored
        } else {  // back-facing
            angle = (cameraInfo.orientation - degrees + 360) % 360;
            displayAngle = angle;
        }
    
        // This corresponds to the rotation constants.
        // mRotation = angle / 90;
    
        camera.setDisplayOrientation(displayAngle);
        parameters.setRotation(angle);
    }