使用Xamarin.Essentials Orientation Sensor模仿Android相机的倾斜角度

问题描述

我在理解四元数以及如何将其转换为可用的0-360度角度以在相机应用程序中使用时遇到困难。我正在尝试实现类似于我们在本机Android相机应用程序中看到的功能,在该应用程序中,一条“水平”线与当前倾斜角度一起显示。 https://superuser.com/questions/1576964/error-timed-out-while-waiting-for-handshake

我正在从Xamarin.Essentials.OrientationSensor中读取“方向”读数,并以四元数的形式返回。我已经编写了一些函数来从Example photo抓取Euler角度(俯仰,滚动,偏航),但是当我垂直握住设备时(从纵向,顶部朝天花板,屏幕朝向我),这些角度似乎都不从0开始就像他们为“相机”应用所做的一样。我也遵循this answer来获取旋转角度和矢量,但是这些数字对我来说没有任何意义,除非这些计算错误?

所以我要寻找的是仅沿其中一个轴的旋转角度,因此您可以将手机用作水平仪,以查看是否要拍摄直线照片。

这是我到目前为止所有计算的代码,我在OpenTK.Quaternion调用中使用ToAxisAngle()命名空间。

    private void OrientationSensorOnReadingChanged(object sender,OrientationSensorChangedEventArgs e)
    {

        var q = new Quaternion(e.Reading.Orientation.X,e.Reading.Orientation.Y,e.Reading.Orientation.Z,e.Reading.Orientation.W);
        
        q.ToAxisAngle(out var axis,out var angle);
        
        ToEulerAngles(q,out var roll,out var pitch,out var yaw);

        var ax = q.X / Math.Sin(Math.Acos(q.W));
        var ay = q.Y / Math.Sin(Math.Acos(q.W));
        var az = q.Z / Math.Sin(Math.Acos(q.W));
        var degrees = Math.Acos(q.W) * 2;

        _gyroLabel.Text = "???";
    }

    private void ToEulerAngles(Quaternion quat,out double myRoll,out double myPitch,out double myYaw)
    {
        myRoll = RadiansToDegrees(Math.Atan2(2 * (quat.Y * quat.W - quat.X * quat.Z),1 - 2 * quat.Y * quat.Y - 2 * quat.Z * quat.Z));
        myPitch = RadiansToDegrees(Math.Atan2(2 * (quat.X * quat.W + quat.Y * quat.Z),1 - 2 * quat.X * quat.X - 2 * quat.Z * quat.Z));
        myYaw = RadiansToDegrees(Math.Asin(2 * quat.X * quat.Y + 2 * quat.W * quat.Z));
    }

    private double RadiansToDegrees(double rads)
    {
        return (180 / Math.PI) * rads;
    }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...