Java Android设备物理旋转读数

Java Android设备物理旋转读数,java,c#,android,math,android-sensors,Java,C#,Android,Math,Android Sensors,我试图读出android设备的物理方向,与特定的开始旋转相比较,但无论我使用什么传感器,我似乎都无法从中获得正确的旋转。我按如下方式初始化传感器: mySensorManager.GetDefaultSensor(SensorType.RotationVector); 我已尝试读取SensorChanged事件的“值”,如索引0、1和2上的X、Y、Z。这确实给出了一些随着我旋转设备而改变的数字,但是我似乎不知道如何获得围绕特定轴的旋转值 我正在一台平板电脑上以肖像模式进行开发。尽管平板电脑通常

我试图读出android设备的物理方向,与特定的开始旋转相比较,但无论我使用什么传感器,我似乎都无法从中获得正确的旋转。我按如下方式初始化传感器:

mySensorManager.GetDefaultSensor(SensorType.RotationVector);
我已尝试读取SensorChanged事件的“值”,如索引0、1和2上的X、Y、Z。这确实给出了一些随着我旋转设备而改变的数字,但是我似乎不知道如何获得围绕特定轴的旋转值

我正在一台平板电脑上以肖像模式进行开发。尽管平板电脑通常处于横向模式,但这应该仍然有效。这就是为什么我相信这就是为什么它报告的读数不是简单的0,0,0,而是更像90,0,0

这不是一个容易解释的问题(部分原因是我不确定自己是否完全理解它),因此这是一个更难解决的问题。所以我提出这个问题基本上是希望有人遇到过类似的情况,也许能帮助我

或者也许只是一个3D矢量数学天才,想花几分钟在一个随机的问题上

注意:


如果设备报告的值确实报告了不同的值,这取决于它是手机还是平板电脑设备,我真的希望有一个解决方案来处理这个问题,并在所有设备上输出一个相等的值。尽管任何输入都是值得赞赏的。

因此,经过大量的挖掘和Java代码的移植,我设法使用本文中的代码使其正常工作:

以下是我的SensorChanged方法的最终结果:

    private float[] mGravity;
    private float[] mGeomagnetic;
    public void OnSensorChanged(SensorEvent e)
    {
        if (e.Sensor.Type == SensorType.Accelerometer)
            this.mGravity = e.Values.ToArray();
        if (e.Sensor.Type == SensorType.MagneticField)
            this.mGeomagnetic = e.Values.ToArray();
        if (this.mGravity != null && this.mGeomagnetic != null)
        {
            float[] R = new float[9];
            float[] I = new float[9];
            bool success = SensorManager.GetRotationMatrix(R, I, this.mGravity, this.mGeomagnetic);
            if (success)
            {
                var orientation = new float[3];
                SensorManager.GetOrientation(R, orientation);

                var rotation = new Vector3(orientation[0], orientation[1], orientation[2]);
                this.ReadingReceived?.Invoke(this, rotation);
            }
        }
    }
查看这段代码有点过时,尽管它可能会对您有所帮助。查看传感器读数的“MainActivity”和其中用于角度计算的TimerTask(尽管此处将融合传感器读数而不是旋转矢量应用于3D模型)。